]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor(qav3): refine prediction min/max API
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 11 Feb 2025 01:06:36 +0000 (02:06 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 11 Feb 2025 01:06:36 +0000 (02:06 +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 fc068138dfe6bda9df47d654bf4b93886cc9e6c1..6208d9c8f683ed86f71b9c391f2a3fa4122c6d6b 100644 (file)
@@ -65,7 +65,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
 
         init_model = self.get_init_model(dk.pair)
 
-        model = LGBMRegressor(**self.model_training_parameters)
+        model = LGBMRegressor(objective="rmse", **self.model_training_parameters)
 
         start = time.time()
         if self.__optuna_hyperopt:
@@ -146,6 +146,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
             sample_weight=train_weights,
             eval_set=eval_set,
             eval_sample_weight=eval_weights,
+            eval_metric="rmse",
             init_model=init_model,
         )
         time_spent = time.time() - start
@@ -191,12 +192,8 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
                 num_candles,
                 label_period_candles,
             )
-            dk.data["extra_returns_per_train"]["&s-maxima_sort_threshold"] = max_pred[
-                "&s-extrema"
-            ]
-            dk.data["extra_returns_per_train"]["&s-minima_sort_threshold"] = min_pred[
-                "&s-extrema"
-            ]
+            dk.data["extra_returns_per_train"]["&s-minima_sort_threshold"] = min_pred
+            dk.data["extra_returns_per_train"]["&s-maxima_sort_threshold"] = max_pred
 
         dk.data["labels_mean"], dk.data["labels_std"] = {}, {}
         for label in dk.label_list + dk.unique_class_list:
@@ -242,18 +239,10 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel):
 def __min_max_pred(
     pred_df: pd.DataFrame, fit_live_predictions_candles: int, label_period_candles: int
 ):
-    local_pred_df = pd.DataFrame()
-    for label in pred_df:
-        if pred_df[label].dtype == object:
-            continue
-        local_pred_df[label] = pred_df[label]
     beta = 10.0
-    min_pred = local_pred_df.tail(label_period_candles).apply(
-        lambda col: smooth_min(col, beta=beta)
-    )
-    max_pred = local_pred_df.tail(label_period_candles).apply(
-        lambda col: smooth_max(col, beta=beta)
-    )
+    extrema = pred_df.tail(label_period_candles)["&s-extrema"]
+    min_pred = smooth_min(extrema, beta=beta)
+    max_pred = smooth_max(extrema, beta=beta)
 
     return min_pred, max_pred
 
@@ -273,7 +262,7 @@ def min_max_pred(
     frequency = fit_live_predictions_candles / label_period_candles
     min_pred = pred_df_sorted.iloc[-int(frequency) :].median()
     max_pred = pred_df_sorted.iloc[: int(frequency)].median()
-    return min_pred, max_pred
+    return min_pred["&s-extrema"], max_pred["&s-extrema"]
 
 
 def objective(
index 9f89034d676347bf92e15a1453924e1dc90ae1a1..6c8948efbe04868d404ef338393b320bd3489c6f 100644 (file)
@@ -65,7 +65,11 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
 
         xgb_model = self.get_init_model(dk.pair)
 
-        model = XGBRegressor(**self.model_training_parameters)
+        model = XGBRegressor(
+            objective="reg:squarederror",
+            eval_metric="rmse",
+            **self.model_training_parameters,
+        )
 
         start = time.time()
         if self.__optuna_hyperopt:
@@ -191,12 +195,8 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
                 num_candles,
                 label_period_candles,
             )
-            dk.data["extra_returns_per_train"]["&s-maxima_sort_threshold"] = max_pred[
-                "&s-extrema"
-            ]
-            dk.data["extra_returns_per_train"]["&s-minima_sort_threshold"] = min_pred[
-                "&s-extrema"
-            ]
+            dk.data["extra_returns_per_train"]["&s-minima_sort_threshold"] = min_pred
+            dk.data["extra_returns_per_train"]["&s-maxima_sort_threshold"] = max_pred
 
         dk.data["labels_mean"], dk.data["labels_std"] = {}, {}
         for label in dk.label_list + dk.unique_class_list:
@@ -242,18 +242,10 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel):
 def __min_max_pred(
     pred_df: pd.DataFrame, fit_live_predictions_candles: int, label_period_candles: int
 ):
-    local_pred_df = pd.DataFrame()
-    for label in pred_df:
-        if pred_df[label].dtype == object:
-            continue
-        local_pred_df[label] = pred_df[label]
     beta = 10.0
-    min_pred = local_pred_df.tail(label_period_candles).apply(
-        lambda col: smooth_min(col, beta=beta)
-    )
-    max_pred = local_pred_df.tail(label_period_candles).apply(
-        lambda col: smooth_max(col, beta=beta)
-    )
+    extrema = pred_df.tail(label_period_candles)["&s-extrema"]
+    min_pred = smooth_min(extrema, beta=beta)
+    max_pred = smooth_max(extrema, beta=beta)
 
     return min_pred, max_pred
 
@@ -273,7 +265,7 @@ def min_max_pred(
     frequency = fit_live_predictions_candles / label_period_candles
     min_pred = pred_df_sorted.iloc[-int(frequency) :].median()
     max_pred = pred_df_sorted.iloc[: int(frequency)].median()
-    return min_pred, max_pred
+    return min_pred["&s-extrema"], max_pred["&s-extrema"]
 
 
 def objective(