]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
perf(qav3): fine tune extrema labeling
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 5 Apr 2025 12:44:34 +0000 (14:44 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 5 Apr 2025 12:44:34 +0000 (14:44 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/QuickAdapterV3.py

index 3796294738408a11edfd96780503d16b910110bb..d39eabca8db2ac5f8c94f5c7e857ed41915a69b4 100644 (file)
@@ -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",
index 08ff72f51e25e4657c1fa8ab7d32ad0beefb849b..c2eddf7bca4bbc36eaec4e9421bc934d541bbfc8 100644 (file)
@@ -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,