From 950ffb49e5f87b7f1fc9a604f17e1487f666eb8c Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 9 Mar 2025 11:38:41 +0100 Subject: [PATCH] feat(qav3): add optuna hyperopt tunables MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- ReforceXY/user_data/config-template.json | 2 +- ReforceXY/user_data/freqaimodels/ReforceXY.py | 2 +- .../user_data/strategies/RLAgentStrategy.py | 33 ++++++++++++++++++- .../LightGBMRegressorQuickAdapterV35.py | 12 ++++--- .../XGBoostRegressorQuickAdapterV35.py | 12 ++++--- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/ReforceXY/user_data/config-template.json b/ReforceXY/user_data/config-template.json index 15237b0..35433b3 100644 --- a/ReforceXY/user_data/config-template.json +++ b/ReforceXY/user_data/config-template.json @@ -16,7 +16,7 @@ "minimal_roi": { "0": 0.03 }, // Take_profit exit value used with force_actions - "stoploss": -0.03, // Stop_loss exit value used with force_actions + "stoploss": -0.02, // Stop_loss exit value used with force_actions "unfilledtimeout": { "entry": 10, "exit": 10, diff --git a/ReforceXY/user_data/freqaimodels/ReforceXY.py b/ReforceXY/user_data/freqaimodels/ReforceXY.py index 5d04f27..7fc04ec 100644 --- a/ReforceXY/user_data/freqaimodels/ReforceXY.py +++ b/ReforceXY/user_data/freqaimodels/ReforceXY.py @@ -65,7 +65,7 @@ class ReforceXY(BaseReinforcementLearningModel): "freqaimodel": "ReforceXY", "strategy": "RLAgentStrategy", "minimal_roi": {"0": 0.03}, // Take_profit exit value used with force_actions - "stoploss": -0.03, // Stop_loss exit value used with force_actions + "stoploss": -0.02, // Stop_loss exit value used with force_actions ... "freqai": { ... diff --git a/ReforceXY/user_data/strategies/RLAgentStrategy.py b/ReforceXY/user_data/strategies/RLAgentStrategy.py index 38053d7..99a4b9c 100644 --- a/ReforceXY/user_data/strategies/RLAgentStrategy.py +++ b/ReforceXY/user_data/strategies/RLAgentStrategy.py @@ -20,10 +20,41 @@ class RLAgentStrategy(IStrategy): minimal_roi = {"0": 0.03} process_only_new_candles = True - stoploss = -0.03 + + stoploss = -0.02 + # Trailing stop: + trailing_stop = True + trailing_stop_positive = 0.0099 + trailing_stop_positive_offset = 0.01 + trailing_only_offset_is_reached = True + use_exit_signal = True + startup_candle_count: int = 300 + # @property + # def protections(self): + # fit_live_predictions_candles = self.freqai_info.get( + # "fit_live_predictions_candles", 100 + # ) + # return [ + # {"method": "CooldownPeriod", "stop_duration_candles": 4}, + # { + # "method": "MaxDrawdown", + # "lookback_period_candles": 48, + # "trade_limit": 20, + # "stop_duration_candles": 4, + # "max_allowed_drawdown": 0.2, + # }, + # { + # "method": "StoplossGuard", + # "lookback_period_candles": int(fit_live_predictions_candles / 2), + # "trade_limit": 1, + # "stop_duration_candles": int(fit_live_predictions_candles / 2), + # "only_per_pair": True, + # }, + # ] + @property def can_short(self): return self.is_short_allowed() diff --git a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py index 5bb6ebc..3107ae7 100644 --- a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py @@ -308,7 +308,8 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): study_name = f"{identifier}-{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - self.optuna_study_delete(study_name, storage) + if self.__optuna_config.get("continuous", True): + self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, sampler=optuna.samplers.TPESampler( @@ -319,7 +320,8 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_hp_enqueue_previous_best_trial(pair, study) + if self.__optuna_config.get("warm_start", True): + self.optuna_hp_enqueue_previous_best_trial(pair, study) logger.info(f"Optuna {study_namespace} hyperopt started") start = time.time() try: @@ -384,7 +386,8 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): study_name = f"{identifier}-{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - self.optuna_study_delete(study_name, storage) + if self.__optuna_config.get("continuous", True): + self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, sampler=optuna.samplers.TPESampler( @@ -395,7 +398,8 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_period_enqueue_previous_best_trial(pair, study) + if self.__optuna_config.get("warm_start", True): + self.optuna_period_enqueue_previous_best_trial(pair, study) logger.info(f"Optuna {study_namespace} hyperopt started") start = time.time() try: diff --git a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py index 010a3b9..3b94dfa 100644 --- a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py @@ -309,7 +309,8 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): study_name = f"{identifier}-{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - self.optuna_study_delete(study_name, storage) + if self.__optuna_config.get("continuous", True): + self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, sampler=optuna.samplers.TPESampler( @@ -320,7 +321,8 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_hp_enqueue_previous_best_trial(pair, study) + if self.__optuna_config.get("warm_start", True): + self.optuna_hp_enqueue_previous_best_trial(pair, study) logger.info(f"Optuna {study_namespace} hyperopt started") start = time.time() try: @@ -385,7 +387,8 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): study_name = f"{identifier}-{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - self.optuna_study_delete(study_name, storage) + if self.__optuna_config.get("continuous", True): + self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, sampler=optuna.samplers.TPESampler( @@ -396,7 +399,8 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_period_enqueue_previous_best_trial(pair, study) + if self.__optuna_config.get("warm_start", True): + self.optuna_period_enqueue_previous_best_trial(pair, study) logger.info(f"Optuna {study_namespace} hyperopt started") start = time.time() try: -- 2.43.0