]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
fix(qav3): handle more optuna loaded study corner cases
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 15 Feb 2025 20:54:32 +0000 (21:54 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 15 Feb 2025 20:54:32 +0000 (21:54 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py
quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py

index 0718c847ecbc8c426d101c891d5985f5fce45a2a..8820b80fb284a90abf35ba47e06eebf945e30e89 100644 (file)
@@ -285,7 +285,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        if previous_study and hasattr(previous_study, "best_params"):
+        if self.optuna_study_has_best_params(previous_study):
             study.enqueue_trial(previous_study.best_params)
         start = time.time()
         try:
@@ -342,7 +342,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        if previous_study and hasattr(previous_study, "best_params"):
+        if self.optuna_study_has_best_params(previous_study):
             study.enqueue_trial(previous_study.best_params)
         start = time.time()
         try:
@@ -390,6 +390,20 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
             pass
         return previous_study
 
+    def optuna_study_has_best_params(self, study: optuna.study.Study | None) -> bool:
+        if not study:
+            return False
+        try:
+            # Check if there are completed trials
+            if len(study.trials) == 0:
+                return False
+
+            # Check if best_params exists (raises ValueError if no trials succeeded)
+            _ = study.best_params
+            return True
+        except ValueError:
+            return False
+
 
 def log_sum_exp_min_max_pred(
     pred_df: pd.DataFrame, fit_live_predictions_candles: int, label_period_candles: int
index 3493740658507a305684e301639c04aeb33764c0..fa3fedfede36642d1f990be516e5fffc95639c76 100644 (file)
@@ -286,7 +286,7 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        if previous_study and hasattr(previous_study, "best_params"):
+        if self.optuna_study_has_best_params(previous_study):
             study.enqueue_trial(previous_study.best_params)
         start = time.time()
         try:
@@ -343,7 +343,7 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
             direction=optuna.study.StudyDirection.MINIMIZE,
             storage=storage,
         )
-        if previous_study and hasattr(previous_study, "best_params"):
+        if self.optuna_study_has_best_params(previous_study):
             study.enqueue_trial(previous_study.best_params)
         start = time.time()
         try:
@@ -391,6 +391,20 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
             pass
         return previous_study
 
+    def optuna_study_has_best_params(self, study: optuna.study.Study | None) -> bool:
+        if not study:
+            return False
+        try:
+            # Check if there are completed trials
+            if len(study.trials) == 0:
+                return False
+
+            # Check if best_params exists (raises ValueError if no trials succeeded)
+            _ = study.best_params
+            return True
+        except ValueError:
+            return False
+
 
 def log_sum_exp_min_max_pred(
     pred_df: pd.DataFrame, fit_live_predictions_candles: int, label_period_candles: int