From 7e6c6f199a584b6cabc7f973a96f07f2c2b29711 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sat, 5 Apr 2025 14:44:34 +0200 Subject: [PATCH] perf(qav3): fine tune extrema labeling MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../freqaimodels/QuickAdapterRegressorV3.py | 28 +++++++++++++++---- .../user_data/strategies/QuickAdapterV3.py | 4 +-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 3796294..d39eabc 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -44,7 +44,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): https://github.com/sponsors/robcaulk """ - version = "3.6.6" + version = "3.6.7" @cached_property def __optuna_config(self) -> dict: @@ -609,6 +609,19 @@ def train_regressor( return model +def round_to_nearest(value: float, step: int) -> int: + """ + Round a value to the nearest multiple of a given step. + :param value: The value to round. + :param step: The step size to round to (must be non-zero). + :return: The rounded value. + :raises ValueError: If step is zero. + """ + if step == 0: + raise ValueError("step must be non-zero") + return int(round(value / step) * step) + + def period_objective( trial: optuna.Trial, regressor: str, @@ -652,10 +665,15 @@ def period_objective( ) y_pred = model.predict(X_test) - min_label_period_candles: int = max(fit_live_predictions_candles // 9, 20) - max_label_period_candles: int = min( - max(fit_live_predictions_candles // 3, min_label_period_candles), - max(test_window // 2, min_label_period_candles), + min_label_period_candles: int = round_to_nearest( + max(fit_live_predictions_candles // 12, 20), candles_step + ) + max_label_period_candles: int = round_to_nearest( + min( + max(fit_live_predictions_candles // 3, min_label_period_candles), + max(test_window // 2, min_label_period_candles), + ), + candles_step, ) label_period_candles: int = trial.suggest_int( "label_period_candles", diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 08ff72f..c2eddf7 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -59,7 +59,7 @@ class QuickAdapterV3(IStrategy): INTERFACE_VERSION = 3 def version(self) -> str: - return "3.2.12" + return "3.2.13" timeframe = "5m" @@ -355,7 +355,7 @@ class QuickAdapterV3(IStrategy): peaks_prominence = ( dataframe["close"].iloc[-1] * ta.NATR(dataframe, timeperiod=label_period_candles).iloc[-1] - * 0.005 + * 0.0075 ) min_peaks, _ = find_peaks( -dataframe["low"].values, -- 2.43.0