# 收敛三角形检测系统 - 使用指南

> 最后更新：2026-01-22  
> 版本：v1.0

## 目录

1. [系统概述](#系统概述)
2. [快速开始](#快速开始)
3. [参数配置](#参数配置)
4. [脚本说明](#脚本说明)
5. [输出文件](#输出文件)
6. [算法原理](#算法原理)
7. [常见问题](#常见问题)

---

## 系统概述

收敛三角形检测系统用于自动识别股票K线中的收敛三角形形态，并计算突破强度分数进行选股。

### 功能特点

- **批量检测**：支持多股票、多日期的滚动窗口检测
- **突破强度评分**：0~1 连续分数，量化突破有效性
- **可视化图表**：自动生成个股三角形图表
- **选股报告**：每日 Markdown 格式选股简报

### 系统架构

```
technical-patterns-lab/
├── src/
│   └── converging_triangle.py    # 核心算法
├── scripts/
│   ├── triangle_config.py        # 参数配置（统一管理）
│   ├── run_converging_triangle.py    # 批量检测
│   ├── report_converging_triangles.py # 报告生成
│   ├── plot_converging_triangles.py   # 图表绘制
│   └── pipeline_converging_triangle.py # 一键流水线
├── outputs/converging_triangles/
│   ├── all_results.csv           # 全部检测结果
│   ├── report.md                 # 选股报告
│   └── charts/                   # 个股图表
└── data/
    └── pkl/                      # OHLCV 数据文件
```

---

## 快速开始

### 1. 一键运行（推荐）

```bash
cd technical-patterns-lab
python scripts/pipeline_converging_triangle.py
```

这会依次执行：
1. 批量检测 → 生成 `all_results.csv`
2. 报告生成 → 生成 `report.md`
3. 图表绘制 → 生成 `charts/*.png`

### 2. 指定日期运行

```bash
python scripts/pipeline_converging_triangle.py --date 20260120
```

### 3. 跳过部分步骤

```bash
# 跳过检测（使用已有结果），只生成报告和图表
python scripts/pipeline_converging_triangle.py --skip-detection

# 只运行检测
python scripts/pipeline_converging_triangle.py --skip-report --skip-plot
```

### 4. 单独运行各步骤

```bash
# 批量检测
python scripts/run_converging_triangle.py

# 生成报告
python scripts/report_converging_triangles.py

# 绘制图表
python scripts/plot_converging_triangles.py
```

---

## 参数配置

所有参数统一在 `scripts/triangle_config.py` 中管理：

### 检测参数（当前使用严格模式）

| 参数 | 严格模式 | 默认模式 | 宽松模式 | 说明 |
|------|----------|----------|----------|------|
| `window` | 120 | 120 | 120 | 检测窗口（交易日） |
| `pivot_k` | 15 | 15 | 15 | 枢轴点检测周期 |
| `shrink_ratio` | **0.6** | 0.8 | 0.85 | 收敛比例阈值 |
| `break_tol` | **0.005** | 0.001 | 0.001 | 突破判定容差 |
| `vol_k` | **1.5** | 1.3 | 1.2 | 放量确认倍数 |

### 数据范围配置

| 参数 | 值 | 说明 |
|------|-----|------|
| `RECENT_DAYS` | 500 | 计算最近 N 个交易日 |
| `DISPLAY_WINDOW` | 500 | 图表显示范围 |
| `ONLY_VALID` | True | 只输出有效三角形 |

### 切换参数模式

编辑 `scripts/triangle_config.py`，修改 `DETECTION_PARAMS` 的定义：

```python
# 当前使用严格模式（推荐）
DETECTION_PARAMS = ConvergingTriangleParams(
    shrink_ratio=0.6,    # 更严格的收敛要求
    break_tol=0.005,     # 更明显的突破
    vol_k=1.5,           # 更强的放量要求
    ...
)
```

---

## 脚本说明

### run_converging_triangle.py

**功能**：批量检测收敛三角形

**输出**：
- `outputs/converging_triangles/all_results.csv`
- `outputs/converging_triangles/strong_breakout_up.csv`
- `outputs/converging_triangles/strong_breakout_down.csv`

**耗时**：约 15-20 秒（108只股票 × 500天）

---

### report_converging_triangles.py

**功能**：生成 Markdown 选股报告

**参数**：

```bash
# 指定报告日期
python scripts/report_converging_triangles.py --report-date 20260120

# 指定输入输出路径
python scripts/report_converging_triangles.py \
    --input outputs/converging_triangles/all_results.csv \
    --output outputs/converging_triangles/report.md
```

**输出**：`outputs/converging_triangles/report.md`

---

### plot_converging_triangles.py

**功能**：绘制个股收敛三角形图表

**参数**：

```bash
# 指定日期
python scripts/plot_converging_triangles.py --date 20260120

# 指定输出目录
python scripts/plot_converging_triangles.py --output-dir outputs/converging_triangles/charts
```

**输出**：`outputs/converging_triangles/charts/*.png`

**特点**：
- 每次运行自动清空旧图片
- 显示 500 天历史走势
- 检测窗口 120 天高亮显示
- 支持中文字体（SimHei/Microsoft YaHei）

---

### pipeline_converging_triangle.py

**功能**：一键执行完整流水线

**参数**：

| 参数 | 说明 |
|------|------|
| `--date YYYYMMDD` | 指定目标日期 |
| `--skip-detection` | 跳过批量检测 |
| `--skip-report` | 跳过报告生成 |
| `--skip-plot` | 跳过图表绘制 |

**输出**：流水线执行摘要，包含各步骤耗时

---

## 输出文件

### all_results.csv

所有有效收敛三角形检测结果。

| 字段 | 类型 | 说明 |
|------|------|------|
| `stock_idx` | int | 股票索引 |
| `stock_code` | str | 股票代码 |
| `stock_name` | str | 股票名称 |
| `date` | int | 日期（YYYYMMDD） |
| `is_valid` | bool | 是否有效三角形 |
| `breakout_strength_up` | float | 向上突破强度（0~1） |
| `breakout_strength_down` | float | 向下突破强度（0~1） |
| `breakout_dir` | str | 突破方向：up/down/none |
| `width_ratio` | float | 收敛比例（末端/起始宽度） |
| `volume_confirmed` | bool | 是否放量确认 |
| `touches_upper` | int | 触碰上沿次数 |
| `touches_lower` | int | 触碰下沿次数 |

### report.md

每日选股简报，包含：
- 数据说明（股票池、检测窗口、算法）
- 当日统计（总数、向上/向下/无突破）
- 向上突破排名表
- 向下突破排名表
- 无突破形态列表

### charts/*.png

个股图表，文件名格式：`{date}_{stock_code}_{stock_name}.png`

图表内容：
- 上半部分：K线走势 + 趋势线
- 下半部分：成交量柱状图
- 标题：股票信息 + 检测/显示范围

---

## 算法原理

### 收敛三角形定义

收敛三角形是一种技术形态，特征为：
1. **上沿下倾**：高点连线斜率 ≤ 0（或轻微上倾）
2. **下沿上翘**：低点连线斜率 ≥ 0（或轻微下倾）
3. **逐渐收敛**：末端宽度 < 起始宽度
4. **多次触碰**：价格至少 2 次触碰上下沿

### 检测流程

```
1. 枢轴点检测
   └── 使用分形方法找出局部高点/低点

2. 边界线拟合
   └── 分段取极值 + 线性回归

3. 形态验证
   ├── 斜率约束检查
   ├── 收敛度检查（width_ratio < shrink_ratio）
   └── 触碰程度检查（loss < touch_loss_max）

4. 突破判定
   ├── 向上突破：close > upper_line × (1 + break_tol)
   └── 向下突破：close < lower_line × (1 - break_tol)

5. 强度计算
   └── 加权求和：价格分(60%) + 收敛分(25%) + 成交量分(15%)
```

### 突破强度公式

```python
strength = 0.60 × tanh(突破幅度% × 15) +  # 价格分
           0.25 × (1 - width_ratio) +        # 收敛分
           0.15 × vol_bonus                   # 成交量分
```

详见 [突破强度计算方法.md](./突破强度计算方法.md)

---

## 常见问题

### Q1: 图表中文乱码？

确保系统安装了中文字体（SimHei 或 Microsoft YaHei）。脚本已配置：

```python
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
```

### Q2: 检测结果太少/太多？

调整 `scripts/triangle_config.py` 中的参数：
- 结果太少 → 使用宽松模式（`shrink_ratio=0.85`）
- 结果太多 → 使用严格模式（`shrink_ratio=0.6`）

### Q3: 突破强度都很高？

旧版本公式有此问题，已在 v2.0 修复。确保使用最新的 `src/converging_triangle.py`。

### Q4: 如何添加新股票？

将 OHLCV 数据以 `.pkl` 格式放入 `data/pkl/` 目录，格式要求：
- 二维 numpy 数组，shape=(n_stocks, n_days)
- 文件名：`open.pkl`, `high.pkl`, `low.pkl`, `close.pkl`, `volume.pkl`

### Q5: 如何调整检测窗口？

修改 `scripts/triangle_config.py`：

```python
DETECTION_PARAMS = ConvergingTriangleParams(
    window=120,  # 修改此值（如 60, 90, 180）
    ...
)
```

---

## 版本历史

| 版本 | 日期 | 更新内容 |
|------|------|----------|
| v1.0 | 2026-01-22 | 初始版本，加权求和公式，严格模式 |

---

## 相关文档

- [突破强度计算方法.md](./突破强度计算方法.md) - 突破强度公式详解
- [converging_triangles_outputs.md](./converging_triangles_outputs.md) - 输出文件字段说明
- [2026-01-16_converging_triangle_algorithm.md](./2026-01-16_converging_triangle_algorithm.md) - 算法设计文档
