Convert hyperoptloss resolver to static loader
This commit is contained in:
		| @@ -66,7 +66,7 @@ class Hyperopt: | |||||||
|  |  | ||||||
|         self.custom_hyperopt = HyperOptResolver.load_hyperopt(self.config) |         self.custom_hyperopt = HyperOptResolver.load_hyperopt(self.config) | ||||||
|  |  | ||||||
|         self.custom_hyperoptloss = HyperOptLossResolver(self.config).hyperoptloss |         self.custom_hyperoptloss = HyperOptLossResolver.load_hyperoptloss(self.config) | ||||||
|         self.calculate_loss = self.custom_hyperoptloss.hyperopt_loss_function |         self.calculate_loss = self.custom_hyperoptloss.hyperopt_loss_function | ||||||
|  |  | ||||||
|         self.trials_file = (self.config['user_data_dir'] / |         self.trials_file = (self.config['user_data_dir'] / | ||||||
|   | |||||||
| @@ -77,9 +77,9 @@ class HyperOptLossResolver(IResolver): | |||||||
|     """ |     """ | ||||||
|     This class contains all the logic to load custom hyperopt loss class |     This class contains all the logic to load custom hyperopt loss class | ||||||
|     """ |     """ | ||||||
|     __slots__ = ['hyperoptloss'] |  | ||||||
|  |  | ||||||
|     def __init__(self, config: Dict) -> None: |     @staticmethod | ||||||
|  |     def load_hyperoptloss(config: Dict) -> IHyperOptLoss: | ||||||
|         """ |         """ | ||||||
|         Load the custom class from config parameter |         Load the custom class from config parameter | ||||||
|         :param config: configuration dictionary |         :param config: configuration dictionary | ||||||
| @@ -89,20 +89,21 @@ class HyperOptLossResolver(IResolver): | |||||||
|         # default hyperopt loss |         # default hyperopt loss | ||||||
|         hyperoptloss_name = config.get('hyperopt_loss') or DEFAULT_HYPEROPT_LOSS |         hyperoptloss_name = config.get('hyperopt_loss') or DEFAULT_HYPEROPT_LOSS | ||||||
|  |  | ||||||
|         self.hyperoptloss = self._load_hyperoptloss( |         hyperoptloss = HyperOptLossResolver._load_hyperoptloss( | ||||||
|             hyperoptloss_name, config, extra_dir=config.get('hyperopt_path')) |             hyperoptloss_name, config, extra_dir=config.get('hyperopt_path')) | ||||||
|  |  | ||||||
|         # Assign ticker_interval to be used in hyperopt |         # Assign ticker_interval to be used in hyperopt | ||||||
|         self.hyperoptloss.__class__.ticker_interval = str(config['ticker_interval']) |         hyperoptloss.__class__.ticker_interval = str(config['ticker_interval']) | ||||||
|  |  | ||||||
|         if not hasattr(self.hyperoptloss, 'hyperopt_loss_function'): |         if not hasattr(hyperoptloss, 'hyperopt_loss_function'): | ||||||
|             raise OperationalException( |             raise OperationalException( | ||||||
|                 f"Found HyperoptLoss class {hyperoptloss_name} does not " |                 f"Found HyperoptLoss class {hyperoptloss_name} does not " | ||||||
|                 "implement `hyperopt_loss_function`.") |                 "implement `hyperopt_loss_function`.") | ||||||
|  |         return hyperoptloss | ||||||
|  |  | ||||||
|     def _load_hyperoptloss( |     @staticmethod | ||||||
|             self, hyper_loss_name: str, config: Dict, |     def _load_hyperoptloss(hyper_loss_name: str, config: Dict, | ||||||
|             extra_dir: Optional[str] = None) -> IHyperOptLoss: |                            extra_dir: Optional[str] = None) -> IHyperOptLoss: | ||||||
|         """ |         """ | ||||||
|         Search and loads the specified hyperopt loss class. |         Search and loads the specified hyperopt loss class. | ||||||
|         :param hyper_loss_name: name of the module to import |         :param hyper_loss_name: name of the module to import | ||||||
| @@ -112,11 +113,12 @@ class HyperOptLossResolver(IResolver): | |||||||
|         """ |         """ | ||||||
|         current_path = Path(__file__).parent.parent.joinpath('optimize').resolve() |         current_path = Path(__file__).parent.parent.joinpath('optimize').resolve() | ||||||
|  |  | ||||||
|         abs_paths = self.build_search_paths(config, current_path=current_path, |         abs_paths = IResolver.build_search_paths(config, current_path=current_path, | ||||||
|                                             user_subdir=USERPATH_HYPEROPTS, extra_dir=extra_dir) |                                                  user_subdir=USERPATH_HYPEROPTS, | ||||||
|  |                                                  extra_dir=extra_dir) | ||||||
|  |  | ||||||
|         hyperoptloss = self._load_object(paths=abs_paths, object_type=IHyperOptLoss, |         hyperoptloss = IResolver._load_object(paths=abs_paths, object_type=IHyperOptLoss, | ||||||
|                                          object_name=hyper_loss_name) |                                               object_name=hyper_loss_name) | ||||||
|         if hyperoptloss: |         if hyperoptloss: | ||||||
|             return hyperoptloss |             return hyperoptloss | ||||||
|  |  | ||||||
|   | |||||||
| @@ -198,7 +198,7 @@ def test_hyperoptlossresolver(mocker, default_conf, caplog) -> None: | |||||||
|         'freqtrade.resolvers.hyperopt_resolver.HyperOptLossResolver._load_hyperoptloss', |         'freqtrade.resolvers.hyperopt_resolver.HyperOptLossResolver._load_hyperoptloss', | ||||||
|         MagicMock(return_value=hl) |         MagicMock(return_value=hl) | ||||||
|     ) |     ) | ||||||
|     x = HyperOptLossResolver(default_conf).hyperoptloss |     x = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||||
|     assert hasattr(x, "hyperopt_loss_function") |     assert hasattr(x, "hyperopt_loss_function") | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -206,7 +206,7 @@ def test_hyperoptlossresolver_wrongname(mocker, default_conf, caplog) -> None: | |||||||
|     default_conf.update({'hyperopt_loss': "NonExistingLossClass"}) |     default_conf.update({'hyperopt_loss': "NonExistingLossClass"}) | ||||||
|  |  | ||||||
|     with pytest.raises(OperationalException, match=r'Impossible to load HyperoptLoss.*'): |     with pytest.raises(OperationalException, match=r'Impossible to load HyperoptLoss.*'): | ||||||
|         HyperOptLossResolver(default_conf).hyperopt |         HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_start_not_installed(mocker, default_conf, caplog, import_fails) -> None: | def test_start_not_installed(mocker, default_conf, caplog, import_fails) -> None: | ||||||
| @@ -286,7 +286,7 @@ def test_start_filelock(mocker, default_conf, caplog) -> None: | |||||||
|  |  | ||||||
|  |  | ||||||
| def test_loss_calculation_prefer_correct_trade_count(default_conf, hyperopt_results) -> None: | def test_loss_calculation_prefer_correct_trade_count(default_conf, hyperopt_results) -> None: | ||||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss |     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, 600) |     correct = hl.hyperopt_loss_function(hyperopt_results, 600) | ||||||
|     over = hl.hyperopt_loss_function(hyperopt_results, 600 + 100) |     over = hl.hyperopt_loss_function(hyperopt_results, 600 + 100) | ||||||
|     under = hl.hyperopt_loss_function(hyperopt_results, 600 - 100) |     under = hl.hyperopt_loss_function(hyperopt_results, 600 - 100) | ||||||
| @@ -298,7 +298,7 @@ def test_loss_calculation_prefer_shorter_trades(default_conf, hyperopt_results) | |||||||
|     resultsb = hyperopt_results.copy() |     resultsb = hyperopt_results.copy() | ||||||
|     resultsb.loc[1, 'trade_duration'] = 20 |     resultsb.loc[1, 'trade_duration'] = 20 | ||||||
|  |  | ||||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss |     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||||
|     longer = hl.hyperopt_loss_function(hyperopt_results, 100) |     longer = hl.hyperopt_loss_function(hyperopt_results, 100) | ||||||
|     shorter = hl.hyperopt_loss_function(resultsb, 100) |     shorter = hl.hyperopt_loss_function(resultsb, 100) | ||||||
|     assert shorter < longer |     assert shorter < longer | ||||||
| @@ -310,7 +310,7 @@ def test_loss_calculation_has_limited_profit(default_conf, hyperopt_results) -> | |||||||
|     results_under = hyperopt_results.copy() |     results_under = hyperopt_results.copy() | ||||||
|     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 |     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 | ||||||
|  |  | ||||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss |     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, 600) |     correct = hl.hyperopt_loss_function(hyperopt_results, 600) | ||||||
|     over = hl.hyperopt_loss_function(results_over, 600) |     over = hl.hyperopt_loss_function(results_over, 600) | ||||||
|     under = hl.hyperopt_loss_function(results_under, 600) |     under = hl.hyperopt_loss_function(results_under, 600) | ||||||
| @@ -325,7 +325,7 @@ def test_sharpe_loss_prefers_higher_profits(default_conf, hyperopt_results) -> N | |||||||
|     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 |     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 | ||||||
|  |  | ||||||
|     default_conf.update({'hyperopt_loss': 'SharpeHyperOptLoss'}) |     default_conf.update({'hyperopt_loss': 'SharpeHyperOptLoss'}) | ||||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss |     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, len(hyperopt_results), |     correct = hl.hyperopt_loss_function(hyperopt_results, len(hyperopt_results), | ||||||
|                                         datetime(2019, 1, 1), datetime(2019, 5, 1)) |                                         datetime(2019, 1, 1), datetime(2019, 5, 1)) | ||||||
|     over = hl.hyperopt_loss_function(results_over, len(hyperopt_results), |     over = hl.hyperopt_loss_function(results_over, len(hyperopt_results), | ||||||
| @@ -343,7 +343,7 @@ def test_onlyprofit_loss_prefers_higher_profits(default_conf, hyperopt_results) | |||||||
|     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 |     results_under['profit_percent'] = hyperopt_results['profit_percent'] / 2 | ||||||
|  |  | ||||||
|     default_conf.update({'hyperopt_loss': 'OnlyProfitHyperOptLoss'}) |     default_conf.update({'hyperopt_loss': 'OnlyProfitHyperOptLoss'}) | ||||||
|     hl = HyperOptLossResolver(default_conf).hyperoptloss |     hl = HyperOptLossResolver.load_hyperoptloss(default_conf) | ||||||
|     correct = hl.hyperopt_loss_function(hyperopt_results, len(hyperopt_results), |     correct = hl.hyperopt_loss_function(hyperopt_results, len(hyperopt_results), | ||||||
|                                         datetime(2019, 1, 1), datetime(2019, 5, 1)) |                                         datetime(2019, 1, 1), datetime(2019, 5, 1)) | ||||||
|     over = hl.hyperopt_loss_function(results_over, len(hyperopt_results), |     over = hl.hyperopt_loss_function(results_over, len(hyperopt_results), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user