# 对称三角形批量检测日志

**日期**: 2026-01-16  
**任务**: 从 pkl 文件批量检测对称三角形

---

## 1. 数据源分析

### pkl 文件结构

| 文件 | 说明 |
|------|------|
| `open.pkl.pkl` | 开盘价矩阵 |
| `high.pkl.pkl` | 最高价矩阵 |
| `low.pkl.pkl` | 最低价矩阵 |
| `close.pkl.pkl` | 收盘价矩阵 |
| `volume.pkl.pkl` | 成交量矩阵 |

### pkl 内部数据结构

```python
{
    'mtx_save': ndarray (108, 5113),  # 主数据矩阵: 108只股票 × 5113个交易日
    'tot_c': ndarray (108,),          # 列索引 [0,1,2,...,107]
    'tot_r': ndarray (5113,),         # 有效行索引（日期序号，非连续）
    'shape_c': 108,                   # 原始列数
    'shape_r': 7698,                  # 原始总行数（含空行）
}
```

### 加载方式

两种加载方式对比：

| 方式 | 返回值 | 适用场景 |
|------|--------|----------|
| 原生 `pickle.load` | `dict` | 需要完整元数据 |
| `g.load_pkl` | `ndarray` | dataServer 环境内，直接使用矩阵 |

**本次采用**: 原生 `pickle.load` + 空壳模块绕过 `model` 依赖

```python
class FakeModule:
    ndarray = np.ndarray

sys.modules['model'] = FakeModule()
sys.modules['model.index_info'] = FakeModule()

with open(pkl_path, 'rb') as f:
    data = pickle.load(f)
```

---

## 2. 检测参数

```python
WINDOW = 400              # 分析窗口大小
PIVOT_K = 20              # 枢轴点检测窗口
BOUNDARY_N_SEGMENTS = 2   # 边界线分段数
BOUNDARY_SOURCE = "full"  # 使用全量 high/low 拟合
UPPER_SLOPE_MAX = 0.10    # 上沿斜率最大值
LOWER_SLOPE_MIN = -0.10   # 下沿斜率最小值
TOUCH_TOL = 0.10          # 触碰容差
TOUCH_LOSS_MAX = 0.10     # 损失函数阈值
SHRINK_RATIO = 0.8        # 收敛比阈值
```

---

## 3. 运行结果

**扫描**: 108 只股票  
**识别成功**: 10 只 (9.26%)

### 识别结果明细

| 股票 ID | 上沿斜率 | 下沿斜率 | 收敛比 | 触碰(上/下) | 突破方向 |
|---------|----------|----------|--------|-------------|----------|
| stock_017 | +0.0025 | +0.0071 | 0.25 | 5/3 | down |
| stock_019 | +0.0021 | +0.0056 | 0.63 | 5/4 | none |
| stock_025 | +0.0009 | +0.0020 | 0.75 | 5/5 | none |
| stock_031 | -0.0097 | -0.0042 | 0.64 | 3/4 | none |
| stock_057 | -0.0002 | +0.0036 | 0.46 | 5/4 | none |
| stock_063 | +0.0105 | +0.0329 | 0.19 | 7/6 | none |
| stock_066 | +0.0089 | +0.0115 | 0.62 | 5/4 | none |
| stock_079 | +0.0056 | +0.0081 | 0.55 | 4/5 | down |
| stock_081 | -0.0029 | +0.0029 | 0.15 | 4/3 | down |
| stock_095 | -0.0028 | +0.0025 | 0.38 | 5/3 | up |

### 突破统计

- **向上突破**: 1 只 (stock_095)
- **向下突破**: 3 只 (stock_017, stock_079, stock_081)
- **未突破**: 6 只

---

## 4. 输出文件

```
outputs/sym_triangles/
├── stock_017.png
├── stock_019.png
├── stock_025.png
├── stock_031.png
├── stock_057.png
├── stock_063.png
├── stock_066.png
├── stock_079.png
├── stock_081.png
├── stock_095.png
└── summary.csv
```

---

## 5. 脚本使用方法

```powershell
# 进入项目目录
cd D:\project\technical-patterns-lab

# 激活虚拟环境
.\.venv\Scripts\Activate.ps1

# 运行批量检测
python scripts/run_sym_triangle_pkl.py
```

---

## 6. 相关文件

| 文件 | 说明 |
|------|------|
| `scripts/run_sym_triangle_pkl.py` | 批量检测脚本 (pkl 数据源) |
| `scripts/run_sym_triangle_json.py` | 单股检测脚本 (JSON 数据源) |
| `src/sym_triangle.py` | 核心算法模块 |
| `data/*.pkl.pkl` | OHLCV 数据文件 |
| `data/map/stock_name.json` | 股票代码映射表 |

---

## 7. 待优化项

- [ ] 关联 `stock_name.json` 显示真实股票代码/名称
- [ ] 图表标题显示真实日期（当前显示索引）
- [ ] 支持自定义股票筛选范围
- [ ] 添加更多形态参数到汇总表
