3. 数据源梳理与执行数据采集

交易执行质量评估报告的可信度,首先取决于数据底座的完整性。一份评估报告通常要回答三类问题:订单是否按预期到达市场、成交是否以合理价格和数量实现、执行过程相对基准的偏差来自哪里。要回答这些问题,仅靠单一成交表远远不够,必须把订单、成交、行情、时钟四类数据源放在同一条时间轴上对齐,才能还原真实的执行过程。本节围绕“识别数据源—设计采集方案—处理数据质量问题”这条主线展开,重点讲清楚实际工程中怎么做。

四类核心数据源的识别与字段要求

订单数据(Order)记录委托的完整生命周期,是执行评估的主线。关键字段包括:订单编号、账户或策略标识、标的代码、买卖方向、委托类型(限价/市价/算法单)、委托价格、委托数量、下单时间、交易所确认时间、撤单时间、订单状态(已报、部成、全成、已撤、废单)。订单数据决定了“意图”,没有它就无法判断执行是否符合预期。

成交数据(Trade/Fill)记录每一笔实际撮合结果,关键字段包括:成交编号、对应订单编号、成交时间、成交价格、成交数量、手续费、成交场所。成交数据是计算成交均价、滑点、成交率、部分成交比例的原始依据。需要注意,一笔订单可能对应多笔成交,订单与成交是一对多关系,采集时必须保留订单编号作为关联键。

行情数据(Market Data)提供评估基准。至少需要标的的逐笔成交或快照行情(最优买卖价、盘口深度)、以及评估基准价格(如到达价格 arrival price、VWAP、TWAP 区间价)。行情的时间精度和频率直接决定滑点计算的准确性,低频快照会掩盖短时间内的价格波动。

时钟数据(Clock)是常被忽视但极其关键的一环。订单时间、成交时间、行情时间往往来自不同系统,若时钟不同步,几毫秒到几秒的偏差就可能导致“成交价优于当时行情”这类虚假结论。采集时应记录各数据源的时间戳及其时区、时钟源(如 NTP 同步状态),为后续时间对齐提供依据。

执行数据采集:四源汇聚与时间对齐 订单数据 订单号 / 方向 / 类型 委托价量 / 状态 下单·确认·撤单时间 成交数据 成交号 / 订单号 成交价量 / 手续费 成交时间 / 场所 行情数据 逐笔 / 快照盘口 最优买卖价 / 深度 到达价 / VWAP 基准 时钟数据 各源时间戳 / 时区 NTP 同步状态 时钟偏差估计 采集与清洗层 ① 去重:按成交号/订单号主键 ② 补缺:缺失字段标记与回补 ③ 对齐:统一时区与时间精度 ④ 校验:时钟偏差修正 统一时间轴(对齐后) 下单 T0 首笔成交 T0+Δ1 行情快照 T0+Δ2 全部成交 T0+Δ3 对齐后即可计算:到达价滑点、成交率、部分成交比例、执行时长

采集方案的设计要点

识别数据源之后,要设计可落地的采集方案。实际工程中建议按“主键—粒度—频率—存储”四个维度确定方案。主键方面,订单表以订单编号为主键,成交表以成交编号为主键并保留订单编号外键,行情表以标的代码加时间戳为主键。粒度方面,订单和成交必须保留逐笔明细,不能只存日汇总;行情至少保留评估区间内的逐笔或秒级快照。频率方面,订单与成交建议实时或准实时落库,行情按评估需要选择逐笔或定时快照。存储方面,建议按交易日分区,保留原始层(ODS)与清洗层(DWD)两层,原始层不做任何修改,便于问题追溯。

一个常见的采集配置示例如下(示例参数,仅用于说明结构):

# 采集任务配置示例(示意)
order_source:
  endpoint: oms.order_detail
  primary_key: order_id
  fields: [order_id, symbol, side, order_type, price, qty,
           order_time, ack_time, cancel_time, status]
  freq: realtime

trade_source:
  endpoint: oms.trade_detail
  primary_key: trade_id
  foreign_key: order_id
  fields: [trade_id, order_id, trade_time, price, qty, fee, venue]
  freq: realtime

market_source:
  endpoint: md.snapshot
  primary_key: [symbol, ts]
  fields: [symbol, ts, bid1, ask1, bid1_qty, ask1_qty, last]
  freq: 1s

clock_check:
  ntp_host: ntp.internal
  max_offset_ms: 50
  action: warn_and_log

数据缺失、重复与时间对齐的处理

缺失处理。先区分“真缺失”和“未发生”。例如订单没有撤单时间,可能是从未撤单,而非数据丢失,应结合订单状态判断。对确属缺失的字段,按影响程度分级:主键缺失(如成交编号为空)必须回源补采;价格或数量缺失可用同订单其他成交记录推算并标记来源;行情快照缺失可在评估区间内用相邻快照插值,但必须在报告中注明插值区间,避免把插值数据当作真实观测。

重复处理。重复通常来自消息重投或多次拉取。处理原则是按主键去重,保留最新版本或首次到达版本,并记录重复条数用于监控。若同一成交编号出现价格或数量不一致,说明上游存在修正,应以更新时间较晚的记录为准,同时保留修正历史。

时间对齐。这是最容易出错的一步。首先要统一时区(建议全部转为 UTC 或交易所本地时间并明确标注),其次统一时间精度(毫秒或微秒),最后处理时钟偏差。可用同一事件在两个系统中的时间戳估计偏差,例如订单在 OMS 的确认时间与交易所回报时间之差,若系统性偏大,说明某一侧时钟超前。对齐后,所有滑点、成交率计算都应基于同一时间基准,并在报告中写明基准定义。

建议在采集层就建立数据质量看板,持续监控四类指标:订单与成交的关联率、成交记录重复率、行情快照缺失率、时钟偏差超限次数。这四项指标能提前暴露大部分执行评估的数据风险。

采集完成后的自检

数据采集完成后,不要急于计算指标,先做一轮自检:抽查若干订单,确认其成交记录能完整关联;核对成交总量与订单委托量的守恒关系(成交量不超过委托量,撤单后不再有新增成交);检查评估区间内行情时间戳是否连续;确认时钟偏差在阈值内。只有自检通过,后续的滑点、成交率、执行时长等指标才具备可信度。数据源梳理与采集看似是“准备工作”,实际上决定了整份执行质量评估报告的上限。