3. 逐笔成交数据字段详解
逐笔成交回放的质量,几乎完全取决于对原始字段语义的理解是否准确。很多回放结果“看起来能跑”,但成交归属错位、方向判断反了、时间顺序错乱,根源往往不是回放引擎写得不好,而是字段含义没吃透、脏数据没清掉。本节先把逐笔成交的核心字段逐个拆开讲清楚,再给出一套可落地的清洗与异常识别方法。
一、逐笔成交的核心字段及其语义
以常见的交易所逐笔成交数据为例,一条记录通常包含以下字段(不同数据源命名略有差异,但语义基本一致):
| 字段 | 典型命名 | 含义与使用要点 |
|---|---|---|
| 成交编号 | TradeIndex / SeqNo / 成交序号 | 同一交易日内逐笔成交的唯一递增序号,是回放排序与去重的主键。注意它通常只保证当日唯一,跨日不可直接比较。 |
| 委托编号 | BidOrderNo / AskOrderNo(买/卖委托号) | 成交对应的买方委托号与卖方委托号,是还原委托生命周期、计算委托剩余量、判断主动方向的关键外键。 |
| 成交价格 | Price / TradePrice | 本笔成交的撮合价,单位需与行情快照一致(元或厘),回放前必须统一。 |
| 成交数量 | Volume / Qty | 本笔成交股数(或手数),需与委托剩余量、快照累计量口径一致。 |
| 成交方向 | BSFlag / Side / 买卖方向 | 标识主动方:B 为主动买(外盘),S 为主动卖(内盘)。部分数据源用 1/2 或 0/1 编码,必须查清映射。 |
| 时间戳 | TradeTime / Timestamp | 成交发生时间,精度可能是秒、毫秒或微秒。回放时用于控制节奏,也是判断乱序的依据。 |
这里要特别强调两个容易踩坑的点。第一,成交编号与时间戳不是一回事:同一毫秒内可能有多笔成交,时间戳相同但成交编号不同,排序必须以成交编号为准,时间戳只用于节奏控制。第二,方向字段是“主动方”而非“买卖双方”:一笔成交同时有买方和卖方,BSFlag 记录的是谁主动吃单。若数据源只给了买卖委托号,也可以通过“买方委托号大于卖方委托号”之类的规则推断主动方,但这类规则依赖撮合机制,必须验证后再用。
二、数据清洗:先定口径,再定规则
清洗不是简单删掉“看起来不对”的行,而是先明确口径,再逐条落地规则。回放场景下最需要统一的口径有三项:价格单位(元还是厘)、数量单位(股还是手)、方向编码(B/S 还是 1/2 还是 0/1)。这三项一旦不一致,后续所有统计都会系统性偏移,且很难从结果上察觉。
口径统一后,按以下顺序执行清洗,顺序本身很重要:
- 主键去重:以成交编号为键去重。若同一编号出现多条且内容不同,说明数据源合并出错,应整组隔离而非随意保留一条。
- 排序:按成交编号升序排列,而不是按时间戳。时间戳相同或轻微倒挂时,成交编号才是权威顺序。
- 值域校验:价格必须落在当日涨跌停价之间(涨跌停价可由前收盘价与板块规则算出);数量必须为正整数,且符合最小交易单位。
- 方向映射:把原始编码统一映射为 B/S 两值,遇到未知编码直接隔离,不要默认成某一方向。
- 时间校验:检查时间戳是否落在交易时段内、是否出现明显倒流(如后一条比前一条早超过阈值)。
三、异常值识别:四类高频问题与判断依据
逐笔成交的异常大致可归为四类,每类都有可操作的判断依据:
- 重复成交:成交编号重复。判断依据是主键唯一性,处理方式是整组隔离并记录重复次数。
- 价格越界:成交价高于涨停价或低于跌停价。常见于单位混用(厘当成元)或复权处理错误。判断依据是当日涨跌停区间,处理方式是先核对单位再决定修正或隔离。
- 数量异常:数量为 0、为负、或不是最小交易单位的整数倍。判断依据是交易规则,处理方式是隔离并回溯数据源。
- 委托号悬空:成交记录中的买方或卖方委托号,在委托表中找不到对应记录。这会直接导致回放时委托剩余量算错,必须作为重点异常标记。
其中“委托号悬空”最容易被忽视,却对回放影响最大。实操中可以用集合运算快速定位:把成交表中的买方委托号、卖方委托号分别与委托表中的委托号做差集,差集非空即说明存在悬空引用。发现悬空后,不要急着补一条假委托,而应先确认是委托表截断、还是成交表混入了其他交易日的数据。
四、一个可复用的清洗检查清单
把上面的规则固化成检查清单,每次回放前跑一遍,能挡掉绝大多数低级错误:
| 检查项 | 判断条件 | 不通过时的处理 |
|---|---|---|
| 主键唯一 | 成交编号无重复 | 重复组隔离,记录编号 |
| 排序正确 | 按成交编号严格递增 | 重排后比对条数 |
| 价格区间 | 跌停价 ≤ 价格 ≤ 涨停价 | 核对单位,仍越界则隔离 |
| 数量合法 | 数量 > 0 且为整手倍数 | 隔离并回溯源数据 |
| 方向可映射 | 编码能映射为 B 或 S | 未知编码隔离,不默认方向 |
| 时间合理 | 落在交易时段且不倒流 | 标记并人工确认 |
| 委托可关联 | 买卖委托号均能在委托表命中 | 标记悬空引用,暂停回放 |
最后提醒一点:清洗的目标不是把数据“修得好看”,而是让每一条进入回放引擎的记录都可解释、可追溯。凡是经过修正的记录,都应保留原始值与修正原因;凡是无法解释的记录,宁可隔离也不要猜测填充。做到这一点,后续的委托同步与回放对账才有可靠的基础。