2. 盘口数据基础与预处理

研究盘口流动性斜率与不对称性,第一步不是建模,而是把原始 Level-2 行情整理成“可计算、可对齐、可复现”的事件序列。交易所推送的逐笔数据本质上是两条并行流:一条是逐笔委托流(order stream),记录每笔委托的进入、撤单与可能的改单;另一条是逐笔成交流(trade stream),记录撮合成交的价格、数量与方向。两条流通过订单编号(或委托序号)与时间戳关联,才构成完整的“委托—成交—撤单”生命周期。若跳过这一步直接算斜率,得到的往往是噪声而非流动性结构。

一、数据结构:两条流与关键字段

以常见的逐笔委托与逐笔成交结构为例,逐笔委托通常包含:证券代码、委托时间(精确到毫秒或微秒)、委托序号、订单编号、买卖方向、委托价格、委托数量、委托类型(限价/市价/本方最优等)。逐笔成交通常包含:成交时间、成交序号、买方订单编号、卖方订单编号、成交价格、成交数量、成交方向(主动买/主动卖,部分市场需自行推断)。关键点在于:委托序号与成交序号是各自独立递增的,不能混用;订单编号才是跨流关联的主键。此外,部分市场对撤单以“数量为负的委托记录”或独立撤单消息表达,清洗时必须先确认口径。

下表给出一个教学用的字段映射示例(数值为合理假设,非实测):

字段所属流示例值用途
委托序号逐笔委托20240513000127委托流内排序
订单编号两流共有B8842017跨流关联主键
方向逐笔委托买 / 卖构建买卖队列
委托价格逐笔委托10.32盘口档位归属
委托数量逐笔委托3000队列深度
成交价格逐笔成交10.32成交价与价差
成交数量逐笔成交1200主动成交强度

二、清洗:先统一口径,再谈计算

清洗的核心不是“删异常”,而是统一语义。常见处理包括:其一,时间统一到同一时区与同一精度,毫秒与微秒混用时统一截断或补齐,避免排序错位;其二,剔除集合竞价、开盘前推送与收盘后快照,只保留连续竞价时段,否则斜率会被集合竞价的巨量挂单污染;其三,处理撤单:若撤单以负数量表达,需拆成独立撤单事件并回填到对应订单编号;其四,识别并标记“市价转限价”“本方最优”等特殊委托类型,这类委托在盘口中的落位规则与普通限价单不同,不能直接按价格入队;其五,对重复推送做去重,以(订单编号,事件类型,序号)为键保留首条。清洗后应输出一张“事件表”,每行是一个不可再分的事件,而非一条原始报文。

注意:不同行情源对“主动买/主动卖”的定义可能相反(有的以买方主动成交为买,有的以成交价对比中间价推断)。全文与图示必须固定一种口径,并在特征计算前显式声明,否则买卖不对称性会出现整体符号翻转。

三、对齐:把两条流还原成订单生命周期

对齐的目标是让每个订单拥有完整的状态轨迹:进入 → 部分成交 → 全部成交 / 撤单。实现上以订单编号为键建立哈希表,逐笔委托先入表,逐笔成交到达时按买方与卖方订单编号分别回填成交量,撤单事件则关闭对应订单。对齐后应校验三条守恒关系:累计成交量 ≤ 委托数量;订单关闭后不再出现新成交;同一订单的成交价格不劣于其限价(买入成交价不高于限价)。任何一条被违反,说明存在漏推、乱序或口径错误,应回退到该订单编号逐条排查,而不是整体丢弃。

下面的信号链图展示了从原始双流到可计算事件表的处理路径与关键校验点:

Level-2 双流对齐与高频特征提取链路 逐笔委托流 订单编号 / 方向 / 价格 数量 / 委托类型 逐笔成交流 买卖订单编号 / 成交价 成交量 / 成交方向 清洗与口径统一 时段过滤 · 去重 撤单拆分 · 类型标记 时间精度对齐 订单生命周期对齐 订单编号哈希表 成交回填 · 撤单关闭 守恒校验 高频特征 盘口深度 / 斜率 买卖不平衡 主动成交强度 撤单率 / 队列变化 价差与中间价 对齐后三条守恒校验 ① 累计成交量 ≤ 委托数量 ② 订单关闭后无新成交 ③ 成交价不劣于限价(买不高、卖不低)

四、高频特征提取:从事件表到可计算指标

对齐完成后,按固定时间窗(如 1 秒、5 秒或 10 秒)切片,在每个窗口内计算特征。以下给出几个与后续斜率、不对称性直接相关的核心特征及其计算方式(示例参数为教学假设):

  • 盘口深度:某时刻买一至买五、卖一至卖五的挂单量之和,分别记为 BidDepth 与 AskDepth。注意应基于“订单生命周期”重建的队列,而非快照直接相加,否则撤单未及时反映。
  • 买卖不平衡:OIB = (BidDepth − AskDepth) / (BidDepth + AskDepth),取值在 [−1, 1],正值表示买方深度占优。
  • 主动成交强度:窗口内主动买成交量 BuyVol 与主动卖成交量 SellVol,可构造 TradeImb = (BuyVol − SellVol) / (BuyVol + SellVol)。
  • 撤单率:窗口内撤单量 / 新增委托量,用于识别“虚假挂单”对盘口斜率的干扰。
  • 价差与中间价:Spread = Ask1 − Bid1,Mid = (Ask1 + Bid1) / 2,作为斜率归一化的基准。

以一个教学示例说明:假设某 1 秒窗口内,买五档深度合计 12000 股,卖五档合计 8000 股,则 OIB = (12000 − 8000) / 20000 = 0.20;同期主动买成交 5000 股、主动卖成交 3000 股,则 TradeImb = 0.25。两个指标同向为正,说明该窗口买方在“挂单深度”和“主动成交”两个维度同时占优,后续计算斜率时应关注买方档位是否被快速消耗——若买一至买三在下一窗口被大量成交吃掉而卖档稳定,则斜率会迅速变陡,这正是流动性不对称的典型前兆。以上数值为合理假设,仅用于演示计算路径。

工程建议:特征计算应保留“窗口起点、窗口长度、样本数、缺失标记”四个元字段。高频数据常有推送缺口,若某窗口成交笔数为 0,应区分“真的无成交”与“数据缺失”,前者可计算,后者应置为缺失而非填 0,否则不平衡指标会被系统性拉向 0。

五、可复现的最小处理约定

为保证后续章节的斜率与不对称性结果可比较,建议在预处理阶段固定以下约定并写入配置:时间精度统一到毫秒;连续竞价时段为 9:30–11:30 与 13:00–15:00(按实际市场调整);主动方向以“成交价 ≥ 卖一价为主动买、≤ 买一价为主动卖、介于其间按上一笔成交价推断”为准;盘口档位固定五档;窗口长度默认 1 秒并允许参数化。把这些约定显式化,才能让“斜率变陡”这类结论建立在同一把尺子上,而不是随口径漂移。

完成上述四步后,得到的事件表与窗口特征表就是后续研究的输入底座:事件表用于重建任意时刻的订单队列,特征表用于计算斜率、不对称性与状态切换。预处理的质量,直接决定了后面看到的“流动性结构”是真实的市场行为,还是清洗与对齐留下的伪影。