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

7.2 KiB
Raw Blame History

收敛三角形形态可视化验证工具 - 技术文档

文档更新日期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 关键点

  1. 趋势线延伸:从 window_start_date 延伸到 window_end_date
  2. 斜率计算:使用公式数据中的 index 字段计算
  3. 坐标映射:将日期映射到 K 线数据的索引位置
  4. 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 形态有效性判定条件

  1. 收敛比 (width_ratio)width_end / width_start <= shrink_ratio(默认 0.8
  2. 触碰点数量touches_upper >= 2touches_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: 使用中文名称(如"英伟达"),程序会自动通过搜索接口获取正确的 tickerNVDA.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