From: Jérôme Benoit Date: Tue, 11 Mar 2025 14:52:50 +0000 (+0100) Subject: fix(qav3): ensure the label period is chosen over all possible windows X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=6c02383d0b94ed8d4af01ec634412d4c4ca7d357;p=freqai-strategies.git fix(qav3): ensure the label period is chosen over all possible windows Signed-off-by: Jérôme Benoit --- diff --git a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py index 156bb91..a10e1b0 100644 --- a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py @@ -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) diff --git a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py index 3b94dfa..4a274c6 100644 --- a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py @@ -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) diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 28836da..a830514 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -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()