]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor(qav3): cleanup optuna best params persistence handling
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 21 Feb 2025 14:26:07 +0000 (15:26 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 21 Feb 2025 14:26:07 +0000 (15:26 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
ReforceXY/user_data/config-template.json
quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py
quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py

index ab6634552b8586a6fe1f0f9c45c39cddbe09cac0..3af84613e0f35db46be4296da230622171312285 100644 (file)
       "verbose": 1
     },
     "rl_config": {
-      "model_type": "PPO",
+      "model_type": "MaskablePPO",
       "policy_type": "MlpPolicy",
       "model_reward_parameters": {
         "rr": 1,
index d034a2727cd222fe46b1294212af7a2c9a2b5b64..b1f316cbb0739ceb051393954e90b5f80740ed5e 100644 (file)
@@ -286,14 +286,12 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
         self,
         pair: str,
         study: optuna.study.Study,
-        previous_study: optuna.study.Study,
     ) -> None:
-        if self.optuna_study_has_best_params(previous_study):
-            study.enqueue_trial(previous_study.best_params)
-        elif self.__optuna_hp_params.get(pair):
+        study_namespace = "hp"
+        if self.__optuna_hp_params.get(pair):
             study.enqueue_trial(self.__optuna_hp_params[pair])
-        elif self.optuna_load_best_params(pair, "hp"):
-            study.enqueue_trial(self.optuna_load_best_params(pair, "hp"))
+        elif self.optuna_load_best_params(pair, study_namespace):
+            study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace))
 
     def optuna_hp_optimize(
         self,
@@ -305,10 +303,10 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
         y_test,
         test_weights,
     ) -> tuple[Dict | None, float | None]:
-        study_name = f"hp-{pair}"
+        study_namespace = "hp"
+        study_name = f"{study_namespace}-{pair}"
         storage = self.optuna_storage(pair)
         pruner = optuna.pruners.HyperbandPruner()
-        previous_study = self.optuna_study_load(study_name, storage)
         self.optuna_study_delete(study_name, storage)
         study = optuna.create_study(
             study_name=study_name,
@@ -320,7 +318,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        self.optuna_hp_enqueue_previous_best_trial(pair, study, previous_study)
+        self.optuna_hp_enqueue_previous_best_trial(pair, study)
         start = time.time()
         try:
             study.optimize(
@@ -340,30 +338,30 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
                 gc_after_trial=True,
             )
         except Exception as e:
-            logger.error(f"Optuna hp hyperopt failed: {e}", exc_info=True)
+            logger.error(
+                f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True
+            )
             return None, None
         time_spent = time.time() - start
-        logger.info(f"Optuna hp hyperopt done ({time_spent:.2f} secs)")
+        logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)")
 
         params = study.best_params
-        self.optuna_save_best_params(pair, "hp", params)
+        self.optuna_save_best_params(pair, study_namespace, params)
         # log params
         for key, value in {"rmse": study.best_value, **params}.items():
-            logger.info(f"Optuna hp hyperopt | {key:>20s} : {value}")
+            logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}")
         return params, study.best_value
 
     def optuna_period_enqueue_previous_best_trial(
         self,
         pair: str,
         study: optuna.study.Study,
-        previous_study: optuna.study.Study,
     ) -> None:
-        if self.optuna_study_has_best_params(previous_study):
-            study.enqueue_trial(previous_study.best_params)
-        elif self.__optuna_period_params.get(pair):
+        study_namespace = "period"
+        if self.__optuna_period_params.get(pair):
             study.enqueue_trial(self.__optuna_period_params[pair])
-        elif self.optuna_load_best_params(pair, "period"):
-            study.enqueue_trial(self.optuna_load_best_params(pair, "period"))
+        elif self.optuna_load_best_params(pair, study_namespace):
+            study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace))
 
     def optuna_period_optimize(
         self,
@@ -376,10 +374,10 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
         test_weights,
         model_training_parameters,
     ) -> tuple[Dict | None, float | None]:
-        study_name = f"period-{pair}"
+        study_namespace = "period"
+        study_name = f"{study_namespace}-{pair}"
         storage = self.optuna_storage(pair)
         pruner = optuna.pruners.HyperbandPruner()
-        previous_study = self.optuna_study_load(study_name, storage)
         self.optuna_study_delete(study_name, storage)
         study = optuna.create_study(
             study_name=study_name,
@@ -391,7 +389,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        self.optuna_period_enqueue_previous_best_trial(pair, study, previous_study)
+        self.optuna_period_enqueue_previous_best_trial(pair, study)
         start = time.time()
         try:
             study.optimize(
@@ -414,16 +412,18 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
                 gc_after_trial=True,
             )
         except Exception as e:
-            logger.error(f"Optuna period hyperopt failed: {e}", exc_info=True)
+            logger.error(
+                f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True
+            )
             return None, None
         time_spent = time.time() - start
-        logger.info(f"Optuna period hyperopt done ({time_spent:.2f} secs)")
+        logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)")
 
         params = study.best_params
