]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor(qav3): cleanup smoothing tunables handling
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 4 Mar 2025 08:27:54 +0000 (09:27 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 4 Mar 2025 08:27:54 +0000 (09:27 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
ReforceXY/user_data/freqaimodels/ReforceXY.py
quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py
quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py
quickadapter/user_data/strategies/QuickAdapterV3.py

index fa53dbf1f8890325339090432b20ba9e13ac513c..e6559be9f99f38fbba5ca4ea40261e16f85bed6b 100644 (file)
@@ -273,7 +273,7 @@ class ReforceXY(BaseReinforcementLearningModel):
             no_improvement_callback = StopTrainingOnNoModelImprovement(
                 max_no_improvement_evals=self.max_no_improvement_evals,
                 min_evals=self.min_evals,
-                verbose=1,
+                verbose=verbose,
             )
 
         if self.activate_tensorboard:
index cced5a24a1c276bac23417a72f7108a13d858e42..5fcd4d1d925fbf37f99867824e460b5d0b400e3b 100644 (file)
@@ -274,22 +274,13 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
         prediction_thresholds_smoothing = self.freqai_info.get(
             "prediction_thresholds_smoothing", "mean"
         )
-        if prediction_thresholds_smoothing == "quantile":
-            return self.quantile_min_max_pred(
-                pred_df, fit_live_predictions_candles, label_period_candles
-            )
-        elif prediction_thresholds_smoothing == "mean":
-            return mean_min_max_pred(
-                pred_df, fit_live_predictions_candles, label_period_candles
-            )
-        elif prediction_thresholds_smoothing == "median":
-            return median_min_max_pred(
-                pred_df, fit_live_predictions_candles, label_period_candles
-            )
-        else:
-            raise ValueError(
-                f"Invalid prediction_thresholds_smoothing value: '{prediction_thresholds_smoothing}'"
-            )
+        return {
+            "quantile": self.quantile_min_max_pred,
+            "mean": mean_min_max_pred,
+            "median": median_min_max_pred,
+        }[prediction_thresholds_smoothing](
+            pred_df, fit_live_predictions_candles, label_period_candles
+        )
 
     def optuna_hp_enqueue_previous_best_trial(
         self,
index be7ad108e01b90c7ff2cf2ec98b0cb0000d98144..bdb9bdc081b1f1f79cb79e573fd16a0e9fd1d90b 100644 (file)
@@ -275,22 +275,13 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
         prediction_thresholds_smoothing = self.freqai_info.get(
             "prediction_thresholds_smoothing", "mean"
         )
-        if prediction_thresholds_smoothing == "quantile":
-            return self.quantile_min_max_pred(
-                pred_df, fit_live_predictions_candles, label_period_candles
-            )
-        elif prediction_thresholds_smoothing == "mean":
-            return mean_min_max_pred(
-                pred_df, fit_live_predictions_candles, label_period_candles
-            )
-        elif prediction_thresholds_smoothing == "median":
-            return median_min_max_pred(
-                pred_df, fit_live_predictions_candles, label_period_candles
-            )
-        else:
-            raise ValueError(
-                f"Invalid prediction_thresholds_smoothing value: '{prediction_thresholds_smoothing}'"
-            )
+        return {
+            "quantile": self.quantile_min_max_pred,
+            "mean": mean_min_max_pred,
+            "median": median_min_max_pred,
+        }[prediction_thresholds_smoothing](
+            pred_df, fit_live_predictions_candles, label_period_candles
+        )
 
     def optuna_hp_enqueue_previous_best_trial(
         self,
index 1c35c6827828df9d0f2fc31fe1d478715197243f..17b03280a7023b1d66756ce4c72072f4bb27c366 100644 (file)
@@ -263,12 +263,7 @@ class QuickAdapterV3(IStrategy):
             dataframe.at[mp, EXTREMA_COLUMN] = 1
         dataframe["minima"] = np.where(dataframe[EXTREMA_COLUMN] == -1, -1, 0)
         dataframe["maxima"] = np.where(dataframe[EXTREMA_COLUMN] == 1, 1, 0)
-        dataframe[EXTREMA_COLUMN] = (
-            dataframe[EXTREMA_COLUMN]
-            .rolling(window=5, win_type="gaussian", center=True)
-            .mean(std=0.5)
-        )
-        return dataframe
+        return self.smooth_extrema(dataframe, EXTREMA_COLUMN, 5)
 
     def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
         dataframe = self.freqai.start(dataframe, metadata, self)
@@ -409,6 +404,30 @@ class QuickAdapterV3(IStrategy):
         else:
             raise ValueError(f"Invalid trading_mode: {trading_mode}")
 
+    def smooth_extrema(
+        self,
+        dataframe: DataFrame,
+        extrema_column: str,
+        window: int,
+        center: bool = True,
+        std: float = 0.5,
+    ) -> DataFrame:
+        extrema_smoothing = self.freqai_info.get("extrema_smoothing", "gaussian")
+        dataframe[extrema_column] = {
+            "gaussian": (
+                dataframe[extrema_column]
+                .rolling(window=window, win_type="gaussian", center=center)
+                .mean(std=std)
+            ),
+            "triang": (
+                dataframe[extrema_column]
+                .rolling(window=window, win_type="triang", center=center)
+                .mean()
+            ),
+            "ewma": dataframe[extrema_column].ewm(span=window).mean(),
+        }[extrema_smoothing]
+        return dataframe
+
 
 def top_percent_change(dataframe: DataFrame, length: int) -> float:
     """