Files
2026-07-11 03:22:50 +08:00

221 lines
9.3 KiB
Markdown
Raw Permalink 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.
# MT5 EA 回测报告分析工具集
一套**通用、可复用**的 MetaTrader 5 EA 回测报告分析工具。读取 MT5 Strategy Tester 导出的 xlsx 报告,输出自包含 HTML(内联 SVG,无图片依赖,AI 可解析表格、人类可读可视化),辅助 EA 优化决策。
不针对任何具体 EA —— 所有分析逻辑数据驱动,换一份报告即自动重新计算与诊断。
> 📖 **不懂这些指标?** 先读 [METRICS_GUIDE.md](METRICS_GUIDE.md) —— 用大白话解释所有指标的原理、公式、好坏阈值和"出了问题该改什么"。
## 功能概览
| 模块 | 作用 | 输出 |
|---|---|---|
| `mt5_report_parser.py` | 解析 MT5 中文 xlsx 报告(设置/结果/订单/成交),重建逐笔交易 | `MT5Report` 对象 |
| `run_analysis.py` | 主分析器:核心指标对比、What-If 假设、蒙特卡洛、方向/时段诊断、数据驱动建议 | `report.html` |
| `batch_report.py` | **新增** 大批量报告汇总:排名表 + 分布图 + 异常检测 | `batch_report.html` |
| `walk_forward.py` | Walk-Forward 滚动 IS→OOS 验证,算 WFE 与泛化相关性 | `walk_forward.html` |
| `param_scan.py` | 参数敏感度扫描:网格 .set 生成 → 响应面 → 高原检测 → **输出优化后 .set** | `param_scan.html` + `.set` |
| `mae_mfe.py` | MAE/MFE 分析:散点 + TP/SL 扫描热力图,附 MQL5 导出代码 | `mae_mfe.html` |
## 快速开始
### 环境要求
- Python 3.9+
- 依赖:`openpyxl``pandas``numpy`
```bash
pip install openpyxl pandas numpy
```
### 基本用法
把两份 MT5 回测报告(通常 IS / OSS 各一份)放进目录,命名为 `IS-*.xlsx``OSS-*.xlsx`
```bash
python run_analysis.py
# 或显式指定:
python run_analysis.py IS-ReportTester-12345.xlsx OSS-ReportTester-12345.xlsx
```
生成的 `output/report.html` 可直接浏览器打开。
### 各模块独立使用
```bash
# Walk-Forward 滚动验证
python walk_forward.py IS-ReportTester-12345.xlsx --is-days 60 --oos-days 30
# 参数敏感度扫描(三步)
python param_scan.py gen-set template.set grid.json out_setdir --ea MyEA
# (在 MT5 里跑 out_setdir/run_scan.bat,把报告放到 out_setdir/reports/
python param_scan.py analyze out_setdir/reports out_setdir/manifest.csv \
--x FastMA --y SlowMA --metric pf \
--template template.set --out-set output/optimized.set --strategy plateau
# MAE/MFE 分析
python mae_mfe.py --show-snippet > mae_mfe_snippet.mqh # 取 MQL5 代码
# (把代码粘进 EA,回测后得到 mae_mfe_*.csv
python mae_mfe.py mae_mfe_2026-06-28.csv
```
## 项目结构
```
.
├── mt5_report_parser.py # 通用 MT5 xlsx 解析器(含 LRU 缓存 + 公共 _seg_metrics
├── run_analysis.py # 主分析器(含 What-If/蒙特卡洛/规则建议/Walk-Forward 集成)
├── batch_report.py # 新增:大批量报告汇总(排名 + 分布 + 异常检测)
├── walk_forward.py # Walk-Forward 滚动验证(向量化边界查找)
├── param_scan.py # 参数敏感度扫描 + 优化 .set 输出
├── mae_mfe.py # MAE/MFE 分析 + MQL5 代码片段
├── output/ # 生成产物(HTML/.set,已入库便于在线预览)
│ ├── report.html
│ ├── batch_report.html
│ ├── walk_forward.html
│ ├── param_scan.html
│ └── mae_mfe.html
├── .gitignore
├── README.md
└── METRICS_GUIDE.md # 指标说明书(大白话解释所有指标原理)
```
### 批量报告分析(新增)
扫描目录下所有 MT5 xlsx 报告,一次性汇总成排名表 + 指标分布 + 异常检测:
```bash
# 扫描目录下的所有 xlsx
python batch_report.py reports_dir
# 指定 glob 模式
python batch_report.py reports_dir --pattern "ReportTester-*.xlsx"
# 通配多目录
python batch_report.py "dir1/*.xlsx" "dir2/*.xlsx"
```
生成的 `output/batch_report.html` 包含:
- 按 PF 排名的综合表
- 按净盈利排名的综合表
- PF/净盈利/胜率分布直方图
- PF vs 胜率散点图(带趋势线)
- 异常检测:过拟合嫌疑 / 样本不足 / 回撤过大自动标记
## 各模块详解
### 1. mt5_report_parser.py — 解析器
解析 MT5 Strategy Tester 导出的中文 xlsx 报告,结构化为:
- `meta`:元信息(EA、品种、期间、初始资金、杠杆、输入参数字典)
- `summary` / `summary_norm`:结果区汇总指标(数值化后的字典)
- `orders` / `deals`:订单与成交明细 DataFrame
- `trades`:由 in/out 成交对**重建的逐笔交易** DataFrame(含 open_time、close_time、direction、net_profit、duration_min 等)
```python
import mt5_report_parser as mp
rep = mp.parse_report("IS-ReportTester-12345.xlsx")
print(rep.meta["专家"], rep.summary["总净盈利"])
print(rep.trades[["open_time","direction","net_profit"]].head())
```
`compute_trade_metrics(trades)` 一次算出:PF、胜率、Sortino、Calmar、滚动PF、最大连败、按方向/小时/星期/持仓时间分桶等扩展指标。
### 2. run_analysis.py — 主分析器
读两份报告,输出 `report.html`,包含 10 个章节:
1. 核心指标对比(PF/胜率/回撤/夏普/Sortino/Calmar/滚动PF
2. 资金曲线(内联 SVG
3. 方向性诊断(多空各自的胜率/PF/盈亏比/期望)
4. **What-If 假设分析**9 个通用场景:sell-only/buy-only/信号反向/过滤最差时段/仓位减半/盈利单放大/亏损截断/启用BE)
5. 蒙特卡洛回撤模拟(1000 次打乱,检验顺序自相关)
6. 时段诊断(小时/星期热力表,标 IS/OSS 双负窗口)
7. 持仓时间分桶
8. **数据驱动的优化建议**(8 条规则按数据特征自动触发,每条附"触发条件→数据→动作")
9. Walk-Forward 滚动验证(内嵌)
10. 可选扩展分析指引
**关键设计**:建议规则不预设任何策略特定结论。例如"信号方向自检"规则仅当两份报告的"信号反向"场景净盈利均转正且 PF>1 时才触发,提示用户复核源码方向逻辑。
### 3. walk_forward.py — Walk-Forward 验证
将单份报告按时间切成多个滚动窗口(IS段 + OOS段),逐窗算指标:
- **WFE**Walk-Forward Efficiency= ΣOOS净盈利 / ΣIS净盈利
- **IS-OOS PF 相关性**:高=参数泛化好,低=过拟合风险
- OOS 盈利窗口占比
- 滚动 IS/OOS PF 曲线 SVG
可独立运行,也已集成进主报告第 9 节。
### 4. param_scan.py — 参数敏感度扫描
三个子命令:
- `gen-set`:读 `grid.json` + .set 模板,批量生成每个参数组合的 .set + manifest.csv + MT5 批处理脚本 + tester.ini 模板
- `analyze`:读 manifest + 一批报告,构建响应面
- `demo`:合成数据演示
**响应面分析**
- 2D 热力图(参数X × 参数Y → 指标,标出高原 P1/P2/P3
- 3D 等距投影曲面
- **高原检测**:4-连通区域 ≥4 格且高于 80 分位 → 稳健参数区
- **过拟合评分**:峰值孤立度 + 高原覆盖率 → 稳健性 0~1
- **直接输出优化后 .set**:支持两种策略
- `--strategy plateau`(默认,推荐):取最大高原中心,抗扰动
- `--strategy peak`:取单点峰值,激进易过拟合
`grid.json` 示例:
```json
{"FastMA": [5,10,15,20,25], "SlowMA": [20,30,40,50], "StopLoss": [50,100]}
```
### 5. mae_mfe.py — MAE/MFE 分析
MT5 标准 xlsx 不含逐笔 MAE/MFE。本模块提供:
- `--show-snippet`:输出 MQL5 代码,粘进 EA 的 OnDeinit,自动扫描每笔持仓期的 iHigh/iLow 算 MAE/MFE 导出 CSV
- 分析 CSVMAE/MFE vs 盈亏散点(绿赢红输 + SL/TP 候选阈值线)
- TP×SL 网格扫描热力图:扫描所有组合重算理论净盈利,标最优点
- 推荐:SL = 亏损笔 MAE 75 分位;TP = 盈利笔 MFE 中位
## 设计原则
1. **通用可复用**:脚本零硬编码,不依赖任何具体 EA 的参数名/阈值/结论
2. **数据驱动**:所有"建议"由当前数据的特征触发,非预写
3. **自包含输出**:HTML 全部用纯表格 + 内联 SVG,无外部图片/JS/CSS 依赖,AI 可直接解析数据
4. **输入仅依赖** mt5_report_parser 解析出的结构化数据
## 关于示例数据
出于交易策略数据敏感性,示例回测报告(`IS-*.xlsx` / `OSS-*.xlsx`)已通过 `.gitignore` 排除。`output/` 下的 HTML 为真实数据生成的示例产物,可供预览效果。
如需本地试跑,将自己的 MT5 报告按 `IS-*.xlsx` / `OSS-*.xlsx` 命名放入根目录即可。
## 依赖
| 包 | 用途 |
|---|---|
| `openpyxl` | 读取 xlsx |
| `pandas` | 数据处理 |
| `numpy` | 数值计算 |
无 matplotlib 等重型绘图库,所有可视化用纯 SVG。
## 性能优化
对大批量报告分析场景做的关键优化:
| 优化 | 位置 | 说明 |
|---|---|---|
| Monte Carlo 向量化 | `run_analysis.py` | 1000 次置换矩阵一次性生成,C 层完成随机打乱 |
| TP/SL 扫描向量化 | `mae_mfe.py` | 30×30×N 笔 → NumPy 广播,消除 Python 嵌套循环 |
| Walk-Forward 边界查找 | `walk_forward.py` | `np.searchsorted` 替代逐行 DataFrame 切片 |
| 解析结果缓存 | `mt5_report_parser.py` | 文件级 LRU 缓存,同一份报告被多模块复用时不再重复 IO |
| 公共指标函数 | `mt5_report_parser.py` | `_seg_metrics` / `_stats_from_net` 合并为 `compute_segment_metrics`,消除重复代码 |
## License
MIT