triangle-validator/docs/triangle-validator-guide_20260304.md
褚宏光 54ff70c5d7 docs: 添加技术文档
内容包括:
- 数据流程说明
- K 线聚合逻辑(日K/周K/月K)
- 趋势线绘制逻辑
- 周K/月K 形态检测说明
- 常见问题解答
- 相关源码位置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 15:46:21 +08:00

201 lines
7.2 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.

# 收敛三角形形态可视化验证工具 - 技术文档
> 文档更新日期2026-03-04
## 1. 项目概述
收敛三角形Converging Triangle形态检测可视化验证工具。通过 HTTP API 调用远程公式执行,绘制 K 线图 + 三角形趋势线,帮助快速目测验证形态检测结果。
**支持**
- A 股和美股(如英伟达、苹果等)
- 日K / 周K / 月K 三种频率
- 中文名称自动搜索转换为股票代码
## 2. 数据流程
```
validate.py
├─① GET {SEARCH_API_URL}/smartstock/assets/search?q=<关键词>
│ └─ 获取正确的 ticker中控技术 → SH688777英伟达 → NVDA.O
├─② POST {GPT_SERVER_URL}/innerServer/runOneFormula
│ body: { formula_str: "结果=收敛三角形详情(ticker,freq,True,mode)" }
│ └─ response.output = MongoDB _id
├─③ GET {DATA_SERVER_URL}/api/timeSeries/requestIndexDetail?id=<_id>
│ header: Authorization: Bearer <token>
│ └─ data.data_info.detail
│ ├─ strength / direction / is_valid
│ ├─ breakout_price_up / breakout_price_down
│ └─ chart_data
│ ├─ upper_line / lower_line (趋势线端点)
│ ├─ upper_pivots / lower_pivots (枢轴点)
│ └─ window_start_date / window_end_date
├─④ GET {KLINE_API_URL}/dataSupport/getKLineDataByTicker?ticker=<ticker>&begin_date=<begin_date>
│ └─ 获取 K 线 OHLC 数据(默认 3 年历史)
└─⑤ chart.draw_triangle_chart(detail)
├─ K 线数据按频率聚合日K/周K/月K
├─ mplfinance 绘制 K 线 + 趋势线
├─ Y 轴自动调整以包含趋势线
└─ output/{ticker}_{freq}K_{date}.png
```
## 3. K 线聚合逻辑
### 3.1 与前端一致
K 线数据聚合逻辑与前端 `TechPattern.vue` 中的 `filterAndProcessKLineData` 函数完全一致。
### 3.2 聚合规则
| 频率 | 聚合方式 |
|------|----------|
| 日K | 原始数据,不聚合 |
| 周K | 同一周的日K聚合成一根开=首日开,高=最高,低=最低,收=末日收)|
| 月K | 同一月的日K聚合成一根开=首日开,高=最高,低=最低,收=末日收)|
### 3.3 代码示例
```python
# validate.py 中的 aggregate_klines 函数
def aggregate_klines(klines: dict, freq: str) -> dict:
"""
将日K数据聚合成周K或月K
"""
if freq == '日':
return klines
# 按周/月分组
for d in daily_data:
if freq == '周':
# 计算该日期所在周的周一
monday = date_obj - timedelta(days=day_of_week)
key = monday.strftime('%Y%m%d')
else: # 月
key = date_str[:6] # YYYYMM
# 聚合每组数据
result_open.append(group[0]['open']) # 开盘取第一天
result_high.append(max(d['high'] for d in group)) # 最高取最高
result_low.append(min(d['low'] for d in group)) # 最低取最低
result_close.append(group[-1]['close']) # 收盘取最后一天
```
## 4. 趋势线绘制逻辑
### 4.1 与前端一致
趋势线绘制逻辑与前端 `TechPattern.vue` 中的 `getExtendedLinePoints` 函数完全一致。
### 4.2 关键点
1. **趋势线延伸**:从 `window_start_date` 延伸到 `window_end_date`
2. **斜率计算**:使用公式数据中的 `index` 字段计算
3. **坐标映射**:将日期映射到 K 线数据的索引位置
4. **Y 轴调整**:自动调整 Y 轴范围以包含趋势线(增加 5% 边距)
### 4.3 代码示例
```python
# chart.py 中的趋势线绘制逻辑
def make_extended_aline(line_pts, pivot_point, color):
# 使用原始 index 计算斜率
slope = (p2['price'] - p1['price']) / (p2['index'] - p1['index'])
# 前端: startIdx = 0 (window_start_date 对应 index 0)
start_idx = 0
# 查找 window_end_date 对应的 index
end_idx = p2['index']
# 计算延伸后的价格
start_price = pivot_price + slope * (start_idx - pivot_index)
end_price = pivot_price + slope * (end_idx - pivot_index)
return ((kline_start_idx, start_price), (kline_end_idx, end_price))
```
## 5. 周K/月K 形态检测说明
### 5.1 检测逻辑
收敛三角形详情函数会根据传入的频率参数(日/周/月)在**对应周期的数据**上寻找形态。
### 5.2 默认参数(来自 config.py
| 参数 | 日K (D) | 周K (W) | 月K (M) |
|------|---------|---------|---------|
| window | 240 | 104 | 60 |
| pivot_k | 15 | 5 | 3 |
| breakout_threshold | 0.005 | 0.010 | 0.020 |
| vol_window | 20 | 8 | 4 |
| volume_multiplier | 1.5 | 1.5 | 1.3 |
| min_convergence | 0.45 | 0.45 | 0.50 |
| false_break_m | 5 | 2 | 1 |
| flexible_zone | 15 | 5 | 2 |
| display_bars | 300 | 130 | 72 |
### 5.3 形态有效性判定条件
1. **收敛比 (width_ratio)**`width_end / width_start <= shrink_ratio`(默认 0.8
2. **触碰点数量**`touches_upper >= 2``touches_lower >= 2`
3. **违规点限制**:违规点不能超过枢轴点的 1/3
### 5.4 不同股票的检测结果示例
| 股票 | 日K | 周K |
|------|-----|-----|
| 中控技术 | ✅ 有效 | ❌ 无效(收敛不足或触碰点不够)|
| 比亚迪 | - | ✅ 有效 |
| 贵州茅台 | - | ❌ 无效 |
**结论**不是所有股票在周K/月K上都有有效的收敛三角形形态这是正常现象。
## 6. 常见问题
### Q1: 为什么周K/月K没有收敛三角形
**A**: 这是因为该股票在周K/月K数据上没有形成有效的收敛三角形形态可能原因
- 收敛比例不足(`width_ratio > 0.8`
- 触碰点不足(需要上下各至少 2 个触碰点)
### Q2: 为什么 K 线图显示 3 年数据,但形态窗口只有几个月?
**A**: 这是正常的设计:
- K 线数据:显示 `--window` 参数指定的时间范围(默认 3Y
- 形态窗口:由公式检测到的有效形态范围,通常只是 K 线数据的一部分
### Q3: 美股如何获取 K 线数据?
**A**: 使用中文名称(如"英伟达"),程序会自动通过搜索接口获取正确的 ticker`NVDA.O`),然后获取 K 线数据。
### Q4: 趋势线价格超出 K 线范围怎么办?
**A**: 代码会自动调整 Y 轴范围以包含趋势线,并增加 5% 边距(与前端一致)。
## 7. 文件结构
```
triangle-validator/
├── validate.py # 主入口:单股验证
├── batch_validate.py # 批量验证多只股票
├── chart.py # K 线 + 三角形绘图模块
├── config.py # API 端点 & 认证配置
├── requirements.txt # Python 依赖
├── docs/ # 文档目录
│ └── triangle-validator-guide_20260304.md
├── output/ # 生成的图片(自动创建)
├── README.md # 使用说明
└── CLAUDE.md # Claude Code 指引
```
## 8. 相关源码位置
- 收敛三角形详情函数:`D:\project\dunhe_dataServer\src\library\expression\funcs\pattern.py`
- 形态检测核心逻辑:`D:\project\dunhe_dataServer\src\library\pattern\converging_triangle.py`
- 参数配置:`D:\project\dunhe_dataServer\src\library\pattern\config.py`
- 前端 K 线图表:`D:\project\frontend_mobile\src\views\workflow\components\assetRatingV2\components\TechPattern.vue`