]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor(qav3,regressor): centralize label default initialization via Utils.get_label...
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 31 Oct 2025 16:03:25 +0000 (17:03 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 31 Oct 2025 16:03:25 +0000 (17:03 +0100)
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/QuickAdapterV3.py
quickadapter/user_data/strategies/Utils.py

index 88f46706f2c6e66bc42959d0a2f3e7ddb5b1b27a..2c982daa9ed99c0945c7b0e984071792661d190f 100644 (file)
@@ -31,6 +31,7 @@ from Utils import (
     soft_extremum,
     validate_range,
     zigzag,
+    get_label_defaults,
 )
 
 debug = False
@@ -63,7 +64,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
     https://github.com/sponsors/robcaulk
     """
 
-    version = "3.7.117"
+    version = "3.7.119"
 
     @cached_property
     def _optuna_config(self) -> dict[str, Any]:
@@ -194,7 +195,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
         self._optuna_label_candle: dict[str, int] = {}
         self._optuna_label_candles: dict[str, int] = {}
         self._optuna_label_incremented_pairs: list[str] = []
-        self._init_label_defaults()
+        self._default_label_natr_ratio, self._default_label_period_candles = get_label_defaults(self.ft_params, logger)
         for pair in self.pairs:
             self._optuna_hp_value[pair] = -1
             self._optuna_train_value[pair] = -1
@@ -232,52 +233,6 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
             f"Initialized {self.__class__.__name__} {self.freqai_info.get('regressor', 'xgboost')} regressor model version {self.version}"
         )
 
-    def _init_label_defaults(self) -> None:
-        default_min_label_natr_ratio = 9.0
-        default_max_label_natr_ratio = 12.0
-        min_label_natr_ratio = self.ft_params.get(
-            "min_label_natr_ratio", default_min_label_natr_ratio
-        )
-        max_label_natr_ratio = self.ft_params.get(
-            "max_label_natr_ratio", default_max_label_natr_ratio
-        )
-        min_label_natr_ratio, max_label_natr_ratio = validate_range(
-            min_label_natr_ratio,
-            max_label_natr_ratio,
-            logger,
-            name="label_natr_ratio",
-            default_min=default_min_label_natr_ratio,
-            default_max=default_max_label_natr_ratio,
-            allow_equal=False,
-            non_negative=True,
-            finite_only=True,
-        )
-        self._default_label_natr_ratio = float(
-            midpoint(min_label_natr_ratio, max_label_natr_ratio)
-        )
-
-        default_min_label_period_candles = 12
-        default_max_label_period_candles = 24
-        min_label_period_candles = self.ft_params.get(
-            "min_label_period_candles", default_min_label_period_candles
-        )
-        max_label_period_candles = self.ft_params.get(
-            "max_label_period_candles", default_max_label_period_candles
-        )
-        min_label_period_candles, max_label_period_candles = validate_range(
-            min_label_period_candles,
-            max_label_period_candles,
-            logger,
-            name="label_period_candles",
-            default_min=default_min_label_period_candles,
-            default_max=default_max_label_period_candles,
-            allow_equal=True,
-            non_negative=True,
-            finite_only=True,
-        )
-        self._default_label_period_candles = int(
-            round(midpoint(min_label_period_candles, max_label_period_candles))
-        )
 
     def get_optuna_params(self, pair: str, namespace: str) -> dict[str, Any]:
         if namespace == "hp":
index 21966098b222679c6e0a3765a3b2acd23d4c2f88..9a63d6817e04fef395cb2a6273662bb1624f4680 100644 (file)
@@ -38,6 +38,7 @@ from Utils import (
     vwapb,
     zigzag,
     zlema,
+    get_label_defaults,
 
 )
 
@@ -71,7 +72,7 @@ class QuickAdapterV3(IStrategy):
 
 
     def version(self) -> str:
-        return "3.3.163"
+        return "3.3.164"
 
     timeframe = "5m"
 
@@ -234,7 +235,7 @@ class QuickAdapterV3(IStrategy):
             / "models"
             / self.freqai_info.get("identifier")
         )
-        self._init_label_defaults()
+        self._default_label_natr_ratio, self._default_label_period_candles = get_label_defaults(self.freqai_info.get("feature_parameters", {}), logger)
         self._label_params: dict[str, dict[str, Any]] = {}
         for pair in self.pairs:
             self._label_params[pair] = (
@@ -335,52 +336,6 @@ class QuickAdapterV3(IStrategy):
             format_number(self._reversal_max_natr_ratio_percent),
         )
 
-    def _init_label_defaults(self) -> None:
-        feature_parameters = self.freqai_info.get("feature_parameters", {})
-        default_min_label_natr_ratio = 9.0
-        default_max_label_natr_ratio = 12.0
-        min_label_natr_ratio = feature_parameters.get(
-            "min_label_natr_ratio", default_min_label_natr_ratio
-        )
-        max_label_natr_ratio = feature_parameters.get(
-            "max_label_natr_ratio", default_max_label_natr_ratio
-        )
-        min_label_natr_ratio, max_label_natr_ratio = validate_range(
-            min_label_natr_ratio,
-            max_label_natr_ratio,
-            logger,
-            name="label_natr_ratio",
-            default_min=default_min_label_natr_ratio,
-            default_max=default_max_label_natr_ratio,
-            allow_equal=False,
-            non_negative=True,
-            finite_only=True,
-        )
-        self._default_label_natr_ratio = float(
-            midpoint(min_label_natr_ratio, max_label_natr_ratio)
-        )
-        default_min_label_period_candles = 12
-        default_max_label_period_candles = 24
-        min_label_period_candles = feature_parameters.get(
-            "min_label_period_candles", default_min_label_period_candles
-        )
-        max_label_period_candles = feature_parameters.get(
-            "max_label_period_candles", default_max_label_period_candles
-        )
-        min_label_period_candles, max_label_period_candles = validate_range(
-            min_label_period_candles,
-            max_label_period_candles,
-            logger,
-            name="label_period_candles",
-            default_min=default_min_label_period_candles,
-            default_max=default_max_label_period_candles,
-            allow_equal=True,
-            non_negative=True,
-            finite_only=True,
-        )
-        self._default_label_period_candles = int(
-            round(midpoint(min_label_period_candles, max_label_period_candles))
-        )
 
     def feature_engineering_expand_all(
         self, dataframe: DataFrame, period: int, metadata: dict[str, Any], **kwargs
index be700bfdc9eb858466ef4d6ec72bf18c929aedb3..7b34ad8088159c825f3b263728921dd07f244be0 100644 (file)
@@ -1177,3 +1177,60 @@ def validate_range(
         )
 
     return sanitized_min, sanitized_max
+
+
+def get_label_defaults(params_dict: dict[str, Any], logger: Logger) -> tuple[float, int]:
+    """Compute default label_natr_ratio and label_period_candles.
+
+    Reads min/max ranges from params_dict (feature/ft params) and validates them with
+    validate_range, then returns midpoint defaults.
+    """
+    feature_parameters = params_dict or {}
+
+    # NATR ratio defaults
+    default_min_label_natr_ratio = 9.0
+    default_max_label_natr_ratio = 12.0
+    min_label_natr_ratio = feature_parameters.get(
+        "min_label_natr_ratio", default_min_label_natr_ratio
+    )
+    max_label_natr_ratio = feature_parameters.get(
+        "max_label_natr_ratio", default_max_label_natr_ratio
+    )
+    min_label_natr_ratio, max_label_natr_ratio = validate_range(
+        min_label_natr_ratio,
+        max_label_natr_ratio,
+        logger,
+        name="label_natr_ratio",
+        default_min=default_min_label_natr_ratio,
+        default_max=default_max_label_natr_ratio,
+        allow_equal=False,
+        non_negative=True,
+        finite_only=True,
+    )
+    default_label_natr_ratio = float(midpoint(min_label_natr_ratio, max_label_natr_ratio))
+
+    # Period candles defaults
+    default_min_label_period_candles = 12
+    default_max_label_period_candles = 24
+    min_label_period_candles = feature_parameters.get(
+        "min_label_period_candles", default_min_label_period_candles
+    )
+    max_label_period_candles = feature_parameters.get(
+        "max_label_period_candles", default_max_label_period_candles
+    )
+    min_label_period_candles, max_label_period_candles = validate_range(
+        min_label_period_candles,
+        max_label_period_candles,
+        logger,
+        name="label_period_candles",
+        default_min=default_min_label_period_candles,
+        default_max=default_max_label_period_candles,
+        allow_equal=True,
+        non_negative=True,
+        finite_only=True,
+    )
+    default_label_period_candles = int(
+        round(midpoint(min_label_period_candles, max_label_period_candles))
+    )
+
+    return default_label_natr_ratio, default_label_period_candles