Ⅴ · 数据与交付 — 5.4
验证清单与实验
十个环节,逐格标注状态。空白的格子保持空白——不做推测填充。
| 环节 | 状态 | 说明 | |
|---|---|---|---|
| 1 | 数据 | ✓ 部分 | 存储方案与私有化部署链路已实测;未接入真实行情 |
| 2 | 想法验证 | 文档 | |
| 3 | 回测保真 | ✓ 部分 | 引擎链路已跑通(见下);与 MT5 的差异未比对 |
| 4 | 参数与稳健性 | 文档 | |
| 5 | 策略实现 | ✓ 已实测 | Nautilus 为运行时实测;LEAN 为 .pyi 存根静态核对——该环境下 import QuantConnect 因缺 clr 失败 |
| 6 | 部署运行 | ? 盲区 | 需真实券商环境 |
| 7 | 执行 | ? 盲区 | 拒单率、部分成交、对账漂移未实测 |
| 8 | 风控 | ✓ 已实测 | 两种架构已检视,含 Nautilus 组合级风控的实现边界 |
| 9 | 观测归因 | 文档 | |
| 10 | 界面可视化 | ✓ 部分 | 渲染链路已跑通(见下) |
两个盲区集中在 6 / 7,共同特征是需要真实运行环境才能填写。
已跑通的链路
下图由一次真实的 NautilusTrader 引擎运行产出,验证 2.1 的架构主张与三段渲染链路。行情为合成序列——验证对象是链路,不是策略绩效。
EUR/USD · 15M · EMACross(12,34)
累计已实现盈亏 · 56 笔平仓
本次运行暴露的一个真实约束:仅向撮合引擎提供单边(BID)序列时,全部订单被拒,原因 no market。撮合需要双边市场——点差是成交模拟的前提而非事后调整项,这正是“回测保真”一格的具体含义。
三步实验
每步可独立失败并终止,前一步不通过则无需进入下一步。
第 0 步 · 3 天 · 不引入框架
MT5 导出 EUR/USD 历史 → 转 Parquet → Jupyter + pandas 实现 FVG 检测 → plotly 绘图 → 与 MT5 图表上的同名指标逐个比对。
回答的问题:同一份数据、同一条规则,两侧计算结果是否一致。
| 预期差异源 | 具体表现 |
|---|---|
| 时区 | MT5 服务器时间通常为 GMT+2/+3 且随夏令时切换,导出数据可能为 UTC |
| bar 时间戳含义 | 标记开盘时刻或收盘时刻,相差一个周期 |
| 周末 gap 与缺失 bar | MT5 有成交才生成 bar,重采样默认补齐空 bar |
| 报价基准 | 图表基于 bid,导出数据可能为其他基准 |
本步的实际产出即这四项的实测结论。这四类差异在 LEAN 的私有化部署中同样出现(见 5.2 的四个隐性约定)——说明它们不是 MT5 特有的坑,而是跨系统对接的通例。
第 1 步 · 1 周
同一信号在框架内回测,与 MT5 策略测试器结果比对,差异归因到具体环节。
第 2 步 · 3 天
KLineCharts 静态页面读取第 1 步产出的 JSON,绘制 K 线、FVG 矩形与成交点。不含后端服务与实时推送。
{
"bars": [{"t": 1704067200, "o": 1.0842, "h": 1.0851,
"l": 1.0839, "c": 1.0847}],
"overlays": [
{"type": "rect", "t1": 1704067200, "p1": 1.0851,
"t2": 1704070800, "p2": 1.0839, "label": "FVG"}
]
}
起步技术栈
| 层 | 选型 | 引入时机 |
|---|---|---|
| 数据格式 / 查询 | Parquet + DuckDB | 第 0 步 |
| 研究 | 编辑器 + .ipynb + plotly |
第 0 步 |
| 版本 | git + notebook 输出剥离 + 参数文件 + 数据 manifest | 第 0 步 |
| 引擎 | Nautilus 或 LEAN(按 3.6 决策树) | 第 1 步 |
| 展示 | KLineCharts 静态页 | 第 2 步 |
| ClickHouse / 实时服务 / 多账户 | 暂不引入 | 出现实际需求时 |
实测环境
Python 3.12.13 · nautilus-trader 1.231.0 · quantconnect-stubs 18056
LEAN engine quantconnect/lean:latest(13.1 GB / 35 层) · lean-cli 1.0.229
Docker 29.7.2 · Ubuntu x86_64 · 离线验证以 docker run --network none 完成
metatrader5:无可用 wheel(仅 win_amd64)
本文经过一次独立事实核查,逐条复核 API 名称、类名、枚举成员与计数,并对「MT5 没有 X」一类断言做了反向验证。核查发现的问题已修订,涉及:Nautilus 实盘内核的引擎继承关系、MQL5 的账户级持仓枚举能力、MT5 的 ONNX 推理支持与状态持久化实现、Instrument 子类计数、组合级风控在两套框架中的实现程度、数据目录缺口检测的语义边界,以及 LEAN 侧验证标记的口径。