- 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.
7.9 KiB
7.9 KiB
枢轴点(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线内的最低点
- 连接高点枢轴 → 上沿线(红色虚线)
- 连接低点枢轴 → 下沿线(绿色虚线)
为什么使用枢轴点?
优势
- 客观性:严格的数学定义,无主观判断
- 自适应:自动识别显著的转折点
- 噪音过滤:通过调整 k 值过滤小波动
- 趋势确认:枢轴点代表趋势的真实转折
与手工画线的区别
| 方法 | 优点 | 缺点 |
|---|---|---|
| 手工画线 | 灵活,可主观调整 | 难以批量,不可复现 |
| 枢轴点法 | 自动化,可批量,可复现 | 需要调参(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行