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

298 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 枢轴点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行