From d1888bde0aae58a161222ae0e4f0325172f1ccd7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Wed, 9 Apr 2025 16:42:12 +0200 Subject: [PATCH] perf(qav3): use median where appropriate MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../freqaimodels/QuickAdapterRegressorV3.py | 50 +++++++++---------- .../user_data/strategies/QuickAdapterV3.py | 4 +- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 154f264..cfa5a5b 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -44,7 +44,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): https://github.com/sponsors/robcaulk """ - version = "3.7.0" + version = "3.7.1" @cached_property def _optuna_config(self) -> dict: @@ -381,38 +381,38 @@ class QuickAdapterRegressorV3(BaseRegressionModel): best_trials = study.best_trials if namespace == "label": range_sizes = [trial.values[1] for trial in best_trials] - mean_range_size = np.mean(range_sizes) - equal_mean_trials = [ + median_range_size = np.median(range_sizes) + equal_median_trials = [ trial for trial in best_trials - if np.isclose(trial.values[1], mean_range_size) + if np.isclose(trial.values[1], median_range_size) ] - if equal_mean_trials: - return max(equal_mean_trials, key=lambda trial: trial.values[0]) - nearest_above_mean = (np.inf, -np.inf, None) - nearest_below_mean = (-np.inf, -np.inf, None) + if equal_median_trials: + return max(equal_median_trials, key=lambda trial: trial.values[0]) + nearest_above_median = (np.inf, -np.inf, None) + nearest_below_median = (-np.inf, -np.inf, None) for idx, trial in enumerate(best_trials): range_size = trial.values[1] - if range_size >= mean_range_size: - if range_size < nearest_above_mean[0] or ( - range_size == nearest_above_mean[0] - and trial.values[0] > nearest_above_mean[1] + if range_size >= median_range_size: + if range_size < nearest_above_median[0] or ( + range_size == nearest_above_median[0] + and trial.values[0] > nearest_above_median[1] ): - nearest_above_mean = (range_size, trial.values[0], idx) - if range_size <= mean_range_size: - if range_size > nearest_below_mean[0] or ( - range_size == nearest_below_mean[0] - and trial.values[0] > nearest_below_mean[1] + nearest_above_median = (range_size, trial.values[0], idx) + if range_size <= median_range_size: + if range_size > nearest_below_median[0] or ( + range_size == nearest_below_median[0] + and trial.values[0] > nearest_below_median[1] ): - nearest_below_mean = (range_size, trial.values[0], idx) - if nearest_above_mean[2] is None or nearest_below_mean[2] is None: + nearest_below_median = (range_size, trial.values[0], idx) + if nearest_above_median[2] is None or nearest_below_median[2] is None: return None - above_mean_trial = best_trials[nearest_above_mean[2]] - below_mean_trial = best_trials[nearest_below_mean[2]] - if above_mean_trial.values[0] >= below_mean_trial.values[0]: - return above_mean_trial + above_median_trial = best_trials[nearest_above_median[2]] + below_median_trial = best_trials[nearest_below_median[2]] + if above_median_trial.values[0] >= below_median_trial.values[0]: + return above_median_trial else: - return below_mean_trial + return below_median_trial else: raise ValueError(f"Invalid namespace: {namespace}") @@ -953,7 +953,7 @@ def label_objective( peak_ranges.append(abs(peak_value - previous_value)) previous_value = peak_value - return np.mean(peak_ranges), len(peak_ranges) + return np.median(peak_ranges), len(peak_ranges) def smoothed_max(series: pd.Series, temperature=1.0) -> float: diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 98fff8c..f333ecc 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -58,7 +58,7 @@ class QuickAdapterV3(IStrategy): INTERFACE_VERSION = 3 def version(self) -> str: - return "3.3.0" + return "3.3.1" timeframe = "5m" @@ -520,7 +520,7 @@ class QuickAdapterV3(IStrategy): ) return max( trade_take_profit_distance, - np.mean( + np.median( [ trade_take_profit_distance, current_rate -- 2.43.0