订单失衡与收益:用成交方向净额预测下一段价格
把一段时间内的买单量减卖单量、除以总量,得到订单失衡 OI ∈ [-1,1]——这是订单流预测里最直白的一个数。它有预测力的机制不是玄学:价格冲击让净买压直接推高价格,而拆单和羊群行为让失衡有自相关、会延续到下一个 bar。5000 个 5 分钟 bar 的模拟实测:OI 最低十分位下一 bar 平均收益 -6.4bp、最高十分位 +4.9bp,十组单调;但预测性衰减极快——OI 与未来收益的相关性从 h=1 的 0.21 跌到 h=5 的约 0,寿命只有一两个 bar。策略实验最诚实:阈值策略毛收益 117%,扣 3bp 单边成本后只剩 12%——3476 次换手把利润基本磨光。它的正确用法是执行择时与已有信号的入场微调,不是独立策略。诚实边界:方向分类本身有错标、失衡可被大单方拆单制造、参数换个市场就要重估(中阶)。
问题:知道每笔是买是卖之后,然后呢?#
前面几篇我们花了大力气解决「每笔成交是买方发起还是卖方发起」:Lee-Ready 用报价中点判、BVC 用成交量分布近似。假设你已经拿到了每笔成交的方向标签,接下来最自然的一步是什么?
把它们加总。取一段时间窗口(比如一个 5 分钟 bar),把买方发起的成交量记作 、卖方发起的记作 ,定义订单失衡(Order Imbalance):
表示这段时间全是买单打上来, 表示全是卖单砸下去, 表示买卖均衡。这是订单流分析里最直白、最不需要解释的一个数。
问题是:当期的 OI 对下一段的收益有没有预测力? 答案是有,而且机制清楚——但寿命短、毛利薄,这篇文章把三件事都量化出来。
机制:为什么失衡能延续到下一个 bar#
OI 预测未来收益,需要两个环节同时成立:
环节一:净买压推高价格(价格冲击)。 这不需要论证——从 Kyle 的 λ 到 MRR 的 θ,前面每一篇微观结构模型都在说同一件事:订单流带信息,做市商看到净买压就上调报价。当期 OI 与当期收益正相关,是市场的定价机制本身。
环节二:失衡有惯性(订单流自相关)。 这才是预测力的来源。如果 OI 是白噪声,那当期失衡再大也说明不了下一期。但真实市场的订单流有强自相关,原因至少有三个:
- 拆单:机构要买 500 万股,不会一笔打完,而是切成几百笔在几小时内执行——同一个母单在连续多个 bar 里持续制造买方失衡;
- 羊群:动量交易者看到价格上行会跟进买入,把失衡延续下去;
- 信息扩散:利好不是所有人同时知道的,先知先觉者买完之后,后知后觉者接着买。
两个环节串起来:当期 OI 高 → 下一期 OI 大概率还是高(惯性)→ 下一期还有净买压 → 下一期价格继续被推高。预测力的本质不是「失衡预知未来」,而是「失衡自己会延续,而延续的失衡继续冲击价格」。
这也直接告诉你信号什么时候失效:当拆单执行完毕、羊群散去,自相关断掉,OI 就只剩当期解释力、没有预测力了。
模拟验证:单调性、惯性与衰减#
真实逐笔数据难以公开复现,我们按上述机制造一个可控实验:5000 个 5 分钟 bar,订单流按 AR(1) 生成(自相关系数 0.35,模拟拆单惯性),价格收益 = 永久冲击 × OI + 独立噪声。
import numpy as np
rng = np.random.default_rng(42)
n_bars = 5000
lam = 0.0015 # 单位失衡的价格冲击:15bp
phi = 0.35 # 订单流自相关(拆单/羊群)
sigma_noise = 0.0012 # 与订单流无关的价格噪声
# AR(1) 生成订单失衡序列,tanh 压缩到 [-1, 1]
oi = np.zeros(n_bars)
eps = rng.standard_normal(n_bars)
for t in range(1, n_bars):
oi[t] = phi * oi[t-1] + np.sqrt(1 - phi**2) * eps[t]
oi = np.tanh(oi * 0.8)
# 当期收益由当期失衡驱动
ret = lam * oi + sigma_noise * rng.standard_normal(n_bars)
# 检验:当期 OI 对下一期收益的预测
next_ret = np.roll(ret, -1)[:-1]
oi_now = oi[:-1]
print(np.corrcoef(oi_now, next_ret)[0, 1]) # ≈ 0.21python注意这个实验的干净之处:下一期收益只由下一期的 OI 驱动,当期 OI 对它的预测力完全来自订单流的自相关——机制和真实市场一致。
结果一:十分位单调#
把当期 OI 分成十组,看每组下一个 bar 的平均收益:

