1. 盘口数据与时间戳基础

在盘口策略里,“时间戳对齐”不是数据清洗的附属步骤,而是决定策略是否可信的第一道关口。很多回测看起来收益惊人、实盘却迅速失效,根源往往不在信号本身,而在于回测时用到了当时还不可能获得的信息——这类问题统称为“未来函数”或“数据泄漏”。要防住它,必须先弄清楚盘口数据长什么样、时间戳有哪几种、它们各自的语义是什么。

一、盘口快照与逐笔数据:两种不同的“市场切片”

行情数据通常分为两大类。第一类是盘口快照(Snapshot / Level-2 行情),它按固定频率(例如每 100ms、每 500ms 或每 3 秒)对订单簿做一次“拍照”,记录买一至买十、卖一至卖十的价格与挂单量,以及最新价、成交量、成交额等汇总字段。快照是“状态量”,每一行描述的是某一时刻订单簿的完整截面。

第二类是逐笔数据(Tick / 逐笔委托与逐笔成交),它记录的是“事件流”:每一笔委托的进入、撤单、成交,都带一条独立记录。逐笔数据是“增量”,需要按顺序回放才能重建出任意时刻的订单簿。两者关系可以理解为:逐笔是原始事件,快照是事件累积后的定期截面。

这个区别直接决定了时间戳对齐的难度。快照自带一个“截面时刻”,对齐相对简单;逐笔数据是流式的,必须严格按事件时间排序、按序消费,一旦乱序或延迟处理,重建出的盘口就会与真实市场错位。

二、三种时间戳:交易所时间、本地接收时间、处理时间

同一条行情记录,往往同时携带多个时间字段,它们的含义完全不同:

  • 交易所时间(Exchange Timestamp):交易所撮合系统生成该条行情的时间,是市场事件的“真实发生时刻”。它通常精度较高(毫秒甚至微秒),但经过网络传输后到达本地时已经滞后。
  • 本地接收时间(Receive Timestamp):本机网卡或行情网关收到该条数据包的本地时钟时刻。它反映“我什么时候真正拿到了这条信息”,是策略可行动的最早时点。
  • 处理时间(Process Timestamp):策略程序从缓冲区取出并开始解析、计算该条数据的时刻。它受程序调度、队列积压影响,通常晚于接收时间。

三者的关系可以概括为:交易所时间 ≤ 本地接收时间 ≤ 处理时间(在时钟大致同步的前提下)。回测中最常见的泄漏,就是用交易所时间去对齐策略决策——相当于假设自己在交易所生成数据的那一瞬间就完成了交易,忽略了网络延迟和处理耗时。正确的做法是:信号计算与下单决策,必须以“本地接收时间”或更保守的“处理时间”为可用时点。

一条行情记录的三段时间轴与可用时点 时间 交易所时间 T_ex 本地接收时间 T_rx 处理时间 T_proc 网络传输 + 行情网关排队 程序调度 + 解析 + 队列积压 策略可行动的最早时点:T_rx(保守可用 T_proc) 若用 T_ex 对齐决策 → 隐含“零延迟成交”假设 → 未来函数泄漏 对齐原则:信号在 T_rx 之后才可见,成交价取 T_rx 之后的第一笔可成交行情 逐笔数据须按事件时间排序消费,乱序或延迟处理会重建出错误盘口

三、时钟同步:让三段时间可比

三种时间戳只有在时钟同步的前提下才能相互比较。交易所时间来自交易所的授时系统,本地接收时间和处理时间来自本机时钟。如果本机时钟比标准时间快 200ms,那么“本地接收时间”就会虚高,导致你以为数据到得很早,实际上并没有。工程上通常用 NTP 或 PTP 做时钟同步:NTP 精度在毫秒到几十毫秒,PTP(IEEE 1588)在支持硬件时间戳的网卡上可做到微秒级。

实操中应定期记录本机时钟与参考源的偏差,并在数据落库时同时保存原始时间戳和同步偏差估计值。对于高频盘口策略,建议至少做到毫秒级同步,并在回测框架中显式引入“接收延迟分布”,而不是假设延迟为零。

四、常见时间语义与对齐约定

除了上述三种,实际数据里还会遇到“行情生成时间”“撮合时间”“快照切分时间”等字段。对齐前必须明确每个字段的语义,并在整个策略与回测中保持一致。一个可执行的约定是:

时间字段语义回测中的用途
交易所时间市场事件真实发生时刻仅用于排序与重建订单簿,不用于决策可用时点
本地接收时间本机收到数据的时刻信号可见时点、下单决策时点的基准
处理时间程序开始解析的时刻保守可用时点,用于压力测试与延迟敏感性分析

举个教学示例(以下数值为合理假设,非实测):某快照的交易所时间为 10:00:00.100,网络传输耗时约 8ms,本地接收时间为 10:00:00.108,程序解析耗时 3ms,处理时间为 10:00:00.111。若策略基于该快照的买一价挂单,回测成交时点最早应取 10:00:00.108 之后的第一笔可成交行情,而不是 10:00:00.100。若错误地用 10:00:00.100 对齐,就可能“抢”到一段本不属于自己的价格,回测收益被系统性高估。

建立数据字典是防泄漏的第一步:为每个时间字段写明来源、精度、同步方式和在回测中的用途,并在代码中只允许通过统一的“可用时点”函数取时间,禁止在策略逻辑里直接引用交易所时间做决策。

把这三件事——分清快照与逐笔、辨明三种时间戳、保证时钟同步——做扎实,后续的窗口对齐、特征计算和回测撮合才有可靠的地基。时间语义一旦含糊,后面所有精巧的策略逻辑都建立在流沙之上。