From 2aa3e51f64df4ffd541143839d4f87fa17de541f Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 16 Feb 2025 09:39:13 +0100 Subject: [PATCH] fix(qav3): ensure optuna storage path is sanitized 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 | 3 ++- .../freqaimodels/LightGBMRegressorQuickAdapterV35.py | 7 +++++-- .../freqaimodels/XGBoostRegressorQuickAdapterV35.py | 7 +++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ReforceXY/user_data/config-template.json b/ReforceXY/user_data/config-template.json index 1ea31f6..8e498f1 100644 --- a/ReforceXY/user_data/config-template.json +++ b/ReforceXY/user_data/config-template.json @@ -170,7 +170,7 @@ "max_trade_duration_candles": 96, // Timeout exit value used with force_actions "force_actions": false, // Utilize minimal_roi, stoploss, and max_trade_duration_candles as TP/SL/Timeout in the environment "n_envs": 1, // Number of DummyVecEnv environments - "frame_staking": 0, // Number of VecFrameStack stacks (set to 1 to use) + "frame_staking": 0, // Number of VecFrameStack stacks (set > 1 to use) "lr_schedule": false, // Enable learning rate linear schedule "cr_schedule": false, // Enable clip range linear schedule "max_no_improvement_evals": 0, // Maximum consecutive evaluations without a new best model diff --git a/ReforceXY/user_data/freqaimodels/ReforceXY.py b/ReforceXY/user_data/freqaimodels/ReforceXY.py index 4eb3362..4c1cc2f 100644 --- a/ReforceXY/user_data/freqaimodels/ReforceXY.py +++ b/ReforceXY/user_data/freqaimodels/ReforceXY.py @@ -73,7 +73,7 @@ class ReforceXY(BaseReinforcementLearningModel): "max_trade_duration_candles": 96, // Timeout exit value used with force_actions "force_actions": false, // Utilize minimal_roi, stoploss, and max_trade_duration_candles as TP/SL/Timeout in the environment "n_envs": 1, // Number of DummyVecEnv environments - "frame_staking": 0, // Number of VecFrameStack stacks (set to 1 to use) + "frame_staking": 0, // Number of VecFrameStack stacks (set > 1 to use) "lr_schedule": false, // Enable learning rate linear schedule "cr_schedule": false, // Enable clip range linear schedule "max_no_improvement_evals": 0, // Maximum consecutive evaluations without a new best model @@ -489,6 +489,7 @@ class ReforceXY(BaseReinforcementLearningModel): except KeyboardInterrupt: pass + # FIXME: ensure that best trial params are handled on a per pair basis logger.info("------------ Hyperopt results ------------") logger.info( "Best trial: %s. Score: %s", study.best_trial.number, study.best_trial.value diff --git a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py index 11bdb94..602c870 100644 --- a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py @@ -230,11 +230,14 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): storage_dir = str(dk.full_path) storage_backend = self.__optuna_config.get("storage", "file") if storage_backend == "sqlite": - storage = f"sqlite:///{storage_dir}/optuna-{sanitize_path(dk.pair.split('/')[0])}.sqlite" + sqlite_path = sanitize_path( + f"{storage_dir}/optuna-{dk.pair.split('/')[0]}.sqlite" + ) + storage = f"sqlite:///{sqlite_path}" elif storage_backend == "file": storage = optuna.storages.JournalStorage( optuna.storages.journal.JournalFileBackend( - f"{storage_dir}/optuna-{sanitize_path(dk.pair.split('/')[0])}.log" + sanitize_path(f"{storage_dir}/optuna-{dk.pair.split('/')[0]}.log") ) ) return storage diff --git a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py index fe44dd9..a43d915 100644 --- a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py @@ -231,11 +231,14 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): storage_dir = str(dk.full_path) storage_backend = self.__optuna_config.get("storage", "file") if storage_backend == "sqlite": - storage = f"sqlite:///{storage_dir}/optuna-{sanitize_path(dk.pair.split('/')[0])}.sqlite" + sqlite_path = sanitize_path( + f"{storage_dir}/optuna-{dk.pair.split('/')[0]}.sqlite" + ) + storage = f"sqlite:///{sqlite_path}" elif storage_backend == "file": storage = optuna.storages.JournalStorage( optuna.storages.journal.JournalFileBackend( - f"{storage_dir}/optuna-{sanitize_path(dk.pair.split('/')[0])}.log" + sanitize_path(f"{storage_dir}/optuna-{dk.pair.split('/')[0]}.log") ) ) return storage -- 2.43.0