From: Jérôme Benoit Date: Fri, 31 Oct 2025 16:29:02 +0000 (+0100) Subject: refactor(qav3): cleanup tunables default building X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=0aa5dfa7727e0bca81b5e742bb410f6782c8b929;p=freqai-strategies.git refactor(qav3): cleanup tunables default building Signed-off-by: Jérôme Benoit --- diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 2c982da..7378613 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -24,14 +24,12 @@ from Utils import ( calculate_n_extrema, fit_regressor, format_number, + get_label_defaults, get_min_max_label_period_candles, get_optuna_callbacks, get_optuna_study_model_parameters, - midpoint, soft_extremum, - validate_range, zigzag, - get_label_defaults, ) debug = False @@ -64,7 +62,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): https://github.com/sponsors/robcaulk """ - version = "3.7.119" + version = "3.7.120" @cached_property def _optuna_config(self) -> dict[str, Any]: @@ -195,7 +193,9 @@ 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._default_label_natr_ratio, self._default_label_period_candles = get_label_defaults(self.ft_params, logger) + 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 @@ -233,7 +233,6 @@ class QuickAdapterRegressorV3(BaseRegressionModel): f"Initialized {self.__class__.__name__} {self.freqai_info.get('regressor', 'xgboost')} regressor model version {self.version}" ) - def get_optuna_params(self, pair: str, namespace: str) -> dict[str, Any]: if namespace == "hp": params = self._optuna_hp_params.get(pair) diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 9a63d68..7696627 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -28,8 +28,8 @@ from Utils import ( format_number, get_callable_sha256, get_distance, + get_label_defaults, get_zl_ma_fn, - midpoint, non_zero_diff, price_retracement_percent, smooth_extrema, @@ -38,8 +38,6 @@ from Utils import ( vwapb, zigzag, zlema, - get_label_defaults, - ) debug = False @@ -70,7 +68,6 @@ class QuickAdapterV3(IStrategy): INTERFACE_VERSION = 3 - def version(self) -> str: return "3.3.164" @@ -235,21 +232,22 @@ class QuickAdapterV3(IStrategy): / "models" / self.freqai_info.get("identifier") ) - self._default_label_natr_ratio, self._default_label_period_candles = get_label_defaults(self.freqai_info.get("feature_parameters", {}), logger) + feature_parameters = self.freqai_info.get("feature_parameters", {}) + self._default_label_natr_ratio, self._default_label_period_candles = ( + get_label_defaults(feature_parameters, logger) + ) self._label_params: dict[str, dict[str, Any]] = {} for pair in self.pairs: self._label_params[pair] = ( self.optuna_load_best_params(pair, "label") if self.optuna_load_best_params(pair, "label") else { - "label_period_candles": self.freqai_info.get( - "feature_parameters", {} - ).get( + "label_period_candles": feature_parameters.get( "label_period_candles", self._default_label_period_candles, ), "label_natr_ratio": float( - self.freqai_info.get("feature_parameters", {}).get( + feature_parameters.get( "label_natr_ratio", self._default_label_natr_ratio, ) @@ -336,7 +334,6 @@ class QuickAdapterV3(IStrategy): format_number(self._reversal_max_natr_ratio_percent), ) - def feature_engineering_expand_all( self, dataframe: DataFrame, period: int, metadata: dict[str, Any], **kwargs ) -> DataFrame: diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 7b34ad8..20ba8ca 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -1179,17 +1179,15 @@ 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 +def get_label_defaults( + feature_parameters: dict[str, Any], + logger: Logger, + *, + default_min_label_period_candles: int = 12, + default_max_label_period_candles: int = 24, + default_min_label_natr_ratio: float = 9.0, + default_max_label_natr_ratio: float = 12.0, +) -> tuple[float, int]: min_label_natr_ratio = feature_parameters.get( "min_label_natr_ratio", default_min_label_natr_ratio ) @@ -1207,11 +1205,10 @@ def get_label_defaults(params_dict: dict[str, Any], logger: Logger) -> tuple[flo non_negative=True, finite_only=True, ) - default_label_natr_ratio = float(midpoint(min_label_natr_ratio, max_label_natr_ratio)) + 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 )