- 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.
298 lines
7.9 KiB
Markdown
298 lines
7.9 KiB
Markdown
# 枢轴点(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行
|
||
|