2. 高频行情基础

在进入高频行情回放验证之前,必须先厘清一个根本问题:我们回放的“行情”到底是什么。不同数据源在时间粒度、字段结构、更新机制上差异巨大,若把快照行情当成逐笔行情使用,或把逐笔委托与逐笔成交混为一谈,回放结果与实盘结果就会出现系统性偏差。本节围绕四类核心行情对象展开,帮助大家建立统一的数据认知框架。

一、四类核心行情对象及其本质

逐笔成交记录的是每一笔已经撮合成交的明细,通常包含成交时间、成交价、成交量、买卖方向(主动方)以及成交编号。它是市场真实交易结果的“流水账”,频率最高,是微观结构分析、成交量分布、大单识别的基础。

逐笔委托记录的是每一笔进入撮合系统的委托单,包含委托时间、委托价、委托量、买卖方向、委托类型与委托编号。它反映的是交易意图而非交易结果,是还原订单簿动态变化的关键输入。在部分市场中,逐笔委托还区分限价、市价、本方最优等类型。

快照行情是在固定时间间隔(如每3秒、每500毫秒或每100毫秒)对订单簿进行的一次“切片”采样,通常包含买卖各若干档的价量、最新价、成交量、成交额等。它是对订单簿的降采样,信息有损,但结构规整、易于存储和回放。

订单簿是撮合系统的核心数据结构,维护着所有未成交委托的买卖队列。逐笔委托和逐笔成交是订单簿的“输入事件”,订单簿是这些事件累积后的“状态”,而快照行情则是该状态在某一时刻的“投影”。

行情数据层次关系:事件 → 状态 → 快照 逐笔委托 委托编号 / 价 / 量 / 方向 事件流 · 高频 逐笔成交 成交编号 / 价 / 量 / 主动方 事件流 · 高频 订单簿 买队列 / 卖队列 状态 · 持续更新 由事件驱动重建 快照行情 买卖N档 / 最新价 固定间隔采样 投影 · 有损 事件驱动状态变化,状态按固定间隔投影为快照

二、数据频率与常见术语

不同行情类型的更新频率差异显著。逐笔数据是事件驱动,频率取决于市场活跃度,热门标的每秒可达数千甚至上万条;快照行情是时间驱动,A股常见3秒快照,期货与部分海外市场可达500毫秒、100毫秒甚至更细。理解频率差异,是回放时选择时间对齐策略的前提。

行情类型 驱动方式 典型频率 核心字段 主要用途
逐笔成交 事件驱动 毫秒级,随成交发生 成交价、量、方向、编号 成交量分析、大单识别
逐笔委托 事件驱动 毫秒级,随委托发生 委托价、量、方向、类型 订单簿重建、意图分析
快照行情 时间驱动 3秒 / 500ms / 100ms 买卖N档、最新价、总量 策略回测、盘口特征
订单簿 状态维护 随事件实时变化 买卖队列全量 微观结构、撮合模拟

常见术语包括:盘口(买卖各档报价)、价差(买一与卖一之差)、深度(档位数量)、主动买/主动卖(成交方向)、委托编号与成交编号(唯一标识)、时间戳(精确到毫秒或微秒)、快照序列号(用于检测丢包与乱序)。这些术语在回放验证中会反复出现,必须准确对应。

三、典型应用场景与回放验证要点

在回放验证实战中,不同行情类型对应不同的验证目标。若策略依赖盘口形态,应以快照行情为主进行回放,并重点检查快照时间戳是否连续、序列号是否跳变;若策略依赖订单簿重建,则必须使用逐笔委托与逐笔成交,按事件时间顺序重放,并验证重建后的订单簿与官方快照是否一致。

回放验证的核心逻辑:用逐笔事件重建订单簿,再按快照时间点采样,与真实快照对比。若两者在价量上高度吻合,说明数据完整、重建逻辑正确;若出现偏差,则需排查丢包、乱序、字段解析错误或撮合规则差异。

一个常见的验证流程如下:

  1. 加载逐笔委托与逐笔成交数据,按时间戳排序,处理同一时间戳内的先后关系。
  2. 逐条应用事件:委托进入订单簿,成交则从订单簿中扣减对应队列。
  3. 在每个快照时间点,从当前订单簿中提取买卖各档价量。
  4. 与真实快照行情逐字段对比,统计匹配率与偏差分布。
  5. 对偏差较大的时间点,回溯原始事件,定位是数据问题还是逻辑问题。
# 伪代码:逐笔事件驱动订单簿重建
for event in sorted(events, key=lambda e: (e.timestamp, e.seq)):
    if event.type == "ORDER":
        orderbook.add_order(event)
    elif event.type == "TRADE":
        orderbook.apply_trade(event)
    if event.timestamp >= next_snapshot_time:
        snapshot = orderbook.sample(depth=10)
        compare(snapshot, real_snapshot)
        next_snapshot_time += interval

四、常见误区与复盘

误区一:用快照行情代替逐笔行情做微观回测。快照是降采样,丢失了档位间的快速变化与撤单信息,会导致成交模拟失真。
误区二:忽略时间戳精度与时钟源差异。不同交易所、不同数据源的时间戳可能来自不同时钟,直接混用会造成事件顺序错乱。
误区三:认为逐笔委托一定完整。部分市场只提供逐笔成交,不提供逐笔委托,此时订单簿重建需要依赖成交推断,精度有限。
误区四:快照序列号跳变未处理。序列号跳变往往意味着丢包,若不处理,回放结果会出现“凭空消失”的档位。

复盘时建议建立一张“数据质量检查清单”:时间戳是否单调、序列号是否连续、买卖方向字段是否合法、价格是否在涨跌停范围内、成交量是否非负、快照档位是否满足深度要求。只有数据质量过关,后续的回放对比才有意义。

实战建议:在正式回放前,先抽取一段活跃时段的逐笔数据,手工重建订单簿并与快照对比。若匹配率低于预期,优先检查字段映射与时间对齐,而不是急于调整策略参数。行情基础打得越牢,后续验证结论越可靠。