4. 数据准备与清洗

在执行算法回放仿真中,数据质量直接决定仿真结论的可信度。行情数据、订单簿数据与成交数据来自不同通道,具有不同的时间粒度、字段语义与噪声特征。若未经过系统化清洗与对齐,回放引擎可能基于错误的价格、错误的盘口或错误的成交量做出决策,导致滑点、成交概率与策略收益的评估全面失真。本节围绕“获取—对齐—去噪—标准化”四步链路,给出可落地的工程方法。

一、核心原理:三类数据的语义与时间模型

行情数据通常指快照式最优买卖价(Level-1)或固定档位盘口(Level-2),以固定频率或事件驱动方式发布;订单簿数据是逐笔委托与撤单形成的完整或部分深度,具有明确的订单编号与价格档位;成交数据是逐笔成交记录,包含成交价、成交量与主动方向。三者的核心差异在于:行情是状态切片,订单簿是状态演化,成交是状态变化的结果。回放仿真必须将三者统一到同一时间轴上,并以“事件时间”而非“接收时间”为准。

关键原则:任何对齐操作都不能引入未来信息。若某条成交记录的时间戳晚于当前回放时刻,即使其接收时间更早,也必须被排除。

二、方法流程:获取、对齐、去噪与标准化

1. 获取与落盘。行情与订单簿建议通过交易所或数据商的API/文件接口获取,成交数据优先使用逐笔成交文件。落盘时保留原始字段与接收时间戳,并记录数据源版本。常见做法是按交易日分区存储,便于回放时按需加载。

# 示例:按交易日分区落盘
data/
  raw/
    quotes/2024-06-03.parquet
    orderbook/2024-06-03.parquet
    trades/2024-06-03.parquet
  clean/
    aligned/2024-06-03.parquet

2. 时间对齐。三类数据的时间戳精度可能不同:行情为毫秒,订单簿为微秒,成交为纳秒。对齐时统一转换为UTC纳秒,并采用“前向填充+事件触发”策略:行情快照用于维护当前盘口状态,订单簿增量用于更新深度,成交记录用于触发撮合与滑点计算。对齐后应生成统一事件流,每个事件包含类型、时间戳、标的与载荷。

3. 去噪。常见噪声包括:重复推送、乱序到达、价格跳变、零成交量、异常档位。去噪规则应可配置,例如:剔除价格偏离中位数超过5%的记录;剔除成交量小于最小交易单位的记录;对乱序记录按时间戳重排;对重复记录按唯一键去重。

4. 标准化。将不同数据源的字段映射为统一Schema,例如将bid/ask、bidSize/askSize、lastPrice/lastSize统一命名;价格统一为最小价格单位的整数倍;数量统一为最小交易单位的整数倍;方向字段统一为buy/sell/unknown。标准化后写入列式存储,便于回放引擎高速读取。

数据准备与清洗链路 行情数据 快照/Level-1/2 订单簿数据 逐笔委托/撤单 成交数据 逐笔成交 时间对齐:统一UTC纳秒 + 事件流 前向填充 + 事件触发 去噪 + 标准化 去重/重排/字段映射/单位统一

三、案例/场景:某日回放数据清洗实战

假设回放2024年6月3日某股票,原始数据存在以下问题:行情快照中部分bidPrice为0;订单簿增量存在重复推送;成交记录中有3条时间戳乱序。清洗步骤如下:

  1. 加载原始数据,统一时间戳为UTC纳秒,并按时间戳排序。
  2. 对行情数据,剔除bidPrice≤0或askPrice≤bidPrice的记录。
  3. 对订单簿数据,按orderId去重,保留最新一条;对乱序记录按时间戳重排。
  4. 对成交数据,剔除成交量≤0的记录,并按时间戳重排。
  5. 将三类数据合并为统一事件流,写入clean/aligned分区。
# 清洗日志示例
[INFO] 2024-06-03 quotes: 120000 rows, removed 320 invalid
[INFO] 2024-06-03 orderbook: 450000 rows, dedup 1200
[INFO] 2024-06-03 trades: 80000 rows, reorder 3
[INFO] aligned events: 650000 rows written

四、误区/复盘:常见陷阱与检查清单

误区一:用接收时间代替事件时间。网络延迟会导致接收时间晚于事件时间,若用接收时间对齐,会引入未来信息。误区二:忽略价格与数量的最小单位。不同数据源的单位不同,未标准化会导致撮合价格错误。误区三:去噪过度。剔除过多记录可能丢失真实的市场极端事件,影响策略压力测试。

检查项要求常见问题
时间戳精度统一为UTC纳秒毫秒与微秒混用
价格单位统一为最小价格单位整数倍小数与整数混用
数量单位统一为最小交易单位整数倍股与手混用
方向字段buy/sell/unknown大小写不一致
去重键orderId + 时间戳仅用orderId导致误删
乱序处理按事件时间重排直接丢弃乱序记录

复盘建议:每次清洗后,输出数据质量报告,包括记录数、剔除数、时间跨度、价格分布与成交量分布。将报告与回放结果关联,便于定位因数据问题导致的异常成交或滑点。

完成上述四步后,回放引擎即可获得一份时间对齐、噪声可控、字段统一的标准化事件流。这是执行算法回放仿真的数据基石,也是后续滑点建模、成交概率估计与策略归因分析的前提。