OFI 详解:订单流失衡(模型版)到底是怎么运作的

OFI —— Cont–Kukanov–Stoikov 意义上的订单流失衡 —— 衡量订单簿内部逐渐累积的净压力:买盘层层堆叠、卖盘悄然撤走、队列变厚或变薄,逐档计算。它不是你已经熟悉的足迹图失衡,它读取市场的位置完全不同:读的是挂在簿上的订单,而不是已成交的交易。

Senzoukria · 学习 · 更新于 2026 年 9 月


先澄清一个名词冲突。如果你是从足迹图交易过来的,“order flow imbalance”在你那里多半指的是足迹图里主动买盘在相邻价位压倒卖盘的那种单元格 —— 那部分我们放在 足迹图上的订单流失衡里讲。这个页面讲的是另一回事:OFI,也就是 Cont、Kukanov 和 Stoikov 提出的订单簿模型,市场微观结构中被引用最多的成果之一。词一样,仪器不同:足迹图读的是已成交的交易,OFI 读的是挂在簿上的订单

核心思路:价格移动,是因为订单簿在动

盯着 DOM 看几分钟,机制就很清楚:当最优卖档的队列被吃掉或被撤单、同时下方不断堆进新的买单时,价格就往上跳一个 tick。价格根本不需要任何一笔成交就能移动 —— 一笔大卖单被撤走,对平衡的影响不亚于一笔市价买单把它吃掉。OFI 把这个观察压缩成每个区间的一个数字:

  • 买盘一侧:如果某一档的买价上移,把新的挂单量记为买方压力(+)。如果价格不变,记挂单量的变化。如果买价回撤,把原先的挂单量记为失去的压力(−)。
  • 卖盘一侧,镜像处理:卖价靠近或挂单量增加是卖方压力(−);卖价后退或挂单量减少则是卖方压力的消退(+)。

把这些贡献在区间内求和,就得到 OFI:订单簿净向买方加载时为正,供给不断堆积时为负。多档(整合)版本在最优的前 N 档上各算一次 —— 十档是通行做法 —— 再相加。同一个订单簿相隔四分之一秒的两张快照,能把这套算术讲得很具体:

Two snapshots of the top of the order book a quarter of a second apart: asks stacking, an offer being lifted and then cancelled, bids being added and bids being pulled — each signed change summing into one order-flow-imbalance number, far larger than the volume that actually traded.BOOK NOWthe resting book250 MS LATERwhat changedSIGNED CHANGEΔ bid size − Δ ask sizeasks · resting supplyaddedremovedbids · resting demand5431.751805431.503005431.251205431.0021024090340150spread60 new asks join the queue−6060 lifted, 150 cancelled+210220 added to the bid+22060 cancelled−60OFIall four rows, added up+310TAPEonly the lift at 5431.50+60Both numbers describe the interval that has just closed — OFI explains the move you arewatching, not the one coming next. That is the honest limit of the model.
OFI counts what happened to the book, not to the tape. Four levels changed here and only one of them printed a trade: 60 contracts lifted, against 310 contracts of net pressure added, pulled and queued. That gap is why the book explains the move you are watching better than trade volume does — and, because both are read over the interval that has already closed, why neither of them is a forecast.

为什么它在解释价格变动上胜过基于成交的指标

这是最值得记住的部分。在后续研究(Cont、Cucuringu 与 Zhang,2023)中,整合十档的 OFI 解释了大约 87 % 的同期价格方差。仅最优档:约 71 %。带符号的成交量 —— 也就是 CVD 的原料 —— 只有约 33 %。这并不是说 CVD 没用,而是说:真正推动价格的东西,大部分从未打印在成交明细上。订单被挂上、订单被撤走、队列被削薄 —— 订单簿在成交与成交之间不停重塑,而 OFI 正是看得见这一切的仪器。

诚实的局限:同期,而非预测

以下是卖“订单流信号”的人不会告诉你的:那 87 % 是同期的。OFI 解释的是同一区间内正在发生的变动。用过去的 OFI 去预测下一分钟,样本外 R² 会变成负值。OFI 是一种状态读数 ——“订单簿此刻正在买方一侧加载” —— 而不是预测。它依然有实实在在的价值:在一个你本来就关注的价位上(吸收区、gamma 墙、VWAP 带)作为确认,持续的 OFI 推力会告诉你订单簿是否同意你的判断。

归一化 —— 人人都会跳过的一步

原始 OFI 的单位是合约张数,因此它的量级完全取决于订单簿有多厚。同样的 +400,在夜盘的薄簿上是一记猛推,在伦敦开盘时只是四舍五入的误差。除以每档的平均深度(一条走得很慢的均线),这个数字就能在不同时段、不同合约之间比较。Senzoukria 默认就做这一步归一化 —— 你在 QI · OFI 指标里看到的 OFI 是按深度归一化的,不是原始值。

在 Senzoukria 里读 OFI

微观结构(quant)指标显示三个相关读数:微观价格线(买卖价差内部、按队列加权的公允价格)、队列失衡(QI,−1 到 +1,仅最优档)以及归一化的多档 OFI,按可配置的订单簿事件数做平滑。一个实用的用法:先定好你的价位 —— 来自 成交量分布吸收区 GEX 墙 —— 然后让 QI 和 OFI 在你下单的那一刻告诉你订单簿是否支持这笔交易。是共振,不是预言。

OFI 与你工具箱里的其他指标

  • OFI 对 CVD:CVD 是成交明细(成交了什么),OFI 是订单簿(什么在等待、出现、消失)。两者的背离很有信息量:价格在涨、CVD 在涨,但 OFI 走平,说明这波上涨正在吃掉一个不再补充的订单簿。
  • OFI 对 DOM:DOM 展示的是订单簿的状态;OFI 把它的变化压缩成一条带符号的流,你不用盯着四十行数字也能跟住。
  • OFI 对足迹图失衡:足迹图失衡是在特定价位上被确认的主动性;OFI 则是在这些成交之前和之间不断累积的压力。

常见问题

OFI 和足迹图上的失衡是一回事吗?
不是。足迹图失衡比较的是相邻价位上已成交的主动量 —— 已经发生的交易。OFI 衡量的是挂单簿的变化:买盘被加上、卖盘被撤走、队列变厚或变薄。一个读成交,一个读订单簿。两者互为补充。
OFI 有预测能力吗?
说实话:没有,至少不是大家期待的那种。OFI 是同期指标 —— 它对当下正在发生的价格变动的解释力,远强于基于成交量的指标。但在已发表的研究中,用滞后的 OFI 去预测下一分钟,样本外 R² 是负的。请把它当作订单簿的状态读数,而不是水晶球。
OFI 和 CVD(累计 delta)有什么不同?
CVD 累加带符号的已成交量 —— 它只看得见成交。OFI 还看得见从未成交的部分:挂到买盘的订单、从卖盘撤走的订单、队列的耗尽。在 Cont–Cucuringu–Zhang 的研究中,整合的多档 OFI 解释了约 87 % 的同期收益率,而带符号成交量约为 33 %。推动价格的,订单簿多于成交明细。
为什么 OFI 需要按深度归一化?
同样是 +500 的 OFI,在厚的订单簿和薄的订单簿上意义完全不同。除以每档的平均深度,数值才能在不同合约之间、以及同一时段的不同时刻之间做比较。不做归一化,比较两个 OFI 读数毫无意义。
OFI 应该取多少档?
仅最优档本身就已经带有大部分信号,但研究结论明确:整合更深的档位有帮助。十档约有 87 % 的同期 R²,而仅最优档约为 71 %。十档是标准配置,也是 Senzoukria 的默认设置。