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_rel | depth_imb | OFI | large_ratio |
|---|---|---|---|---|
| 09:31 | 0.00042 | 0.18 | 0.31 | 0.22 |
| 09:32 | 0.00039 | −0.05 | −0.12 | 0.15 |
| 09:33 | 0.00051 | 0.27 | 0.44 | 0.31 |
迁移检验前应做三项自检:其一,各特征在源股票与目标股票上的分布是否量级相近,若某特征均值差一个数量级,说明归一化方式需要调整;其二,缺失率是否可接受,涨停跌停时段的深度特征缺失应被显式标记;其三,特征与未来收益的符号方向在目标股票上是否保持一致,若符号翻转,往往意味着市场状态或参与者结构发生了变化,需要重新审视特征定义而非直接套用模型。
最后强调一点:逐笔特征的价值不在于数量多,而在于定义清晰、口径一致、可复现。价差、深度、OFI、大单占比这四类特征覆盖了价格、流动性、方向和规模四个维度,已经能支撑多数微观结构研究。真正决定迁移成败的,往往是那些不起眼的细节——时间戳对齐、方向符号、滚动窗口边界,以及缺失值的处理方式。