微观结构叠加层:Stoikov 微观价格、队列失衡与 OFI

微观结构叠加层读取实时订单簿,把 Stoikov 微观价格画成一条拖尾线,并给出 L1 队列失衡和按深度归一化的多档订单流失衡(OFI)刻度。它是对当下状态的读数,不是预测器。

Senzoukria · 文档 · 更新于 2026 年 9 月


位置

位置
图表 → 指标面板 → 「量化模型」分组 → 「Microstructure(量化)」
默认
关闭。OFI 档位数 10,微观价格线开启,QI / OFI 刻度开启,拖尾 180 秒,OFI 平滑 20 个事件
所需数据
实时深度数据流(按最优价优先排序的 L2 快照),由 Rithmic footprint 图表提供,这个叠加层也接在那里。没有订单簿就没有输出

它做什么

每个深度快照上都会计算三项对订单簿状态的读数。微观价格(Stoikov)是价差内部、按对侧队列加权的公允价格:P_micro = Pb + I × (Pa − Pb),其中 I = Qb / (Qb + Qa)。买方队列很大会把它推向卖价。队列失衡是第一档的 (Qb − Qa) / (Qb + Qa),取值在 [−1, +1]。订单流失衡(OFI)在 N 个档位上汇总两次快照之间每一侧新增、撤走或移动的挂单量,遵循被扩展到多档的 Cont-Kukanov-Stoikov 方法。

OFI 会按每档平均深度的 EMA 做归一化,因此这个数值在不同合约之间、以及同一时段的不同时刻之间都可比。没有这层归一化,原始数字在一个订单簿、一个瞬间之外没有任何意义。

在图表上,微观价格画成最近若干秒的拖尾线,另有一个刻度显示队列失衡和平滑后的 OFI。两项读数都由 Rithmic footprint 图表的深度快照计算;在没有订单簿的图表上,这个叠加层保持为空。

参数设置

指标面板中列出的微观结构设置
设置默认改变什么
OFI 档位数10(1–20)每侧纳入 OFI 计算的订单簿档位数;合约或该数值变化时,OFI 状态会被重建
微观价格线开启在价格坐标上画出 Stoikov 微观价格的拖尾
QI / OFI 刻度开启显示 L1 队列失衡和平滑后的 OFI 刻度
线条颜色#e6e6e6微观价格拖尾的颜色
拖尾长度180 秒(30–600,步长 30)屏幕上保留多少秒的微观价格历史
拖尾宽度1 px(1–4,步长 0.5)拖尾的描边宽度
OFI 平滑20 个事件(1–100)归一化 OFI 进入刻度之前所施加 EMA 的事件长度;取 1 表示显示原始值

怎么用

把微观价格与最后成交价对照着读:当它位于中间价之上时,挂单簿在买方更重,在那一瞬间下一笔成交更可能是上涨 tick 而不是下跌 tick。把 OFI 刻度读作此刻正在发生的压力,并与正在形成的那根 K 线的 footprint delta 一起看。

在深档数据陈旧的清淡订单簿上调低「OFI 档位数」;在 ES 这类跳动价位较大的合约上调高它,因为只看最前面几档太粗糙。如果更新速率很高导致刻度难以阅读,请加大「OFI 平滑」。

限制与易错点

  • 原始研究说得很明确:OFI 解释的是同期收益率,而不是未来收益率。滞后的 OFI 在 1 分钟尺度上的样本外 R² 为负。不要把这个刻度当作预测。
  • 第一个快照只用来建立基准;在第二个快照到达之前,OFI 不返回任何东西。
  • 订单簿一侧为空时返回 null 的微观价格,而不是一个猜出来的数值;没有交易所时间戳的快照会被跳过,而不是打上本地时钟。
  • 深度数据由你的数据供应商计费;订阅中必须开通 L2。
  • 这个叠加层由 Rithmic footprint 图表供数;NinjaTrader 和 Quantower 的桥接图表不向它供数。

其他语言版本

常见问题

为什么 OFI 需要按深度归一化?
500 手的原始 OFI,在每档 2 000 手的 09:30 和每档 300 手的 13:00,意义完全不同。除以 N × 每档平均深度的 EMA,能让这个读数在不同时刻和不同合约之间可比。
微观价格是对下一个价格的预测吗?
它是在当前队列条件下、价差内部的一个公允价值。作为短周期估计量,它优于中间价,但它是对当下订单簿的读数,面板的说明里也明确写了这一点。