我们的回测将 100 笔已提交订单中的 91 笔计为成交。纸面交易中,同一策略只成交了 63 笔。从信号发出到订单确认的中位耗时为 84 毫秒;纸面交易中有 12 笔未成交订单是限价单,回测却假设只要价格触及限价就会立即成交。
这 28 个百分点的差距起初看起来像是策略出了问题,直到我们把下单决策和成交决策分开分析。两次运行中,策略选择的方向、规模和价格几乎相同。不同的是执行路径:有些订单到达得太晚,有些一直处于未完成状态,还有些订单到达时市场已经变了。
回测与纸面交易的订单一致性是什么意思?
一致性是指,回测和纸面系统根据相同的可用信息做出可比的决策,并明确处理两者执行模型的差异。这并不意味着每笔模拟成交都应与纸面交易中的成交相匹配。历史 K 线无法还原排队位置,而且纸面交易平台使用的撮合模型也可能与实盘交易所不同。
真正有用的问题更具体:对于策略打算下的每笔订单,你能否解释接下来发生了什么?交易笔数和最终收益掩盖了太多细节。为每个决策保留一条关联记录,并让稳定的策略决策 ID 贯穿信号、订单、确认、撤单和成交事件。
| 比较项 | 能发现什么 | 示例 |
|---|---|---|
| 决策时间和方向 | 输入或调度不同 | 纸面交易信号晚了 1 根 K 线才触发 |
| 请求的规模和价格 | 舍入、风险控制或交易场所规则 | 回测提交 0.013 BTC;纸面交易舍入为 0.01 |
| 订单状态变化 | 提交、拒绝和撤单环节的差异 | 回测把撤单请求当作撤单已完成 |
| 成交数量和价格 | 成交模型过于乐观或市场走势变化 | 限价触及后,回测将订单全额计为成交,纸面交易却没有成交 |
为什么触及限价的订单造成了这么多漏单?
我们的回测使用 1 分钟 K 线。如果限价落在某根 K 线的最高价和最低价范围内,回测就将订单标记为已成交。这条规则回答的是市场是否曾在这一分钟内以该价格成交过,却无法说明当时我们的订单是否已经生效、是否排在队列首位,或订单到达后是否有足够的成交量。
纸面交易日志揭示了时序问题。策略在 12:03:00.000 计算出信号,但行情数据事件晚了 31 毫秒才到达订单处理进程。风险检查又耗时 22 毫秒,而交易场所模拟器在此之后 31 毫秒才确认订单。在快速波动中,历史 K 线会让某个价格看起来触手可及,但限价单到达时,市场可能早已离开该价位。
此外,回测已经继续执行,纸面交易中却还有 12 笔订单处于挂单状态。模拟器把撤单请求当作订单立即消失来处理。纸面系统中,撤单确认晚些时候才到;这段时间里有 3 笔订单成交了。这改变了下一个信号看到的持仓。
如何衡量差距,避免误导自己?
先按订单意图生成一份简明的对账报告,并明确展示分母。“成交率”可能指已成交订单数除以已提交订单数、已成交数量除以请求数量,或已成交订单数除以到达交易场所的订单数。这些指标回答的是不同问题。
- 用决策 ID 或客户订单 ID 关联事件,不要事后根据猜测的时间戳来匹配。
- 先比较决策:信号时间、方向、请求数量、订单类型和限价。
- 对于决策相匹配的订单,比较确认延迟、拒单情况、挂单时间、撤单时间、成交数量和成交量加权成交价。
- 按订单类型和市场状况报告比率。整体成交率为 63% 时,市价单可能达到 90%,而被动限价单只有 35%。
清晰区分各类订单。被拒绝的订单不等于未成交订单;部分成交不等于全部成交;部分成交后撤销的订单仍然改变了持仓。订单数和请求数量都要统计,避免一批小额订单让结果显得比实际更好。
回测应该做哪些调整?
选择与数据分辨率和预期订单行为相符的成交规则。使用 K 线时,限价被触及只说明订单可能成交,并不能证明它确实成交。你可以保守地模拟部分成交、要求价格穿过限价,或排除无法估算排队位置的被动订单。每种选择回答的问题都不同;请记录所用规则,并在不止一种合理规则下比较结果。
同时模拟订单状态。系统收到终结事件前,订单都仍然有效;撤单请求也不会立即消除风险敞口。如果策略能在第一笔订单仍待处理时再提交第二笔,回测就需要模拟这种竞态,或在设计上避免它。
成交模型表达的是你的订单可能如何成交。为它设定一条你能解释的规则,然后用纸面交易日志检验这条规则。
对于这 28 个百分点的差距,最出乎意料的并不是分钟级 K 线回测高估了被动成交,而是由于遗漏了撤单时序,策略在下一次决策之前持仓就已经出现偏差。我们修正订单状态模型,并停止把每次触及限价都视为成交后,纸面交易的对比结果不再那么好看,却更有参考价值。
这就是订单一致性的实际标准:模拟行为和纸面交易行为之间每个有意义的差异都有记录在案的原因;如果数据无法支撑确定结论,回测就不声称结果确定。
← 全部文章


