221 lines
9.3 KiB
Markdown
221 lines
9.3 KiB
Markdown
# 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
|
||
- 分析 CSV:MAE/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
|