]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
perf(qav3): speed up pivot labeling confirmation
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 19 May 2025 21:38:58 +0000 (23:38 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 19 May 2025 21:38:58 +0000 (23:38 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/QuickAdapterV3.py
quickadapter/user_data/strategies/Utils.py

index 4bcdfa84f52b1029d750046e54de9d266c2f9c0a..b8c984c4a4f04b13586f1d0f1ff9357dbd79484d 100644 (file)
@@ -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
index f9f8a0446cbb860ccedfde9ae937557658047a3c..d0e2e744fb474cc6e5eb5175f340fa524f68ab02 100644 (file)
@@ -58,7 +58,7 @@ class QuickAdapterV3(IStrategy):
     INTERFACE_VERSION = 3
 
     def version(self) -> str:
-        return "3.3.45"
+        return "3.3.46"
 
     timeframe = "5m"
 
index c78be4521e5513b42011605f74cd28d180725552..2e528ce9a10e4eaf8f9c74e4dd02314c6e8b166b 100644 (file)
@@ -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