From 5706bc73020b76b25f191e114555cf479ec84753 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Fri, 31 Oct 2025 17:03:25 +0100 Subject: [PATCH] refactor(qav3,regressor): centralize label default initialization via Utils.get_label_defaults; remove duplicated _init_label_defaults --- .../freqaimodels/QuickAdapterRegressorV3.py | 51 +---------------- .../user_data/strategies/QuickAdapterV3.py | 51 +---------------- quickadapter/user_data/strategies/Utils.py | 57 +++++++++++++++++++ 3 files changed, 63 insertions(+), 96 deletions(-) diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 88f4670..2c982da 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -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": diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 2196609..9a63d68 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -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 diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index be700bf..7b34ad8 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -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 -- 2.43.0