最低十分位(最强卖压)下一 bar 平均 -6.4bp,最高十分位(最强买压)+4.9bp,中间八组基本单调过渡。方向对、排序对,这个信号在统计上是真的。
结果二:惯性是预测力的全部来源#
订单失衡自身的自相关函数:

滞后 1 阶自相关 0.355(就是我们设的 φ),2 阶之后迅速趋零。这张图就是预测力的「燃料表」——OI 的可预测性完全由这条自相关曲线决定。真实市场里日内订单流的一阶自相关通常在 0.2~0.5 之间,量级与此一致。
结果三:衰减快得残忍#
OI 对未来第 h 个 bar 收益的相关性:

h=1 时相关性 0.21,h=2 骤降,h=5 之后已经与零无异。5 分钟 bar 意味着这个信号的有效寿命大约十几分钟——它是执行层的信号,不是持仓层的信号。想拿 OI 做隔夜仓,等于用秒表测量季节。
策略实验:毛利真实,净利残酷#
按最直白的方式做策略:OI > 0.3 做多下一个 bar,OI < -0.3 做空,其余空仓。
th = 0.3
pos = np.where(oi_now > th, 1, np.where(oi_now < -th, -1, 0))
gross = pos * next_ret # 毛收益
trades = np.abs(np.diff(np.r_[0, pos])) # 换手次数
net = gross - trades[:len(gross)] * 0.0003 # 单边 3bp 成本python
结果:5000 个 bar 里毛收益累计 +117%,看起来像印钞机;但策略换手 3476 次,扣掉每边 3bp 的成本后只剩 +12%。九成利润交了过路费。
这与上一篇报价深度失衡的结论形成呼应,但程度不同:深度失衡扣成本后直接转亏,OI 还能剩一点——因为 OI 聚合了一整个 bar 的信息,单次信号的毛利比单次盘口快照厚一些。但结论方向一致:这类微观结构信号的经济价值主要在执行端——
- 入场择时:你的 alpha 模型说今天该买,OI 持续为负时等一等、OI 转正时进场,能省下真金白银的冲击成本;
- 执行算法:拆单执行时避开与失衡同向抢流动性,或在失衡反向时加速;
- 风控预警:持仓股票 OI 持续单边恶化,是比价格下跌更早的警报。
诚实边界#
方向标签本身有错。OI 的地基是成交方向分类,而 Lee-Ready 有 10-15% 错标率、BVC 给的是概率化近似。标签的噪声直接稀释 OI 的信号强度——你测出来的预测力永远是真实预测力的打折版。
失衡可以被制造。知道市场看 OI 的人可以利用它:把大买单拆得更碎去「温和地」制造持续正失衡吸引跟风,然后反手出货。和深度失衡可被幌骗操纵一样,任何公开可算的信号都会被博弈。
参数不可移植。φ=0.35、15bp 冲击是模拟设定;真实市场里不同股票、不同时段的订单流自相关差异巨大——大盘股拆单周期长、失衡惯性强,小盘股一笔大单就是全部故事。换标的必须重估衰减曲线,直接套参数等于闭眼开车。
bar 粒度是隐藏参数。5 分钟 bar 是本文选择;切 1 分钟信号更快但噪声更大,切 30 分钟惯性被平均掉。和 BVC 的 bar 大小一样,这是一个没有免费答案的权衡。
OI 是微观结构信号里性价比最高的入门款:定义一句话说得清,机制两个环节讲得明,计算一行代码写得完。它教会你的最重要一课不是「怎么赚钱」,而是信号的统计显著性和经济可行性是两回事——十分位完美单调的信号,也可能付不起自己的交易成本。