halo 的技术博客

返回

问题:价差相同的盘口,含义可以完全相反#

看两个盘口。价差都是 1 分钱,中间价都是 10.00:

  • 盘口 A:买一 9.995 挂 5,000 股,卖一 10.005 挂 1,200 股
  • 盘口 B:买一 9.995 挂 1,300 股,卖一 10.005 挂 6,400 股

两种盘口对比与失衡分布

任何只看价差、只看中间价的模型都认为这两个盘口一模一样。但直觉告诉你不是:盘口 A 里买方力量压制,下一次价格变动大概率向上;盘口 B 反之。把这个直觉写成一个数:

It=BtAtBt+At[1,+1]I_t = \frac{B_t - A_t}{B_t + A_t} \in [-1, +1]

BtB_t 是买一挂单量,AtA_t 是卖一挂单量。I>0I > 0 买方深度占优,I<0I < 0 卖方占优。盘口 A 的 I=+0.61I = +0.61,盘口 B 的 I=0.66I = -0.66

这是限价簿研究里被验证得最充分的规律之一(Cao-Hansch-Wang 2009;Cont-Kukanov-Stoikov 2014 把它扩展成订单流失衡 OFI)。它便宜到过分:只要 Level-1 快照的两个数字,不要逐笔成交、不要十档深度、不要任何模型估计。本文用一个可控的模拟环境把它的预测力、衰减速度和——最重要的——成本之后还剩多少,全部量化出来。

机制:为什么挂单量能预测方向#

价格在 tick 网格上移动的微观机制是队列消耗竞赛。中间价要下移一个 tick,需要买一队列被完全吃光(或撤光);要上移一个 tick,需要卖一队列被清空。两条队列谁先被消耗完,价格就往谁的方向走。

把它简化成一个赛跑模型:市价买单以强度 μB\mu_B 到达并消耗卖一队列 AA,市价卖单以强度 μS\mu_S 消耗买一队列 BB。如果两侧消耗速度大致对称,那么队列短的一侧先被击穿——卖一只有 1,200 股时,几笔市价买单就能把它吃穿,价格上移。这就是深度失衡预测力的第一层来源:它直接度量了哪一侧离被击穿更近

第二层来源更微妙:挂单量本身携带信息。知情交易者想买时,会先撤掉自己在卖侧的挂单、在买侧堆积订单;做市商察觉到卖压时会削减买一挂单。所以 II 不只是「机械距离」,还是市场参与者意图的投票汇总。两层机制叠加,让这个信号在几乎所有做过检验的市场(美股、期货、加密货币)都稳定显著。

模拟环境按此机制搭建:买卖两侧挂单量走对数 AR(1) 过程(深度有持续性,符合实证),中间价变动概率是失衡的 logistic 函数,25% 的快照间隔发生价格变动:

实测一:预测力的形状#

2 万个快照、约 5,000 次中间价变动。按前一时刻的失衡 II 分十分位,统计每组内下一跳向上的比例:

上涨概率 vs 深度失衡

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

实测二:信号衰减——它只值几个快照的寿命#

预测力有了,下一个问题是它能管多久。计算 ItI_t 与未来 hh 步中间价变动的相关系数:

信号衰减曲线

形状值得逐段读:

  • 1 步相关 0.17,10-20 步爬到峰值 0.32——短跨度反而不是最高点,因为单步只有 25% 的概率发生价格变动,信号要几步才能「兑现」;
  • 50 步跌到 0.19,200 步只剩 0.07——深度是 AR(1) 均值回复的,今天的失衡撑不过深度自身的记忆长度。

换算到真实市场(快照间隔几十毫秒到几秒),这个信号的有效寿命是秒级到分钟级。它是执行时点信号,不是持仓信号——这个定位直接决定了下一个实验的结局。

实测三:扣成本之前和之后,是两个世界#