-        self.optuna_save_best_params(pair, "period", params)
+        self.optuna_save_best_params(pair, study_namespace, params)
         # log params
         for key, value in {"rmse": study.best_value, **params}.items():
-            logger.info(f"Optuna period hyperopt | {key:>20s} : {value}")
+            logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}")
         return params, study.best_value
 
     def optuna_save_best_params(
index 36db9bdb4d12cd251d92d6f7975dcdf44ac061fd..caff5fc2fd2f611e8bf37a29394344441799cc02 100644 (file)
@@ -287,14 +287,12 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
         self,
         pair: str,
         study: optuna.study.Study,
-        previous_study: optuna.study.Study,
     ) -> None:
-        if self.optuna_study_has_best_params(previous_study):
-            study.enqueue_trial(previous_study.best_params)
-        elif self.__optuna_hp_params.get(pair):
+        study_namespace = "hp"
+        if self.__optuna_hp_params.get(pair):
             study.enqueue_trial(self.__optuna_hp_params[pair])
-        elif self.optuna_load_best_params(pair, "hp"):
-            study.enqueue_trial(self.optuna_load_best_params(pair, "hp"))
+        elif self.optuna_load_best_params(pair, study_namespace):
+            study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace))
 
     def optuna_hp_optimize(
         self,
@@ -306,10 +304,10 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
         y_test,
         test_weights,
     ) -> tuple[Dict | None, float | None]:
-        study_name = f"hp-{pair}"
+        study_namespace = "hp"
+        study_name = f"{study_namespace}-{pair}"
         storage = self.optuna_storage(pair)
         pruner = optuna.pruners.HyperbandPruner()
-        previous_study = self.optuna_study_load(study_name, storage)
         self.optuna_study_delete(study_name, storage)
         study = optuna.create_study(
             study_name=study_name,
@@ -321,7 +319,7 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        self.optuna_hp_enqueue_previous_best_trial(pair, study, previous_study)
+        self.optuna_hp_enqueue_previous_best_trial(pair, study)
         start = time.time()
         try:
             study.optimize(
@@ -341,30 +339,30 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
                 gc_after_trial=True,
             )
         except Exception as e:
-            logger.error(f"Optuna hp hyperopt failed: {e}", exc_info=True)
+            logger.error(
+                f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True
+            )
             return None, None
         time_spent = time.time() - start
-        logger.info(f"Optuna hp hyperopt done ({time_spent:.2f} secs)")
+        logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)")
 
         params = study.best_params
-        self.optuna_save_best_params(pair, "hp", params)
+        self.optuna_save_best_params(pair, study_namespace, params)
         # log params
         for key, value in {"rmse": study.best_value, **params}.items():
-            logger.info(f"Optuna hp hyperopt | {key:>20s} : {value}")
+            logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}")
         return params, study.best_value
 
     def optuna_period_enqueue_previous_best_trial(
         self,
         pair: str,
         study: optuna.study.Study,
-        previous_study: optuna.study.Study,
     ) -> None:
-        if self.optuna_study_has_best_params(previous_study):
-            study.enqueue_trial(previous_study.best_params)
-        elif self.__optuna_period_params.get(pair):
+        study_namespace = "period"
+        if self.__optuna_period_params.get(pair):
             study.enqueue_trial(self.__optuna_period_params[pair])
-        elif self.optuna_load_best_params(pair, "period"):
-            study.enqueue_trial(self.optuna_load_best_params(pair, "period"))
+        elif self.optuna_load_best_params(pair, study_namespace):
+            study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace))
 
     def optuna_period_optimize(
         self,
@@ -377,10 +375,10 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
         test_weights,
         model_training_parameters,
     ) -> tuple[Dict | None, float | None]:
-        study_name = f"period-{pair}"
+        study_namespace = "period"
+        study_name = f"{study_namespace}-{pair}"
         storage = self.optuna_storage(pair)
         pruner = optuna.pruners.HyperbandPruner()
-        previous_study = self.optuna_study_load(study_name, storage)
         self.optuna_study_delete(study_name, storage)
         study = optuna.create_study(
             study_name=study_name,
@@ -392,7 +390,7 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        self.optuna_period_enqueue_previous_best_trial(pair, study, previous_study)
+        self.optuna_period_enqueue_previous_best_trial(pair, study)
         start = time.time()
         try:
             study.optimize(
@@ -415,16 +413,18 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
                 gc_after_trial=True,
             )
         except Exception as e:
-            logger.error(f"Optuna period hyperopt failed: {e}", exc_info=True)
+            logger.error(
+                f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True
+            )
             return None, None
         time_spent = time.time() - start
-        logger.info(f"Optuna period hyperopt done ({time_spent:.2f} secs)")
+        logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)")
 
         params = study.best_params
-        self.optuna_save_best_params(pair, "period", params)
+        self.optuna_save_best_params(pair, study_namespace, params)
         # log params
         for key, value in {"rmse": study.best_value, **params}.items():
-            logger.info(f"Optuna period hyperopt | {key:>20s} : {value}")
+            logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}")
         return params, study.best_value
 
     def optuna_save_best_params(