4. 数据获取与清洗

高频行情回放验证的第一步不是写策略,而是把“数据底子”打牢。行情数据一旦在来源、格式、时间戳或清洗环节出现偏差,后续的回放、撮合、绩效对比都会建立在错误前提上。本节围绕数据获取与清洗的五个关键环节展开,帮助你建立可复用的数据质量保障流程。

一、核心原理:数据质量决定回放可信度

高频回放的本质是“用历史数据重演市场”。回放系统对数据有三个硬性要求:时间顺序正确、字段语义一致、价格与数量可撮合。任何一条不满足,都会导致成交价偏离、延迟计算错误或信号误触发。因此,数据清洗不是可选项,而是回放验证的前置条件。

数据质量问题通常来自四个层面:交易所原始报文、数据商二次加工、本地存储格式转换、以及回放引擎读取时的解析逻辑。清洗的目标是让数据在进入回放引擎前,达到“时间单调、字段完整、数值合理、语义统一”的状态。

核心原则:先对齐时间,再处理缺失,最后修正异常。顺序颠倒会导致异常值被误判为缺失,或缺失填充掩盖真实异常。

二、行情数据来源与格式解析

高频行情常见来源包括:交易所直连行情(如沪深 Level-2、期货 CTP)、数据商历史数据(如 Wind、聚宽、米筐)、以及开源数据集(如 Binance、OKX 的逐笔数据)。不同来源的字段命名、时间精度、推送频率差异很大。

常见格式分为三类:

  • 逐笔成交(Tick/Trade):包含成交时间、价格、数量、买卖方向,时间精度可达微秒或纳秒。
  • 逐笔委托(Order):包含委托时间、订单号、价格、数量、方向,用于重建订单簿。
  • 快照(Snapshot/Level-2):按固定频率(如 3 秒、500 毫秒)推送多档买卖盘,字段多但时间粒度粗。

解析时需重点关注:时间字段是交易所时间还是本地接收时间;价格是否已复权;数量单位是股还是手;买卖方向字段的编码规则。建议在解析层统一映射为内部标准结构,例如:

{
  "symbol": "600000.SH",
  "ts_exchange": 1697011200123456,  // 微秒
  "ts_local": 1697011200125678,
  "price": 10.25,
  "volume": 200,
  "side": "B",
  "source": "level2_trade"
}

三、时间戳对齐:回放的时间基准

高频数据的时间戳对齐是清洗中最容易出错的一环。交易所时间、数据商时间、本地接收时间三者可能相差数十毫秒甚至数秒。回放时必须选定一个统一时间基准,通常优先使用交易所时间,若缺失则用本地接收时间并记录偏差。

对齐步骤建议如下:

  1. 统一时间单位:全部转换为微秒或纳秒整数,避免浮点误差。
  2. 检查时间单调性:同一 symbol 的时间戳必须严格递增,发现回退立即标记。
  3. 处理跨日边界:夜盘与日盘衔接处需确认日期归属,避免回放时跳日。
  4. 对齐多源数据:逐笔与快照按时间窗口合并时,使用“最近邻”或“前向填充”策略,并记录对齐误差。
实用技巧:对每个交易日生成时间戳分布直方图,若发现某时段时间戳密度异常低,往往意味着数据缺失或推送中断。

四、缺失值与异常值处理

缺失值分为显式缺失(字段为空)和隐式缺失(时间戳跳跃)。异常值包括价格跳变、数量为负、买卖方向非法、快照档位价格倒挂等。

问题类型典型表现处理策略
显式缺失price 或 volume 为空丢弃该条,或按前后 tick 线性插值并标记
隐式缺失相邻 tick 时间差超过阈值记录缺口区间,回放时暂停或跳过
价格异常涨跌幅超过当日限制与涨跌停价对比,超出则标记为异常
数量异常volume 为负或超大与历史分位数对比,超出 99.9% 则复核
盘口倒挂买一价高于卖一价检查是否跨市场或数据拼接错误

处理异常值时,不要直接删除。建议先标记,再根据回放策略决定是否剔除。例如做市策略对盘口倒挂敏感,而趋势策略可能不受影响。保留异常标记有助于复盘时定位问题。

五、数据质量检查方法与实战场景

数据质量检查应形成自动化脚本,每次导入新数据时运行。核心检查项包括:

  • 完整性:每个交易日的 tick 数量是否在合理区间,字段缺失率是否低于阈值。
  • 一致性:同一 symbol 的逐笔成交总量与快照成交量是否匹配。
  • 时序性:时间戳是否单调递增,是否存在重复时间戳。
  • 数值合理性:价格是否在涨跌停范围内,数量是否为正整数。

以下是一个简化的质量检查日志示例:

[QC] date=2024-06-03 symbol=600000.SH
  ticks=48213  missing_price=0  missing_volume=2
  time_regression=0  duplicate_ts=1
  price_out_of_limit=0  volume_negative=0
  snapshot_gap=3  max_gap_ms=1250
  result=WARN  reason=duplicate_ts,snapshot_gap
常见误区:只检查字段是否为空,忽略时间戳回退和重复。时间戳回退会导致回放引擎乱序撮合,产生虚假成交。务必在清洗阶段强制排序并去重。

六、复盘:从数据问题反推回放偏差

当回放结果与实盘或预期差异较大时,优先排查数据质量。典型场景:某策略在回放中收益异常高,检查发现缺失值被前向填充,导致价格在停牌期间被“冻结”,策略误判为无波动。另一个场景:时间戳未对齐,逐笔成交与快照时间错位,订单簿重建错误,撮合价格偏离真实市场。

建议建立“数据质量—回放结果”对照表,记录每次数据清洗的参数和回放偏差,形成可追溯的验证链条。只有数据可信,回放验证才有意义。

高频行情数据清洗与质量检查流程 数据来源 交易所 / 数据商 / 开源 格式解析 逐笔 / 委托 / 快照 时间戳对齐 统一基准 / 单调性 缺失/异常处理 标记 / 填充 / 剔除 数据质量检查 完整性 · 一致性 · 时序性 · 数值合理性 输出 QC 日志:ticks / missing / regression / gap / result 回放引擎 订单簿重建 · 撮合 · 信号触发 结果对比与偏差复盘 异常标记 不直接删除 保留追溯 时间基准 交易所优先 本地记录偏差