订单簿斜率信号:用挂单密度预测短期价格方向
限价订单簿的挂单量大致按档位指数衰减,衰减斜率藏着方向信息:买压强时买盘密度衰减慢(深度厚),卖盘衰减快。用 6 万个盘口快照的受控模拟实测:对 10 档 log 深度做 OLS 估斜率、取买卖差作为信号,20 快照(100 秒)视界 IC 5.44%,远超只看一档的经典不平衡指标(1.13%)和五档总量不平衡(4.34%)——多档形状信息真实有用,且十分位单调性干净。但故事的下半场是冷水:|z|>1 触发的方向策略每笔毛收益只有 0.20bp,而盈亏平衡成本 1.0bp、半价差 2.5bp——毛信号连价差的零头都盖不住,taker 策略在这个视界上结构性亏损。这类信号的真实用途不是独立下单,而是做执行层的辅助:maker 挂单位置选择、母单切片的时机微调、以及和更慢信号的组合。诚实边界:模拟盘口没有撤单博弈和幌骗,真实 L2 数据里斜率估计对做市商批量撤单敏感;5 秒快照抹掉了快照间的事件序列(高阶)。
问题:盘口第一档之外的九档,到底有没有信息#
盘口不平衡(order book imbalance)是微观结构里最经典的短期方向信号:买一量远大于卖一量,下一笔价格变动大概率向上。这个信号人尽皆知,也因此衰减得厉害。
自然的追问是:第一档之外的挂单有没有增量信息? 十档行情摆在那里,大部分人只用了第一行。
一个优雅的观察角度是把订单簿看成一个形状而不是几个数字。大量实证研究发现,限价订单簿的挂单量随档位深度大致按指数衰减:
其中 是距最优价的档位数, 是衰减斜率。斜率小 = 深档挂单还很厚 = 这一侧的耐心资金多。于是方向信号可以定义为买卖两侧斜率之差:卖盘衰减快( 大)而买盘衰减慢( 小),意味着买方队伍深、卖方队伍浅,价格倾向上行。
这个信号比一档不平衡好在哪?它用了十档的全部形状信息,且对单档的噪声(一笔大单挂上又撤掉)天然钝感——OLS 拟合斜率相当于对十档做了加权平均。本文用受控模拟把它和两个经典对照掰一掰手腕,然后算一笔大多数论文不爱算的账:交易成本。
实验设计:把压力变量埋进盘口形状#
模拟 60000 个盘口快照(5 秒一张,约一个月)。核心是一个潜在压力变量 (AR(1),自相关 0.995,对应约 2 分钟半衰期的压力持续性),它同时驱动两件事:
- 盘口形状:,——买压大时买盘衰减慢、卖盘衰减快;
- 未来价格:下一快照 mid 收益的漂移项 。
每档挂单量再乘上对数正态噪声(σ=0.35),模拟真实盘口的脏数据:
import numpy as np
rng = np.random.default_rng(7)
T, L = 60000, 10 # 6万快照,10档
phi = 0.995 # 压力变量的持续性
x = np.zeros(T)
for t in range(1, T):
x[t] = phi * x[t-1] + np.sqrt(1 - phi**2) * rng.standard_normal()
kappa0, beta_k, A0 = 0.35, 0.18, 800.0
kgrid = np.arange(1, L + 1)
kap_b = kappa0 * np.exp(-beta_k * x) # 买压大 -> 买盘衰减慢
kap_a = kappa0 * np.exp(+beta_k * x)
Qb = A0 * np.exp(-kap_b[:, None] * kgrid) * rng.lognormal(0, 0.35, (T, L))
Qa = A0 * np.exp(-kap_a[:, None] * kgrid) * rng.lognormal(0, 0.35, (T, L))
# mid 价:漂移与 x 相关,每快照噪声 1.8bp
ret = 0.030e-4 * x + 1.8e-4 * rng.standard_normal(T)
mid = 20.0 * np.exp(np.cumsum(ret))python两种压力状态下的盘口长这样:

左图买压状态:绿色买盘从 B1 到 B10 衰减平缓,红色卖盘迅速变薄;右图反之。关键在于这个不对称分布在全部十档上——只看第一档,你只采样了形状的一个点。
信号构造:对 log 深度做 OLS#
对每张快照,把十档挂单量取对数,对档位序号回归,斜率的相反数就是 。全部快照可以向量化一次算完:
def slope_est(Q):
"""log Q_k = a - kappa*k 的 OLS 斜率,向量化处理全部快照"""
lq = np.log(Q) # (T, L)
k = kgrid - kgrid.mean() # 中心化的档位序号
return -(lq @ k) / (k @ k) # (T,)
kb_hat = slope_est(Qb)
ka_hat = slope_est(Qa)
slope_sig = ka_hat - kb_hat # >0: 卖盘衰减快 -> 看涨python两个对照信号,都是文献里的常客:
# 对照1:一档不平衡(经典 OBI)
imb1 = (Qb[:, 0] - Qa[:, 0]) / (Qb[:, 0] + Qa[:, 0])
# 对照2:五档总量不平衡
d5b, d5a = Qb[:, :5].sum(1), Qa[:, :5].sum(1)
imb5 = (d5b - d5a) / (d5b + d5a)python结果一:斜率信号全面压过两个对照#
三个信号对未来 mid 收益的 IC,预测步长从 1 快照(5 秒)扫到 160 快照(约 13 分钟):

| 信号 | IC @1 快照 | IC @20 快照 | IC @160 快照 |
|---|---|---|---|
| 斜率差(10 档) | 1.62% | 5.44% | 10.72% |
| 一档不平衡 | 0.20% | 1.13% | 2.13% |
| 五档量不平衡 | 1.04% | 4.34% | 8.17% |
三个观察:
第一,斜率信号在每个视界上都是第一名。 20 快照视界 IC 5.44%,是一档不平衡的近 5 倍。一档不平衡惨败的原因在模拟设定里看得很清楚:单档挂单量乘了 σ=0.35 的对数正态噪声,一个点的信噪比天然低;斜率估计用十个点做回归,噪声被平均掉了大半。这正是真实盘口的写照——第一档是撤单博弈最激烈、噪声最大的档位。
第二,五档总量不平衡追得很近(4.34% vs 5.44%),说明大部分增量信息来自「用了更多档」,小部分来自「用了形状」。 如果你的行情源只有五档,简单的量不平衡已经能吃到八成效果;斜率参数化的额外好处是输出一个有物理含义、跨股票可比的量纲( 不受挂单量绝对水平影响)。
第三,IC 随视界拉长而上升,这不是信号「越放越香」,而是压力变量半衰期约 2 分钟——比 5 秒长得多,信号对累计收益的预测自然随视界增长,直到压力本身衰减为止。160 快照(13 分钟)已接近这个上限。
十分位单调性检查(100 秒视界):

斜率信号从 D1 到 D10 干净单调,首尾分位差约 3bp / 100 秒。看起来很美——直到你想用 taker 单去吃它。
结果二:毛信号 0.2bp,半价差 2.5bp#
策略:信号 z 值超过 ±1 时建立方向仓位,持有 20 快照,每次仓位变化支付一次单边成本。扫描成本从 0 到 6bp:

