From b59d61b05d1f5d8cd2998a7f76a41d31ee657a0d Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Wed, 30 Jul 2025 02:23:42 +0200 Subject: [PATCH] fix(qav3): thresholding computation fixes MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../freqaimodels/QuickAdapterRegressorV3.py | 16 +++++++++------- .../user_data/strategies/QuickAdapterV3.py | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 113c1e5..1046cde 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -51,7 +51,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): https://github.com/sponsors/robcaulk """ - version = "3.7.102" + version = "3.7.103" @cached_property def _optuna_config(self) -> dict[str, Any]: @@ -542,7 +542,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): } if thresholds_smoothing == "exp_weighted_mean": thresholds_alpha = float( - self.freqai_info.get("prediction_thresholds_alpha", 12.0) + self.freqai_info.get("prediction_thresholds_alpha", 25.0) ) return QuickAdapterRegressorV3.exp_weighted_mean_min_max( pred_extrema, thresholds_alpha @@ -571,12 +571,14 @@ class QuickAdapterRegressorV3(BaseRegressionModel): def common_min_max( pred_extrema: pd.Series, ratio: float, method: str ) -> tuple[float, float]: - n_pred_extrema = calculate_n_extrema(pred_extrema) - n_pred_extrema_values = max(1, int(n_pred_extrema * ratio)) + n_pred_minima = sp.signal.find_peaks(-pred_extrema)[0].size + n_pred_maxima = sp.signal.find_peaks(pred_extrema)[0].size + n_pred_minima_values = max(1, int(n_pred_minima * ratio)) + n_pred_maxima_values = max(1, int(n_pred_maxima * ratio)) sorted_pred_extrema = pred_extrema.sort_values(ascending=True) - min_pred_extrema = sorted_pred_extrema.iloc[:n_pred_extrema_values] - max_pred_extrema = sorted_pred_extrema.iloc[-n_pred_extrema_values:] + min_pred_extrema = sorted_pred_extrema.iloc[:n_pred_minima_values] + max_pred_extrema = sorted_pred_extrema.iloc[-n_pred_maxima_values:] method_functions = { "isodata": QuickAdapterRegressorV3.apply_skimage_threshold, @@ -610,7 +612,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): ) -> float: values = series.to_numpy() - if values.size < 2 or np.all(values == values[0]): + if values.size < 2 or np.all(np.isclose(values, values[0])): return values.mean() if values.size > 0 else np.nan try: return threshold_func(values) diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index a196169..36c7154 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -65,7 +65,7 @@ class QuickAdapterV3(IStrategy): INTERFACE_VERSION = 3 def version(self) -> str: - return "3.3.110" + return "3.3.111" timeframe = "5m" -- 2.43.0