按最直白的方式把它做成策略:I>θI > \theta 做多、I<θI < -\theta 做空,持有 20 个快照平仓,四档阈值 θ{0.2,0.4,0.6,0.8}\theta \in \{0.2, 0.4, 0.6, 0.8\}

成本前后的策略表现

左图(无成本):四条曲线全部稳定向上,阈值越高单笔均值越大(0.8 阈值单笔约 0.9 个 tick),信号质量与置信度单调挂钩,一切美好。

右图(扣 1 个 tick 成本):全部转为亏损。1 个 tick 是什么?就是跨价差成交的最低代价——你要立刻建仓,就得买在卖价、卖在买价,一进一出至少支付一个价差。而这个信号单笔的毛利润本来就不到 1 个 tick,过路费比货值贵

这不是模拟的悲观设定,恰恰是这个信号在真实市场的经济学处境:预测的是「下一跳往哪走」,赌注和成本在同一个数量级。所以它的归宿从来不是独立策略,而是:

1. 执行算法的时点选择。 你反正要买 10 万股(父订单已定,成本沉没),II 告诉你这一分钟是该激进吃单还是耐心挂单:II 很正说明价格马上要上移,等待的代价高,现在跨价差也值;II 很负说明可以挂在买一慢慢等成交。这时信号的价值不需要覆盖价差——它只需要在「早付价差」和「晚付更高价格」之间做出更好的权衡。实测中最正与最负十分位 54 个百分点的方向概率差,在执行层面就是实打实的滑点节省。

2. 做市商的报价偏移。 类似 Ho-Stoll 库存模型里库存驱动报价中心,深度失衡驱动的是逆向选择预期II 很正时卖一侧挂单即将被击穿,做市商应该把卖单撤远一点或减量——不是为了赚方向,是为了少被知情流碾过。

3. 已有 alpha 的入场微调。 信号本身付不起价差,但如果你已经有一个持仓周期几天的 alpha,用 II 微调入场那几分钟的执行,成本几乎为零、改善直接落袋。

诚实边界#

可见深度可以被操纵。 挂单不等于真实意图:幌骗(spoofing)就是在一侧堆大额挂单制造假失衡、诱导价格后撤单反向成交。虽然主要市场对幌骗的执法已经很严,但小市值、监管弱的品种(部分加密货币交易所)里,把 II 当真信号用等于给操纵者送钱。缓解方法是用加权深度(按挂单存活时间加权,新挂大单权重打折)或直接用成交驱动的 OFI/订单流失衡交叉验证。

隐藏单和冰山单让分母失真。 BBAA 只是可见深度。冰山单只露出一角,暗池和隐藏单完全不进快照。实证上美股可见深度只占真实可成交流动性的一部分,且比例在不同股票间差异巨大——跨股票比较 II 的绝对值意义有限,各自标准化(如按自身历史分位数)后再用。

tick 结构决定信号强度。 队列竞赛机制要求价差经常锁死在最小报价单位上。大 tick 股票(股价低、tick 相对大)信号最强;小 tick 股票价格可以连续滑动,深度失衡还没兑现队列击穿,价格已经被报价调整消化了。A 股 0.01 元 tick 对低价股是大 tick 环境(信号应较强),对贵州茅台这种千元股则是极小 tick 环境。

模拟的因果是注入的。 本文模拟中「失衡→方向」的因果是构造时写进去的,实测数字(23%/77%、峰值相关 0.32)展示的是方法的形状而非真实市场的参数。真实市场里这条曲线的斜率必须逐标的重估,且会随波动率状态漂移。

同主题延伸:订单流失衡 OFI把失衡从存量(挂单量)升级到流量(挂单变化+成交);限价簿队列位置价值讨论同一条队列里排位的经济学;LSTM 学习 LOB 失衡是本文线性直觉的非线性延伸。

报价深度失衡:用限价簿两侧挂单量预测短期价格方向
https://blog.halo26812.eu.org/blog/quoted-depth-imbalance
Author halo
Published at 2026年7月27日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