报价深度失衡:用限价簿两侧挂单量预测短期价格方向
价差一样的两个盘口可以完全不是一回事:买一挂 5000 股、卖一挂 1200 股的盘口,下一跳大概率往上走。深度失衡 I = (B−A)/(B+A) 是限价簿里最便宜也最顽固的短期方向信号——只要买一卖一两个数字,不要逐笔、不要全簿。本文从做市商队列消耗的机制推导为什么它有预测力,2 万个模拟盘口快照实测:失衡最负的十分位下一跳上涨概率 23%、最正的十分位 77%,单调性完美;但信号衰减曲线显示相关性在 10-20 个快照后见顶然后快速衰减,200 步外只剩 0.07。最扎心的实验是成本:无成本时四档阈值策略全部单调赚钱,扣掉 1 个 tick 的跨价差成本后全部转为亏损——这个信号的经济学归宿不是「做多做空」而是「决定挂单还是吃单、现在执行还是等一等」。执行算法里它值真金白银,当独立策略它付不起过路费。诚实边界:可被幌骗操纵、大 tick 股票才显著、隐藏单和冰山单让可见深度失真(中阶)。
问题:价差相同的盘口,含义可以完全相反#
看两个盘口。价差都是 1 分钱,中间价都是 10.00:
- 盘口 A:买一 9.995 挂 5,000 股,卖一 10.005 挂 1,200 股
- 盘口 B:买一 9.995 挂 1,300 股,卖一 10.005 挂 6,400 股

任何只看价差、只看中间价的模型都认为这两个盘口一模一样。但直觉告诉你不是:盘口 A 里买方力量压制,下一次价格变动大概率向上;盘口 B 反之。把这个直觉写成一个数:
是买一挂单量, 是卖一挂单量。 买方深度占优, 卖方占优。盘口 A 的 ,盘口 B 的 。
这是限价簿研究里被验证得最充分的规律之一(Cao-Hansch-Wang 2009;Cont-Kukanov-Stoikov 2014 把它扩展成订单流失衡 OFI)。它便宜到过分:只要 Level-1 快照的两个数字,不要逐笔成交、不要十档深度、不要任何模型估计。本文用一个可控的模拟环境把它的预测力、衰减速度和——最重要的——成本之后还剩多少,全部量化出来。
机制:为什么挂单量能预测方向#
价格在 tick 网格上移动的微观机制是队列消耗竞赛。中间价要下移一个 tick,需要买一队列被完全吃光(或撤光);要上移一个 tick,需要卖一队列被清空。两条队列谁先被消耗完,价格就往谁的方向走。
把它简化成一个赛跑模型:市价买单以强度 到达并消耗卖一队列 ,市价卖单以强度 消耗买一队列 。如果两侧消耗速度大致对称,那么队列短的一侧先被击穿——卖一只有 1,200 股时,几笔市价买单就能把它吃穿,价格上移。这就是深度失衡预测力的第一层来源:它直接度量了哪一侧离被击穿更近。
第二层来源更微妙:挂单量本身携带信息。知情交易者想买时,会先撤掉自己在卖侧的挂单、在买侧堆积订单;做市商察觉到卖压时会削减买一挂单。所以 不只是「机械距离」,还是市场参与者意图的投票汇总。两层机制叠加,让这个信号在几乎所有做过检验的市场(美股、期货、加密货币)都稳定显著。
模拟环境按此机制搭建:买卖两侧挂单量走对数 AR(1) 过程(深度有持续性,符合实证),中间价变动概率是失衡的 logistic 函数,25% 的快照间隔发生价格变动:
def simulate_lob(T, alpha=0.35, tick=0.01, rng=None, persist=0.9):
logB, logA = np.empty(T), np.empty(T)
logB[0] = logA[0] = np.log(5000)
for t in range(1, T): # 两侧深度:对数 AR(1),均值回复到 5000 股
logB[t] = persist*logB[t-1] + (1-persist)*np.log(5000) + rng.normal(0, 0.25)
logA[t] = persist*logA[t-1] + (1-persist)*np.log(5000) + rng.normal(0, 0.25)
B, A = np.exp(logB), np.exp(logA)
I = (B - A) / (B + A)
mid = np.empty(T); mid[0] = 10.0
for t in range(T - 1):
p_up = 1 / (1 + np.exp(-6*alpha*I[t])) # 失衡越正,上跳概率越大
if rng.random() < 0.25: # 25% 的间隔发生变动
d = 1 if rng.random() < p_up else -1
else:
d = 0
mid[t+1] = mid[t] + d*tick
return B, A, I, midpython实测一:预测力的形状#
2 万个快照、约 5,000 次中间价变动。按前一时刻的失衡 分十分位,统计每组内下一跳向上的比例:

结果干净得像教科书:最负的十分位(卖方深度压制)下一跳上涨概率只有 23%,最正的十分位 77%,中间八组严格单调爬升,在 处恰好穿过 50% 无信息基准。从最悲观到最乐观的组,方向概率差了 54 个百分点——作为一个免费信号,这个区分度在微观结构里属于第一梯队。真实市场的实证(如 Cont et al. 对纳斯达克股票)形状完全相同,只是斜率因股票而异:tick 大、价差常年锁死在 1 个 tick 的股票斜率最陡(队列竞赛机制最纯粹),tick 小、价差多变的股票信号被价格的连续调整稀释。
实测二:信号衰减——它只值几个快照的寿命#
预测力有了,下一个问题是它能管多久。计算 与未来 步中间价变动的相关系数:

形状值得逐段读:
- 1 步相关 0.17,10-20 步爬到峰值 0.32——短跨度反而不是最高点,因为单步只有 25% 的概率发生价格变动,信号要几步才能「兑现」;
- 50 步跌到 0.19,200 步只剩 0.07——深度是 AR(1) 均值回复的,今天的失衡撑不过深度自身的记忆长度。
换算到真实市场(快照间隔几十毫秒到几秒),这个信号的有效寿命是秒级到分钟级。它是执行时点信号,不是持仓信号——这个定位直接决定了下一个实验的结局。
实测三:扣成本之前和之后,是两个世界#
按最直白的方式把它做成策略: 做多、 做空,持有 20 个快照平仓,四档阈值 :

左图(无成本):四条曲线全部稳定向上,阈值越高单笔均值越大(0.8 阈值单笔约 0.9 个 tick),信号质量与置信度单调挂钩,一切美好。
右图(扣 1 个 tick 成本):全部转为亏损。1 个 tick 是什么?就是跨价差成交的最低代价——你要立刻建仓,就得买在卖价、卖在买价,一进一出至少支付一个价差。而这个信号单笔的毛利润本来就不到 1 个 tick,过路费比货值贵。
这不是模拟的悲观设定,恰恰是这个信号在真实市场的经济学处境:预测的是「下一跳往哪走」,赌注和成本在同一个数量级。所以它的归宿从来不是独立策略,而是:
1. 执行算法的时点选择。 你反正要买 10 万股(父订单已定,成本沉没), 告诉你这一分钟是该激进吃单还是耐心挂单: 很正说明价格马上要上移,等待的代价高,现在跨价差也值; 很负说明可以挂在买一慢慢等成交。这时信号的价值不需要覆盖价差——它只需要在「早付价差」和「晚付更高价格」之间做出更好的权衡。实测中最正与最负十分位 54 个百分点的方向概率差,在执行层面就是实打实的滑点节省。
2. 做市商的报价偏移。 类似 Ho-Stoll 库存模型里库存驱动报价中心,深度失衡驱动的是逆向选择预期: 很正时卖一侧挂单即将被击穿,做市商应该把卖单撤远一点或减量——不是为了赚方向,是为了少被知情流碾过。
3. 已有 alpha 的入场微调。 信号本身付不起价差,但如果你已经有一个持仓周期几天的 alpha,用 微调入场那几分钟的执行,成本几乎为零、改善直接落袋。
诚实边界#
可见深度可以被操纵。 挂单不等于真实意图:幌骗(spoofing)就是在一侧堆大额挂单制造假失衡、诱导价格后撤单反向成交。虽然主要市场对幌骗的执法已经很严,但小市值、监管弱的品种(部分加密货币交易所)里,把 当真信号用等于给操纵者送钱。缓解方法是用加权深度(按挂单存活时间加权,新挂大单权重打折)或直接用成交驱动的 OFI/订单流失衡交叉验证。
隐藏单和冰山单让分母失真。 和 只是可见深度。冰山单只露出一角,暗池和隐藏单完全不进快照。实证上美股可见深度只占真实可成交流动性的一部分,且比例在不同股票间差异巨大——跨股票比较 的绝对值意义有限,各自标准化(如按自身历史分位数)后再用。
tick 结构决定信号强度。 队列竞赛机制要求价差经常锁死在最小报价单位上。大 tick 股票(股价低、tick 相对大)信号最强;小 tick 股票价格可以连续滑动,深度失衡还没兑现队列击穿,价格已经被报价调整消化了。A 股 0.01 元 tick 对低价股是大 tick 环境(信号应较强),对贵州茅台这种千元股则是极小 tick 环境。
模拟的因果是注入的。 本文模拟中「失衡→方向」的因果是构造时写进去的,实测数字(23%/77%、峰值相关 0.32)展示的是方法的形状而非真实市场的参数。真实市场里这条曲线的斜率必须逐标的重估,且会随波动率状态漂移。
同主题延伸:订单流失衡 OFI把失衡从存量(挂单量)升级到流量(挂单变化+成交);限价簿队列位置价值讨论同一条队列里排位的经济学;LSTM 学习 LOB 失衡是本文线性直觉的非线性延伸。