微观结构叠加层: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,能让这个读数在不同时刻和不同合约之间可比。
- 微观价格是对下一个价格的预测吗?
- 它是在当前队列条件下、价差内部的一个公允价值。作为短周期估计量,它优于中间价,但它是对当下订单簿的读数,面板的说明里也明确写了这一点。