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

MT5 EA 回测报告分析工具集

一套通用、可复用的 MetaTrader 5 EA 回测报告分析工具。读取 MT5 Strategy Tester 导出的 xlsx 报告,输出自包含 HTML(内联 SVG,无图片依赖,AI 可解析表格、人类可读可视化),辅助 EA 优化决策。

不针对任何具体 EA —— 所有分析逻辑数据驱动,换一份报告即自动重新计算与诊断。

📖 不懂这些指标? 先读 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+
  • 依赖:openpyxlpandasnumpy
pip install openpyxl pandas numpy

基本用法

把两份 MT5 回测报告(通常 IS / OSS 各一份)放进目录,命名为 IS-*.xlsxOSS-*.xlsx

python run_analysis.py
# 或显式指定:
python run_analysis.py IS-ReportTester-12345.xlsx OSS-ReportTester-12345.xlsx

生成的 output/report.html 可直接浏览器打开。

各模块独立使用

# 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 报告,一次性汇总成排名表 + 指标分布 + 异常检测:

# 扫描目录下的所有 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 等)
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段),逐窗算指标:

  • WFEWalk-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 示例:

{"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

S
Description
MT5 EA 回测报告通用分析工具集:解析器、IS/OSS对比、What-If假设分析、蒙特卡洛、Walk-Forward、参数敏感度扫描、MAE/MFE分析,输出自包含HTML
Readme 20 MiB
Languages
HTML 99.9%