From: Jérôme Benoit Date: Mon, 19 May 2025 21:38:58 +0000 (+0200) Subject: perf(qav3): speed up pivot labeling confirmation X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=a1219c7f37e044e79699b4943ba3b1c5e2ed5687;p=freqai-strategies.git perf(qav3): speed up pivot labeling confirmation Signed-off-by: Jérôme Benoit --- diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 4bcdfa8..b8c984c 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -45,7 +45,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): https://github.com/sponsors/robcaulk """ - version = "3.7.47" + version = "3.7.48" @cached_property def _optuna_config(self) -> dict: @@ -884,6 +884,13 @@ def zigzag( candidate_pivot_value = np.nan candidate_pivot_direction: TrendDirection = TrendDirection.NEUTRAL + def calculate_quantile(values: np.ndarray, pos: int, start: int, end: int) -> float: + if start >= end: + return 0.5 + if np.all(np.isclose(values[start:end], values[start])): + return 0.5 + return np.sum(values[start:end] <= values[pos]) / len(values[start:end]) + def calculate_depth_factor( pos: int, min_factor: float = 0.5, @@ -894,22 +901,9 @@ def zigzag( if start >= end: return (min_factor + max_factor) / 2 - natr_values = get_natr_values(natr_period) - natr_pos = natr_values[pos] - median_natr = np.median(natr_values[start:end]) - if np.isclose(median_natr, 0): - return max_factor - natr_ratio = natr_pos / median_natr - smoothed_natr_ratio = np.sqrt(natr_ratio) - - depth_factor = ( - max_factor - - (max_factor - min_factor) - * (np.clip(smoothed_natr_ratio, 0.5, 2.0) - 0.5) - / 1.5 - ) + quantile = calculate_quantile(get_natr_values(natr_period), pos, start, end) - return np.clip(depth_factor, min_factor, max_factor) + return max_factor - (max_factor - min_factor) * quantile def calculate_depth( pos: int, @@ -937,17 +931,9 @@ def zigzag( if start >= end: return min_strength - natr_values = get_natr_values(natr_period) - natr_pos = natr_values[pos] - lookback_natr = natr_values[start:end] - natr_min = np.min(lookback_natr) - natr_max = np.max(lookback_natr) - natr_range = natr_max - natr_min - if np.isclose(natr_range, 0): - return min_strength - normalized_natr_pos = (natr_pos - natr_min) / natr_range + quantile = calculate_quantile(get_natr_values(natr_period), pos, start, end) - return min_strength + (max_strength - min_strength) * normalized_natr_pos + return min_strength + (max_strength - min_strength) * quantile def update_candidate_pivot(pos: int, value: float, direction: TrendDirection): nonlocal candidate_pivot_pos, candidate_pivot_value, candidate_pivot_direction diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index f9f8a04..d0e2e74 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.45" + return "3.3.46" timeframe = "5m" diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index c78be45..2e528ce 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -381,6 +381,13 @@ def zigzag( candidate_pivot_value = np.nan candidate_pivot_direction: TrendDirection = TrendDirection.NEUTRAL + def calculate_quantile(values: np.ndarray, pos: int, start: int, end: int) -> float: + if start >= end: + return 0.5 + if np.all(np.isclose(values[start:end], values[start])): + return 0.5 + return np.sum(values[start:end] <= values[pos]) / len(values[start:end]) + def calculate_depth_factor( pos: int, min_factor: float = 0.5, @@ -391,22 +398,9 @@ def zigzag( if start >= end: return (min_factor + max_factor) / 2 - natr_values = get_natr_values(natr_period) - natr_pos = natr_values[pos] - median_natr = np.median(natr_values[start:end]) - if np.isclose(median_natr, 0): - return max_factor - natr_ratio = natr_pos / median_natr - smoothed_natr_ratio = np.sqrt(natr_ratio) - - depth_factor = ( - max_factor - - (max_factor - min_factor) - * (np.clip(smoothed_natr_ratio, 0.5, 2.0) - 0.5) - / 1.5 - ) + quantile = calculate_quantile(get_natr_values(natr_period), pos, start, end) - return np.clip(depth_factor, min_factor, max_factor) + return max_factor - (max_factor - min_factor) * quantile def calculate_depth( pos: int, @@ -434,17 +428,9 @@ def zigzag( if start >= end: return min_strength - natr_values = get_natr_values(natr_period) - natr_pos = natr_values[pos] - lookback_natr = natr_values[start:end] - natr_min = np.min(lookback_natr) - natr_max = np.max(lookback_natr) - natr_range = natr_max - natr_min - if np.isclose(natr_range, 0): - return min_strength - normalized_natr_pos = (natr_pos - natr_min) / natr_range + quantile = calculate_quantile(get_natr_values(natr_period), pos, start, end) - return min_strength + (max_strength - min_strength) * normalized_natr_pos + return min_strength + (max_strength - min_strength) * quantile def update_candidate_pivot(pos: int, value: float, direction: TrendDirection): nonlocal candidate_pivot_pos, candidate_pivot_value, candidate_pivot_direction