2. 交易所时间戳体系解析
在时间对齐工作中,最容易犯的错误是把“交易所时间”当成一个单一概念。实际上,一笔订单从进入交易所到最终反馈给交易者,会经过撮合引擎、行情发布系统、私有推送通道等多个环节,每个环节都会打上自己的时间戳。这些时间戳的生成位置不同、语义不同、精度不同,甚至时钟源也可能不同。如果不加区分地混用,后续的对齐计算就会建立在错误的基准上。
本节围绕三类最常用的交易所时间戳展开:撮合时间戳、行情推送时间戳、订单确认时间戳。我们先明确它们各自“在哪里产生、代表什么时刻”,再讨论它们在业务链路中的角色差异,最后给出实际解析时的判断方法。
三类时间戳的生成位置与语义
撮合时间戳(Match/Execution Timestamp)由交易所撮合引擎在订单实际成交的那一刻写入。它记录的是“撮合事件发生的时刻”,是成交回报中最具法律与结算意义的时间字段。典型字段名如 transactTime、matchTime、execTime。这个时间戳的时钟源通常是交易所内部撮合集群的授时系统,精度可达微秒甚至纳秒,但它只对“成交”这一事件负责,不关心行情是否已经发出。
行情推送时间戳(Market Data Timestamp)产生于行情发布系统。它可能包含两个层次:一是行情快照或增量消息在交易所侧生成的时间(如 timestamp、eventTime),二是消息离开交易所、进入推送网关的时间。前者描述“市场状态在这一刻被采样”,后者描述“这条消息开始向外部传输”。很多交易所只暴露其中一个,需要根据字段文档确认。行情时间戳的时钟源可能与撮合引擎不同,尤其在行情系统独立部署时,两者之间可能存在固定或漂移的偏差。
订单确认时间戳(Order Acknowledgement Timestamp)出现在私有订单通道的回报中,例如 ackTime、receiveTime、transactTime(部分交易所在下单确认中复用该字段)。它记录的是交易所订单网关接收并确认订单的时刻,通常早于撮合时间戳。对于未立即成交的限价单,确认时间戳是订单进入交易所簿记的起点;对于立即成交的订单,确认与撮合可能在同一毫秒内先后发生。
为什么不能混用:语义差异带来的对齐偏差
假设交易者用行情推送时间戳去校准订单确认时间戳,会得到什么?行情时间戳描述的是“市场状态被采样”的时刻,订单确认时间戳描述的是“订单被网关接收”的时刻,两者之间隔着撮合引擎的处理延迟和行情系统的发布延迟。用前者减后者,得到的不是时钟偏差,而是“业务链路延迟 + 时钟偏差”的混合量。如果这个混合量被当作纯时钟偏差去修正本地时钟,本地时间就会被系统性地拉偏。
更隐蔽的问题在于字段复用。部分交易所的下单回报中,transactTime 在“订单确认”消息里表示网关接收时间,在“成交回报”消息里表示撮合时间。同一个字段名,在不同消息类型下语义不同。解析时必须结合消息类型(如 execType、ordStatus)判断,而不能只看字段名。
实际解析流程与判断依据
下面给出一套可执行的时间戳解析与归类方法,适用于对接新交易所或排查时间异常的场景。
第一步,建立字段—消息—系统映射表。从交易所 API 文档中逐条摘录时间字段,记录它出现在哪类消息(订单确认、成交回报、行情快照、行情增量)、由哪个系统产生、文档声明的时钟源与精度。对于文档未明确说明的字段,通过抓取实际报文观察其数值范围:若某字段在订单确认消息中总是略早于成交回报中的撮合时间,且差值稳定在毫秒级,可初步判定为网关接收时间。
第二步,用同一笔成交做交叉验证。选取一笔立即成交的订单,同时记录订单确认时间戳 T_ack、撮合时间戳 T_match、行情中该笔成交对应的时间戳 T_md,以及本地接收各消息的时刻。正常情况下应满足 T_ack ≤ T_match ≤ T_md(同一时钟源下)。若出现 T_md < T_match,说明行情系统与撮合引擎时钟源不同,或行情时间戳是“消息生成”而非“事件发生”时间,需要重新归类。
第三步,区分“事件时间”与“传输时间”。撮合时间戳和行情事件时间属于事件时间,描述业务事实发生的时刻;订单确认时间戳中的网关接收时间、行情离开交易所的时间属于传输/处理时间,描述消息在链路上的位置。对齐本地时钟时,应优先使用事件时间作为基准,因为事件时间不受推送队列积压影响;传输时间适合用于估算链路延迟,而不适合直接校准时钟。
第四步,记录精度与单调性。撮合时间戳常见微秒精度,行情时间戳可能只到毫秒,订单确认时间戳在部分交易所只到秒。混用不同精度的时间戳做差值计算时,要先统一到最低精度,并意识到毫秒级截断会引入最多 1 毫秒的量化误差。同时检查同一字段在连续消息中是否单调不减:若出现回退,说明存在多时钟源或消息乱序,该字段不能直接用于对齐。
业务链路中的角色分工
把三类时间戳放回业务链路,它们的角色其实很清晰。撮合时间戳是结算与合规的基准,用于成交确认、延迟分析和监管报送,它回答“这笔交易何时成立”。行情推送时间戳是市场状态的时间锚点,用于重建订单簿、计算行情延迟和做事件回放,它回答“这个市场状态何时可见”。订单确认时间戳是订单生命周期的起点标记,用于计算下单到确认的往返延迟、判断订单是否在预期时间内进入交易所,它回答“我的指令何时被交易所接收”。
三者共同构成一条从“指令发出”到“市场可见”的完整时间链。对齐工作的目标不是让它们相等,而是让每一类时间戳都能被正确归位:事件时间用于校准,传输时间用于测延迟,精度与单调性用于判断可用性。只有先完成这个归类,后续的时钟偏差估计和本地时间修正才有意义。