2026年九月25日 · 研究

如何判断回测使用的市场数据当时是否真的可交易?

如何判断回测使用的市场数据当时是否真的可交易?

一条市场数据记录即使完全准确,也未必能作为回测的可靠依据。交易确实发生过,价格无误,时间戳也有效;但数据流可能延迟送达,供应商可能事后修正数据,报价所对应的市场也可能不是策略能够接入的市场。

要判断历史数据当时是否可交易,不能只审查事件时间。你还需要弄清这条记录描述的是什么、何时对系统可用、对应哪个交易场所或合约,以及报价或成交是否足以合理支持你的订单。

历史价格准确,就足以用于回测吗?

不够。准确性回答的是:“数据源最终记录的价格是多少?”回测还需要回答:“策略在做决策时能知道什么?”以及“它能成交什么?”这是两个不同的问题。

假设一笔加密货币交易在 12:00:00.120 成交,但数据供应商的数据流直到 12:00:00.480 才将它送达你的进程。在 .200 做决策的策略无法使用这笔成交,即使它的事件时间早于决策时间。如果历史文件只保留事件时间,回测可能会悄悄让策略获得实时运行时尚未收到的信息。

时间或字段含义缺失时的回测问题
事件时间交易所记录的事件发生时间把市场时间误当成策略可用时间
接收时间采集器收到消息的时间把延迟数据当作即时到达的数据使用
序列号或更新 ID事件在数据流中的顺序位置更新应用顺序错误,或被悄悄跳过
修订时间修正后的历史值何时才为人所知使用了原始数据流中当时并不存在的值进行回测

如果你的存档里没有接收时间,就应如实说明这个缺口。你可以测试某种延迟假设,或将结论限定为基于事件时间的研究。但你无法根据从未保存过的时间戳,还原当时的确切信息集。

如何判断报价是否可执行?

先看订单实际会送达哪个市场。综合最优买价和卖价可以汇总多个交易场所的数据,但它无法证明你的账户能使用展示的挂单量、订单到达时该报价仍然有效,或该交易场所会接受你的订单类型。

对于市价单,用中间价作为成交价通常不切实际。更有用的估算方式是根据订单规模逐档消耗可见订单簿,再加上手续费以及延迟或冲击假设。如果你只有最优买卖价数据,就应限制结论范围:你可以估算第一档,但无法推断从未记录的深度。

对于限价单,价格触及限价不等于成交。排在你前面的订单可能先消耗可用数量。普通快照通常无法得知队列位置,因此基于价格触及来判定成交,应视为乐观情景,而不是对实际发生情况的事实陈述。

1 分钟 K 线可以告诉你最低价曾跌破你的限价,但无法说明你的挂单是否在触及低点前到达交易场所、当时成交了多少,或有多少订单排在你前面。

信任一份市场数据存档前,我该检查什么?

我会先检查那些看似普通的属性。相比在有问题的数据流上强行套用复杂的执行模型,这些检查能发现更多研究错误。

最后这项检查听起来简单得不能再简单了。我曾花了一上午追查一个看似明显的波动率状态变化,最后发现只是数据流迁移后,数量字段切换了单位。图表画得很漂亮,单位却错了。

如何测试数据可用性是否会改变结果?

围绕策略的决策边界做一组小型敏感性测试。按照现实延迟推迟可用数据,丢弃序列连续性中断的更新,并在有实际交易场所订单簿数据时,用它比较成交结果。报告原始结果和数据退化后的结果。如果很小的延迟就能抹去策略效果,它可能依赖某种你的数据采集设置无法稳定提供的信息优势。

举个具体例子:假设最佳买价上涨 1 个 tick 时触发信号。分别用交易所事件时间和采集器接收时间重放一次。如果事件时间版本交易了 40 次,而接收时间版本交易了 27 次,这个差异本身就是策略证据的一部分。每种重放下的表现也同样重要。不要因为较弱版本的数据看起来不够漂亮,就把它藏起来。

模拟交易是很有用的下一步检查,因为它能在研究系统实际使用的同一运行链路中暴露数据流延迟、过时报价、代码映射错误和交易场所过滤规则。不过,它仍无法复现所有真实队列情况或市场冲击。应清楚标明这条界限。

“可交易数据”在实践中意味着什么?

这意味着回测能够说明观测何时发生、策略何时可以使用、数据来自哪个市场,以及有哪些执行依据支持假设的成交。干净的价格序列只是起点。只有当时间、接入权限和成交假设经得起检查,并且弱化这些假设后结果仍然合理,研究结论才可信。

市场数据回测数据工程执行模拟交易
← 全部文章