| 信号 | 每笔毛收益 | 盈亏平衡成本 |
|---|---|---|
| 斜率差(10 档) | 0.20 bp | 1.0 bp |
| 五档量不平衡 | 0.17 bp | 0.5 bp |
| 一档不平衡 | 0.03 bp | 0.25 bp |
而这只 20 元股票、1 分钱最小报价单位的半价差就是 2.5bp——是斜率信号盈亏平衡成本的 2.5 倍,是每笔毛收益的 12 倍。
结论冷酷但必须直说:IC 5.44%、十分位完美单调的信号,用市价单交易在 100 秒视界上是结构性亏损的。 不是执行不够好,不是参数没调优——是毛信号量级(零点几个 bp)和过路费量级(几个 bp)差了一个数量级。这就是微观结构信号的普遍宿命:预测力是真的,可交易性是假的。
那这类信号的价值在哪?三个真实用途:
- Maker 侧的挂单决策。 做市商不付价差、赚价差。斜率信号告诉你哪一侧该挂得激进、哪一侧该退后一档——它不需要跨越价差,只需要在你反正要挂单的前提下优化位置。0.2bp 的边际改善乘以巨大的成交量,就是做市利润的重要来源。
- 执行算法的时机微调。 母单要在 30 分钟内买完 10 万股,切片的下单时机可以参考斜率信号:信号看涨时提前吃、看跌时多等等。信号不产生 alpha,它减少实现差价(implementation shortfall)。
- 和慢信号叠加改变激进度。 日频策略今天反正要买入某只股票,微观信号决定这一单用 taker 还是 maker、现在下还是等五分钟。信号的价值通过「省下的成本」变现,而不是通过独立回转交易。
一个容易忽略的估计细节:对数回归的加权问题#
对 做 OLS 隐含假设各档的对数噪声同方差。真实盘口远端档位挂单量小、相对噪声大,且可能出现零挂单(log 直接爆炸)。工程上的处理:
lq = np.log(np.maximum(Q, 1.0)) # 下限保护,1 手起
w = np.sqrt(np.arange(L, 0, -1)) # 近档加权:噪声小的档位权重大
# 加权 OLS:k、lq 先乘 sqrt(w) 再回归python另一个方案是干脆放弃参数化,用深度加权平均档位(每一侧挂单量的质心)代替斜率——质心对分布形状的假设更弱,对零挂单档位也稳健。模拟中两者高度相关(这里形状真是指数),但真实盘口在整数价位、大单支撑位附近有挂单尖峰,指数假设会被破坏,质心版本往往更稳。
已知偏差#
按老规矩,把模拟与真实的差距摆在明处:
- 没有撤单博弈和幌骗(spoofing)。 模拟的挂单噪声是无恶意的对数正态;真实盘口的深档大单可能是从不打算成交的幌单,斜率信号恰好是幌骗者最想操纵的统计量。实盘使用需要配合挂单存活时间过滤(只统计挂龄超过若干百毫秒的量)。
- 5 秒快照抹掉了事件序列。 快照之间的挂撤单顺序、成交侵蚀速度都是信息,事件驱动(event-by-event)的处理能提取更多,但工程成本完全不同。
- 压力变量直接驱动价格漂移,等于假设「盘口形状与未来收益的相关」这个命题为真。模拟能回答的是「如果形状有信息,斜率估计比一档不平衡多提取多少」,不能回答「真实市场的形状有没有信息」——后者只能拿真实 L2 数据验证,且答案随市场、随年份漂移。
结论#
三句话带走:
- 盘口深档有真实增量信息,参数化成斜率是提取它的稳健方式——20 快照 IC 从一档的 1.13% 升到 5.44%,噪声平均是主要功臣,五档总量不平衡能吃到八成效果。
- 预测力 ≠ 可交易性。 每笔毛收益 0.2bp 对半价差 2.5bp,taker 策略无解。评估任何微观结构信号,先把毛收益和价差放在同一张表里,再决定要不要继续。
- 这类信号的正确变现渠道是执行层:maker 挂单位置、母单切片时机、慢信号的激进度调节。它省成本,不赚 alpha——把它放对位置,0.2bp 也是钱;放错位置,5.44% 的 IC 也是亏损。
订单簿是市场上最贵的免费数据:人人都收得到十档行情,但从第一档之外读出信息、并且诚实计算这信息值几个 bp 的人,永远是少数。