Ⅴ · 数据与交付 — 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)

K线 2,400成交 112持仓 56胜率 60.7%净盈亏 +13,746.04 USD
图示为该次运行的最后 400 根 K 线与均线 · 页头成交与持仓统计来自同一份引擎输出 · 均由 4.3 所述 JSON 驱动渲染

累计已实现盈亏 · 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 侧验证标记的口径。