4. 逐笔特征构造实践

逐笔数据是微观结构研究中最细粒度的信息源,它记录的不只是“成交了多少”,还包括“谁在什么时候以什么价格挂出、撤掉、成交”。本节要做的,是把这些原始事件转换成可跨股票比较的数值特征。核心思路是:先按事件类型分流,再在固定时间窗口内聚合,最后做量纲归一化。下面围绕价差、深度、订单流不平衡、大单占比四类常用特征展开,并给出可直接落地的构造方式。

一、事件分流:成交与委托是两条不同的流

逐笔数据通常包含两类记录:成交记录(trade)与委托记录(order)。成交记录字段一般有成交时间、成交价、成交量、买卖方向标识;委托记录则有委托时间、委托价、委托量、方向(买/卖)、以及撤单事件。构造特征前必须先明确两件事:一是时间戳精度(毫秒还是微秒),二是方向标识的约定。本文统一约定:买方主动成交记为 +1,卖方主动成交记为 −1,撤单量按原委托方向计入对应一侧的减少量。这个符号约定在后续所有特征中保持一致,切换时必须显式说明。

一个常见的工程细节是:委托记录中的“新增”和“撤单”往往混在同一张表里,需要用事件类型字段区分。若原始数据只有快照而没有逐笔委托,则深度类特征只能退化为快照差分,精度会下降,这一点在迁移检验时要特别标注。

二、价差特征:从绝对价差到相对价差

价差刻画的是最优买价与最优卖价之间的空隙。最直接的定义是绝对价差:

spread_abs = best_ask - best_bid

但绝对价差在不同价位的股票之间不可比,10 元股票和 100 元股票的 0.01 元价差含义完全不同。因此实践中更常用相对价差:

spread_rel = (best_ask - best_bid) / mid_price
mid_price  = (best_ask + best_bid) / 2

在逐笔层面,最优买卖价不是静态的,而是随每笔委托和撤单动态更新。实现上维护两个有序价格队列(买侧降序、卖侧升序),每来一条委托事件就插入或删除,然后取队首。若某侧队列为空(例如涨停时卖侧无挂单),相对价差会失真,此时应标记为缺失而不是填零,否则会把“无流动性”误读成“零价差”。

三、深度特征:不止看一档

深度衡量的是在当前最优价附近可成交的量。常用做法是统计前 N 档的累计挂单量,N 取 1、5、10 均可,但必须在全样本内固定,否则跨股票不可比。以 5 档为例:

depth_bid_5 = sum(bid_volume[1..5])
depth_ask_5 = sum(ask_volume[1..5])
depth_imb  = (depth_bid_5 - depth_ask_5) / (depth_bid_5 + depth_ask_5)

其中 depth_imb 是深度不平衡,取值在 [−1, 1] 之间,正值表示买侧更厚。深度特征对撤单非常敏感:一笔大额撤单可能在毫秒内让 depth_bid_5 骤降,因此建议在窗口内取时间加权平均,而不是简单取窗口末值,以降低单点噪声。

四、订单流不平衡:把方向信息用起来

订单流不平衡(OFI)是逐笔特征中最具信息量的一类,它把“谁主动”转化为数值。最简版本按成交量加权:

OFI = (buy_volume - sell_volume) / (buy_volume + sell_volume)

更精细的版本会区分“新增委托”和“撤单”,因为撤单本身也携带方向信息。一个常用的扩展定义是:对买侧,新增买量记正、撤买量记负;对卖侧,新增卖量记负、撤卖量记正,再在窗口内求和后除以总活动量。这样得到的 OFI 既反映主动成交,也反映挂单意愿的变化。窗口长度建议与后续预测周期对齐,例如预测未来 5 分钟收益就用 5 分钟窗口,避免信息窗口与目标窗口错配。

五、大单占比:用分位数而非固定阈值

“大单”没有绝对标准,10 万股对小盘股是大单,对大盘股可能只是零头。稳妥的做法是按股票自身成交量的历史分位数定义阈值,例如取过去 20 个交易日成交量的 90 分位作为大单门槛:

threshold = quantile(trade_volume_history, 0.90)
large_ratio = sum(volume[volume >= threshold]) / sum(volume)

这样构造出的比例在 [0, 1] 之间,天然可比。需要注意分位数必须用滚动历史计算,不能用全样本,否则会引入未来信息。同理,价差和深度若要做横截面标准化,也应使用滚动窗口的均值和标准差,而不是全样本统计量。

构造顺序建议:先做事件分流与时间对齐,再逐特征计算,最后统一做滚动标准化。每一步都保留原始中间列,便于迁移检验时定位是哪一步在目标股票上失效。

六、特征汇总与迁移前的自检

把上述特征整理成一张宽表,每行是一个时间窗口,每列是一个特征。下表给出一个示例结构(数值为教学假设,非实测):

窗口spread_reldepth_imbOFIlarge_ratio
09:310.000420.180.310.22
09:320.00039−0.05−0.120.15
09:330.000510.270.440.31

迁移检验前应做三项自检:其一,各特征在源股票与目标股票上的分布是否量级相近,若某特征均值差一个数量级,说明归一化方式需要调整;其二,缺失率是否可接受,涨停跌停时段的深度特征缺失应被显式标记;其三,特征与未来收益的符号方向在目标股票上是否保持一致,若符号翻转,往往意味着市场状态或参与者结构发生了变化,需要重新审视特征定义而非直接套用模型。

逐笔特征构造链路:事件分流 → 窗口聚合 → 归一化 → 迁移自检 成交记录 trade 价 / 量 / 主动方向 委托记录 order 新增 / 撤单 / 方向 买卖队列维护 最优价 / 前 N 档 方向符号约定 买 +1 / 卖 −1 固定窗口聚合 1min / 5min 滚动标准化 历史分位 / z-score 特征宽表 每行一窗口 迁移自检 分布 / 缺失 / 符号 四类特征的计算要点 价差 spread_rel (ask−bid)/mid 单侧空队列→缺失 深度 depth_imb 前 N 档累计量 时间加权抗撤单 订单流 OFI (买量−卖量)/总量 窗口与预测期对齐 大单占比 滚动 90 分位阈值 禁用全样本分位 迁移前检查:① 源/目标分布量级是否接近 ② 涨跌停时段缺失是否显式标记 ③ 特征与未来收益符号是否一致 若符号翻转,优先回查方向约定与归一化窗口,而非直接替换模型。

最后强调一点:逐笔特征的价值不在于数量多,而在于定义清晰、口径一致、可复现。价差、深度、OFI、大单占比这四类特征覆盖了价格、流动性、方向和规模四个维度,已经能支撑多数微观结构研究。真正决定迁移成败的,往往是那些不起眼的细节——时间戳对齐、方向符号、滚动窗口边界,以及缺失值的处理方式。