]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
fix(qav3): ensure the label period is chosen over all possible windows
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 11 Mar 2025 14:52:50 +0000 (15:52 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 11 Mar 2025 14:52:50 +0000 (15:52 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py
quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py
quickadapter/user_data/strategies/QuickAdapterV3.py

index 156bb91b253dfd5d9802b6d68b2e3c1d1d41c0c1..a10e1b075c2cccb2d5bdb3fdbba10ba0b6fef724 100644 (file)
@@ -8,6 +8,7 @@ import time
 from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel
 from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
 import pandas as pd
+import numpy as np
 import scipy as spy
 import optuna
 import sklearn
@@ -595,14 +596,16 @@ def period_objective(
         max_label_period_candles,
         step=candles_step,
     )
-    y_test_length = len(y_test)
-    y_pred_length = len(y_pred)
-    y_test = y_test.tail(y_test_length - (y_test_length % label_period_candles))
-    y_pred = y_pred[-(y_pred_length - (y_pred_length % label_period_candles)) :]
-    y_test = y_test.to_numpy().reshape(
-        len(y_test) // label_period_candles, label_period_candles
-    )
-    y_pred = y_pred.reshape(len(y_pred) // label_period_candles, label_period_candles)
+    y_test_windows = [
+        y_test[i : i + label_period_candles]
+        for i in range(0, len(y_test) - label_period_candles + 1)
+    ]
+    y_pred_windows = [
+        y_pred[i : i + label_period_candles]
+        for i in range(0, len(y_pred) - label_period_candles + 1)
+    ]
+    y_test = np.array([window.mean() for window in y_test_windows])
+    y_pred = np.array([window.mean() for window in y_pred_windows])
 
     error = sklearn.metrics.root_mean_squared_error(y_test, y_pred)
 
index 3b94dfaa4058d71e817f910395e3e83d21ba8857..4a274c697352065a11b1cd032b4ebbc10a148632 100644 (file)
@@ -8,6 +8,7 @@ import time
 from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel
 from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
 import pandas as pd
+import numpy as np
 import scipy as spy
 import optuna
 import sklearn
@@ -603,14 +604,16 @@ def period_objective(
         max_label_period_candles,
         step=candles_step,
     )
-    y_test_length = len(y_test)
-    y_pred_length = len(y_pred)
-    y_test = y_test.tail(y_test_length - (y_test_length % label_period_candles))
-    y_pred = y_pred[-(y_pred_length - (y_pred_length % label_period_candles)) :]
-    y_test = y_test.to_numpy().reshape(
-        len(y_test) // label_period_candles, label_period_candles
-    )
-    y_pred = y_pred.reshape(len(y_pred) // label_period_candles, label_period_candles)
+    y_test_windows = [
+        y_test[i : i + label_period_candles]
+        for i in range(0, len(y_test) - label_period_candles + 1)
+    ]
+    y_pred_windows = [
+        y_pred[i : i + label_period_candles]
+        for i in range(0, len(y_pred) - label_period_candles + 1)
+    ]
+    y_test = np.array([window.mean() for window in y_test_windows])
+    y_pred = np.array([window.mean() for window in y_pred_windows])
 
     error = sklearn.metrics.root_mean_squared_error(y_test, y_pred)
 
index 28836da46fc70ba2a07a3907f589ac6579fa5b8c..a830514116ed3489f095aaaff80273e4fbd625a9 100644 (file)
@@ -390,13 +390,10 @@ class QuickAdapterV3(IStrategy):
         max_open_trades = self.config.get("max_open_trades")
         if max_open_trades < 0:
             return -1
-        elif max_open_trades == 0 or max_open_trades == 1:
+        if self.is_short_allowed():
+            return (max_open_trades + 1) // 2
+        else:
             return max_open_trades
-        elif max_open_trades >= 2:
-            if self.is_short_allowed():
-                return max_open_trades // 2
-            else:
-                return max_open_trades
 
     def is_short_allowed(self) -> bool:
         trading_mode = self.config.get("trading_mode")
@@ -495,12 +492,13 @@ def ZLEWMA(dataframe: DataFrame, timeperiod: int) -> Series:
 def zlewma(series: Series, timeperiod: int) -> Series:
     """
     Calculate the ZLEWMA (Zero Lag Exponential Weighted Moving Average) of a series.
+    Formula: ZLEWMA = EWMA(2*price - EWMA(price, N), N).
     :param series: Series The original series
     :param timeperiod: int The period to look back
     :return: Series The ZLEWMA series
     """
-    lag = int(round((timeperiod - 1) / 2))
-    series = series + (series - series.shift(lag))
+    ewma = series.ewm(span=timeperiod).mean()
+    series = 2 * series - ewma
     return series.ewm(span=timeperiod).mean()