# 枢轴点(Pivot Points)检测原理 **枢轴点** 是技术分析中的关键概念,用于识别价格的局部高点和低点。 --- ## 核心算法:分形法(Fractal Method) ### 函数定义 ```python def pivots_fractal( high: np.ndarray, low: np.ndarray, k: int = 3 ) -> Tuple[np.ndarray, np.ndarray]: """ 左右窗口分形:返回 pivot_high_idx, pivot_low_idx Args: high: 最高价数组 low: 最低价数组 k: 左右窗口大小(默认3,即左右各看3根K线) Returns: (pivot_high_indices, pivot_low_indices): 高点和低点的索引位置 """ n = len(high) ph: List[int] = [] # pivot high pl: List[int] = [] # pivot low for i in range(k, n - k): # 高点枢轴:中心K线是左右各k根K线的最高点 if high[i] == np.max(high[i - k : i + k + 1]): ph.append(i) # 低点枢轴:中心K线是左右各k根K线的最低点 if low[i] == np.min(low[i - k : i + k + 1]): pl.append(i) return np.array(ph, dtype=int), np.array(pl, dtype=int) ``` --- ## 判断逻辑详解 ### 高点枢轴(Pivot High) **定义**:某根K线的最高价是其左右各 k 根K线范围内的**最高值** **条件**:`high[i] == max(high[i-k : i+k+1])` **示例(k=3)**: ``` 索引: 0 1 2 3 4 5 6 7 8 9 10 最高价: 10 12 15 18 20 17 14 16 13 11 9 ↑ 枢轴高点 (索引4) 检查范围: [1, 2, 3, 4, 5, 6, 7] ← 左3 + 中心 + 右3 20 = max(12, 15, 18, 20, 17, 14, 16) ✅ 是枢轴高点 ``` **为什么是枢轴?** - 左边3根K线都比它低 → 确认上升趋势结束 - 右边3根K线都比它低 → 确认下跌开始 - 这是一个**局部顶点** --- ### 低点枢轴(Pivot Low) **定义**:某根K线的最低价是其左右各 k 根K线范围内的**最低值** **条件**:`low[i] == min(low[i-k : i+k+1])` **示例(k=3)**: ``` 索引: 0 1 2 3 4 5 6 7 8 9 10 最低价: 20 18 15 12 8 10 13 11 14 16 18 ↑ 枢轴低点 (索引4) 检查范围: [1, 2, 3, 4, 5, 6, 7] ← 左3 + 中心 + 右3 8 = min(18, 15, 12, 8, 10, 13, 11) ✅ 是枢轴低点 ``` **为什么是枢轴?** - 左边3根K线都比它高 → 确认下跌趋势结束 - 右边3根K线都比它高 → 确认上升开始 - 这是一个**局部底点** --- ## 参数 k 的影响 ### k 值的含义 `k` 是**左右窗口大小**,即左右各看多少根K线。 ### 不同 k 值的效果 #### k = 3(敏感,检测更多小波动) ``` 价格: 10 → 12 → 15 → 12 → 10 → 13 → 16 → 14 → 12 ↑ ↑ 枢轴高(15) 枢轴高(16) ↑ 枢轴低(10) ``` **特点**: - ✅ 捕获更多细节波动 - ❌ 可能包含噪音 --- #### k = 15(当前配置,平滑) ``` 价格: 复杂波动 → 主要高点 → 复杂波动 → 主要低点 → ... ↑ ↑ 枢轴高(28) 枢轴低(12) ``` **特点**: - ✅ 只捕获**显著的**局部极值 - ✅ 过滤小幅波动噪音 - ✅ 更适合识别主要趋势转折 **配置来源**:`scripts/triangle_config.py` ```python DETECTION_PARAMS = ConvergingTriangleParams( pivot_k=15, # 枢轴点检测周期(左右各15根K线) ... ) ``` --- ## 在三角形检测中的应用 ### 第1步:识别所有枢轴点 ```python # 计算全部枢轴点 ph_idx, pl_idx = pivots_fractal(high, low, k=15) # ph_idx: [45, 89, 132, 178, ...] ← 高点枢轴的索引 # pl_idx: [23, 67, 110, 156, ...] ← 低点枢轴的索引 ``` ### 第2步:筛选窗口内的枢轴点 ```python # 只保留检测窗口内的枢轴点(最近120天) ph_in = ph_idx[(ph_idx >= start) & (ph_idx <= end)] pl_in = pl_idx[(pl_idx >= start) & (pl_idx <= end)] # 至少需要2个高点枢轴和2个低点枢轴才能画线 if len(ph_in) < 2 or len(pl_in) < 2: return invalid_result ``` ### 第3步:连接枢轴点形成三角形边界 使用 `fit_pivot_line()` 函数: - 从高点枢轴中选择2个点,连成**上沿线** - 从低点枢轴中选择2个点,连成**下沿线** 详见:`fit_pivot_line()` 函数说明(第176-286行) --- ## 图解示例 ### 实际K线图中的枢轴点 ``` 价格 │ 50│ ○ ← 枢轴高点3 │ / │ \ 45│ / │ \ │ / │ \ ○ ← 枢轴高点2 40│ / │ \ / │ \ │ / │ ○ │ \ 35│ ○ │ │ │ │ ← 枢轴高点1 │ │ 30│ │ │ │ │ │ ○ │ 25│ │ ← 枢轴低点1 │ │ │ ○ 20│ │ ← 枢轴低点2 │ │ └──┴────────────────────────────────────────→ 时间 1 10 20 30 40 50 60 70 80 90 ←k=15→ ←k=15→ 说明: - ○ = 枢轴点(局部极值) - 高点枢轴:左右各15根K线内的最高点 - 低点枢轴:左右各15根K线内的最低点 - 连接高点枢轴 → 上沿线(红色虚线) - 连接低点枢轴 → 下沿线(绿色虚线) ``` --- ## 为什么使用枢轴点? ### 优势 1. **客观性**:严格的数学定义,无主观判断 2. **自适应**:自动识别显著的转折点 3. **噪音过滤**:通过调整 k 值过滤小波动 4. **趋势确认**:枢轴点代表趋势的真实转折 ### 与手工画线的区别 | 方法 | 优点 | 缺点 | |------|------|------| | **手工画线** | 灵活,可主观调整 | 难以批量,不可复现 | | **枢轴点法** | 自动化,可批量,可复现 | 需要调参(k值) | --- ## 常见问题 ### Q1: 为什么有些明显的高点/低点不是枢轴点? **A**: 因为它不满足"左右k根K线的极值"条件。 例如(k=3): ``` 价格: 10 → 15 → 20 → 18 → 25 → 22 → 20 ↑ ↑ 20 25 ``` - `20`(索引2)不是枢轴高点,因为右边的 `25` 更高 - `18`(索引3)不是枢轴低点,因为右边的 `20` 更低 - `25`(索引4)才是枢轴高点 --- ### Q2: k=15 是怎么确定的? **A**: 经验值,平衡灵敏度和噪音: - **k 太小(如3)**:检测太多小波动,三角形质量差 - **k 太大(如30)**:遗漏重要转折点,检测不到三角形 - **k=15(推荐)**:适合日线级别的中期形态(2-6个月) --- ### Q3: 图表上显示"触碰:上3/下2"是什么意思? **A**: 表示窗口内有多少个枢轴点接近拟合线: ```python # 检查所有高点枢轴与上沿线的距离 touches_upper = (枢轴点偏离 ≤ 10%) 的数量 # 不是只有用于画线的2个点,而是所有满足容差的点! ``` **示例**: - 窗口内有 5 个高点枢轴:[A, B, C, D, E] - 用于画上沿线的 2 个点:[A, E] - 但 [A, B, E] 三个点都接近上沿线(偏离 < 10%) - 所以 `touches_upper = 3` --- ## 总结 枢轴点检测的核心思想: ``` 枢轴高点 = 左右各k根K线中的最高点 → 代表局部顶部 枢轴低点 = 左右各k根K线中的最低点 → 代表局部底部 连接枢轴高点 → 上沿线 连接枢轴低点 → 下沿线 上下沿收敛 + 相向运动 → 收敛三角形 ✓ ``` **配置调整**:编辑 `scripts/triangle_config.py` 中的 `pivot_k` 参数。 **相关代码**: - 枢轴点检测:`src/converging_triangle.py` 第98-110行 - 枢轴点应用:`src/converging_triangle.py` 第417-444行