3. 逐笔成交数据字段详解

逐笔成交回放的质量,几乎完全取决于对原始字段语义的理解是否准确。很多回放结果“看起来能跑”,但成交归属错位、方向判断反了、时间顺序错乱,根源往往不是回放引擎写得不好,而是字段含义没吃透、脏数据没清掉。本节先把逐笔成交的核心字段逐个拆开讲清楚,再给出一套可落地的清洗与异常识别方法。

一、逐笔成交的核心字段及其语义

以常见的交易所逐笔成交数据为例,一条记录通常包含以下字段(不同数据源命名略有差异,但语义基本一致):

字段 典型命名 含义与使用要点
成交编号 TradeIndex / SeqNo / 成交序号 同一交易日内逐笔成交的唯一递增序号,是回放排序与去重的主键。注意它通常只保证当日唯一,跨日不可直接比较。
委托编号 BidOrderNo / AskOrderNo(买/卖委托号) 成交对应的买方委托号与卖方委托号,是还原委托生命周期、计算委托剩余量、判断主动方向的关键外键。
成交价格 Price / TradePrice 本笔成交的撮合价,单位需与行情快照一致(元或厘),回放前必须统一。
成交数量 Volume / Qty 本笔成交股数(或手数),需与委托剩余量、快照累计量口径一致。
成交方向 BSFlag / Side / 买卖方向 标识主动方:B 为主动买(外盘),S 为主动卖(内盘)。部分数据源用 1/2 或 0/1 编码,必须查清映射。
时间戳 TradeTime / Timestamp 成交发生时间,精度可能是秒、毫秒或微秒。回放时用于控制节奏,也是判断乱序的依据。

这里要特别强调两个容易踩坑的点。第一,成交编号与时间戳不是一回事:同一毫秒内可能有多笔成交,时间戳相同但成交编号不同,排序必须以成交编号为准,时间戳只用于节奏控制。第二,方向字段是“主动方”而非“买卖双方”:一笔成交同时有买方和卖方,BSFlag 记录的是谁主动吃单。若数据源只给了买卖委托号,也可以通过“买方委托号大于卖方委托号”之类的规则推断主动方,但这类规则依赖撮合机制,必须验证后再用。

逐笔成交记录:字段结构与清洗链路 原始逐笔成交 成交编号:20240612000123 买方委托号:B88231 卖方委托号:S77105 价格:10.52 数量:300 方向:B 时间:09:31:05.120 清洗 清洗与校验规则 ① 主键去重:成交编号唯一 ② 排序:按成交编号升序 ③ 价格落在当日涨跌停内 ④ 数量 > 0 且为整手倍数 ⑤ 方向编码映射为 B/S ⑥ 时间戳单调不减 判定 异常记录 → 隔离区 重复编号 / 价格越界 / 数量为0 时间倒流 / 方向编码未知 干净成交序列 供回放引擎按序消费 委托编号关联:还原委托生命周期 买方委托 B88231 原始量 1000 已成交 300 剩余 700(挂单中) 成交 本笔成交 价 10.52 量 300 方向 B 成交编号 20240612000123 成交 卖方委托 S77105 原始量 500 已成交 300 剩余 200(挂单中)

二、数据清洗:先定口径,再定规则

清洗不是简单删掉“看起来不对”的行,而是先明确口径,再逐条落地规则。回放场景下最需要统一的口径有三项:价格单位(元还是厘)、数量单位(股还是手)、方向编码(B/S 还是 1/2 还是 0/1)。这三项一旦不一致,后续所有统计都会系统性偏移,且很难从结果上察觉。

口径统一后,按以下顺序执行清洗,顺序本身很重要:

  1. 主键去重:以成交编号为键去重。若同一编号出现多条且内容不同,说明数据源合并出错,应整组隔离而非随意保留一条。
  2. 排序:按成交编号升序排列,而不是按时间戳。时间戳相同或轻微倒挂时,成交编号才是权威顺序。
  3. 值域校验:价格必须落在当日涨跌停价之间(涨跌停价可由前收盘价与板块规则算出);数量必须为正整数,且符合最小交易单位。
  4. 方向映射:把原始编码统一映射为 B/S 两值,遇到未知编码直接隔离,不要默认成某一方向。
  5. 时间校验:检查时间戳是否落在交易时段内、是否出现明显倒流(如后一条比前一条早超过阈值)。
建议把清洗结果分成“干净序列”和“隔离区”两份输出,隔离区保留原始行与拒绝原因。回放对不上账时,隔离区往往就是第一现场。

三、异常值识别:四类高频问题与判断依据

逐笔成交的异常大致可归为四类,每类都有可操作的判断依据:

  • 重复成交:成交编号重复。判断依据是主键唯一性,处理方式是整组隔离并记录重复次数。
  • 价格越界:成交价高于涨停价或低于跌停价。常见于单位混用(厘当成元)或复权处理错误。判断依据是当日涨跌停区间,处理方式是先核对单位再决定修正或隔离。
  • 数量异常:数量为 0、为负、或不是最小交易单位的整数倍。判断依据是交易规则,处理方式是隔离并回溯数据源。
  • 委托号悬空:成交记录中的买方或卖方委托号,在委托表中找不到对应记录。这会直接导致回放时委托剩余量算错,必须作为重点异常标记。

其中“委托号悬空”最容易被忽视,却对回放影响最大。实操中可以用集合运算快速定位:把成交表中的买方委托号、卖方委托号分别与委托表中的委托号做差集,差集非空即说明存在悬空引用。发现悬空后,不要急着补一条假委托,而应先确认是委托表截断、还是成交表混入了其他交易日的数据。

四、一个可复用的清洗检查清单

把上面的规则固化成检查清单,每次回放前跑一遍,能挡掉绝大多数低级错误:

检查项 判断条件 不通过时的处理
主键唯一 成交编号无重复 重复组隔离,记录编号
排序正确 按成交编号严格递增 重排后比对条数
价格区间 跌停价 ≤ 价格 ≤ 涨停价 核对单位,仍越界则隔离
数量合法 数量 > 0 且为整手倍数 隔离并回溯源数据
方向可映射 编码能映射为 B 或 S 未知编码隔离,不默认方向
时间合理 落在交易时段且不倒流 标记并人工确认
委托可关联 买卖委托号均能在委托表命中 标记悬空引用,暂停回放

最后提醒一点:清洗的目标不是把数据“修得好看”,而是让每一条进入回放引擎的记录都可解释、可追溯。凡是经过修正的记录,都应保留原始值与修正原因;凡是无法解释的记录,宁可隔离也不要猜测填充。做到这一点,后续的委托同步与回放对账才有可靠的基础。