technical-patterns-lab/docs/枢轴点检测原理.md
褚宏光 6d545eb231 Enhance converging triangle detection with new features and documentation updates
- Added support for a detailed chart mode in plot_converging_triangles.py, allowing users to visualize all pivot points and fitting lines.
- Improved pivot fitting logic to utilize multiple representative points, enhancing detection accuracy and reducing false positives.
- Introduced a new real-time detection mode with flexible zone parameters for better responsiveness in stock analysis.
- Updated README.md and USAGE.md to reflect new features and usage instructions.
- Added multiple documentation files detailing recent improvements, including pivot point fitting and visualization enhancements.
- Cleaned up and archived outdated scripts to streamline the project structure.
2026-01-26 16:21:36 +08:00

7.9 KiB
Raw Blame History

枢轴点Pivot Points检测原理

枢轴点 是技术分析中的关键概念,用于识别价格的局部高点和低点。


核心算法分形法Fractal Method

函数定义

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

DETECTION_PARAMS = ConvergingTriangleParams(
    pivot_k=15,  # 枢轴点检测周期左右各15根K线
    ...
)

在三角形检测中的应用

第1步识别所有枢轴点

# 计算全部枢轴点
ph_idx, pl_idx = pivots_fractal(high, low, k=15)
# ph_idx: [45, 89, 132, 178, ...]  ← 高点枢轴的索引
# pl_idx: [23, 67, 110, 156, ...]  ← 低点枢轴的索引

第2步筛选窗口内的枢轴点

# 只保留检测窗口内的枢轴点最近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: 表示窗口内有多少个枢轴点接近拟合线:

# 检查所有高点枢轴与上沿线的距离
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行