内容包括: - 数据流程说明 - K 线聚合逻辑(日K/周K/月K) - 趋势线绘制逻辑 - 周K/月K 形态检测说明 - 常见问题解答 - 相关源码位置 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
7.2 KiB
7.2 KiB
收敛三角形形态可视化验证工具 - 技术文档
文档更新日期: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 代码示例
# 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 关键点
- 趋势线延伸:从
window_start_date延伸到window_end_date - 斜率计算:使用公式数据中的
index字段计算 - 坐标映射:将日期映射到 K 线数据的索引位置
- Y 轴调整:自动调整 Y 轴范围以包含趋势线(增加 5% 边距)
4.3 代码示例
# 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 形态有效性判定条件
- 收敛比 (width_ratio):
width_end / width_start <= shrink_ratio(默认 0.8) - 触碰点数量:
touches_upper >= 2和touches_lower >= 2 - 违规点限制:违规点不能超过枢轴点的 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