2. 盘口回放数据基础
做成交方向一致性检查,第一步不是写判断逻辑,而是把回放数据“看懂、对齐、洗干净”。盘口回放通常由三类数据拼成:逐笔成交记录每一笔撮合成交的价格、数量与成交方向标记;委托队列记录买卖盘各档位的挂单价格与数量,以及逐笔委托的增删变化;快照则是在固定时间间隔上对盘口状态的一次切片。三者时间粒度不同、字段含义不同,若不对齐就直接比对,很容易把“数据错位”误判成“方向异常”。
三类数据的结构与字段含义
逐笔成交是方向检查的主证据。典型字段包括:成交时间(精确到毫秒或微秒)、证券代码、成交价、成交量、成交编号、买卖方向标记(常见为 B/S 或 1/2,也有以主动方为口径的标记)。这里必须先明确一个约定:本课程统一采用“主动方口径”——成交方向指主动吃单的一方,标记为 B 表示买方主动成交(外盘),S 表示卖方主动成交(内盘)。若数据源采用“被动方口径”或“逐笔委托撮合口径”,必须先转换,否则后续一致性判断全部反向。
委托队列关注的是“挂单侧”。字段通常有:档位序号(买一、卖一……)、委托价格、委托数量、委托笔数,以及逐笔委托流中的委托编号、方向、价格、数量、委托类型(限价/市价)和到达时间。委托队列的价值在于还原成交发生前后的挂单环境:一笔大额主动买单成交前,卖一档位是否确实存在足够挂单?成交后卖一数量是否相应减少?这些是判断方向标记是否可信的重要旁证。
快照数据是“状态切片”,字段包括快照时间戳、最新价、买卖各档价格与数量、累计成交量、累计成交额、成交笔数等。快照的优点是结构规整、易于对齐;缺点是间隔固定(常见 3 秒或 500 毫秒),会丢失间隔内的细节。因此快照适合做宏观校验和状态锚点,不适合单独承担逐笔级方向判断。
时间对齐:先统一基准,再谈比对
三类数据最常出问题的地方是时间。逐笔成交的时间是“成交发生时刻”,委托流是“委托到达时刻”,快照是“切片时刻”,三者语义不同。对齐时建议按以下顺序处理:
- 统一时区与精度。把全部时间戳转换为同一时区,并统一到毫秒(若源数据为微秒则保留微秒,但三类数据必须一致)。常见错误是成交用本地时间、快照用 UTC,导致整体偏移数小时。
- 确定区间锚点。以快照时间戳为区间边界,把逐笔成交按成交时间归入对应区间,例如快照 10:00:00 与 10:00:03 之间的成交全部归入该区间。这样每笔成交都能找到“前后两个盘口状态”。
- 处理乱序与重复。逐笔数据可能因采集原因出现时间倒序,需按时间稳定排序;同一成交编号重复出现时只保留一条。
- 不跨区间强行匹配。若某笔成交时间恰好落在快照边界,按“左闭右开”规则归属,避免同一笔被两个区间重复统计。
举个教学示例(以下为合理假设的示例数据,非实测):某标的快照间隔 3 秒,10:00:00 快照卖一价 10.02、卖一量 5000 手;10:00:03 快照卖一价 10.03、卖一量 3200 手。区间内逐笔成交共 6 笔,其中 4 笔标记为 B、成交价 10.02,合计 1800 手;2 笔标记为 S、成交价 10.02,合计 300 手。若卖一量从 5000 降至 3200,减少 1800 手,恰好等于 B 方向成交量,说明买方主动吃掉了卖一挂单,方向标记与队列变化相互印证。若减少量与 B 方向成交量明显不符,就应进入下一步排查,而不是直接判定方向错误。
清洗规则与判断依据
清洗不是“删得越多越好”,而是“删得有理、留得可查”。建议至少落实以下规则,并对每条被剔除记录保留原因码:
| 检查项 | 处理方式 | 判断依据 |
|---|---|---|
| 成交编号重复 | 保留首条,其余标记重复 | 同一编号不应出现两次 |
| 价格或数量 ≤ 0 | 剔除并记录 | 撮合成交不可能出现非正价格/数量 |
| 方向标记缺失/非法 | 单独列出,不参与统计 | 无法确定主动方,不能强行归类 |
| 集合竞价区间 | 标记隔离,不纳入连续竞价检查 | 竞价阶段撮合规则不同,方向含义不可比 |
| 停牌/无快照区间 | 整段隔离 | 缺少盘口锚点,无法做一致性比对 |
为方向检查准备的最小数据集
经过对齐与清洗,最终应得到一张以成交为主键的宽表:每行一笔成交,包含成交时间、成交价、成交量、方向标记,以及其所属快照区间的买一/卖一价量、成交前后的队列变化量。有了这张表,成交方向一致性检查才有稳定的输入——后续无论是比对方向标记与价格变动方向,还是比对方向标记与队列消耗方向,都能在同一时间基准上展开,避免把数据问题误读成盘口异常。