问题不在于你不会看盘口,而在于你只看到了最后一声枪响,却没有追踪枪响之前发生了什么。
限价订单簿不是一张静态的买卖报价表。挂单、撤单、市价单吃单、队列位置变化,这些事件持续发生,彼此叠加,最终推动中间价漂移。成交量只是结果的一部分,真正决定短期价格冲击的,是买卖两侧订单流的变化速度与方向。
这就是订单流不平衡,简称订单流不平衡指标。它不负责给你预测下一跳价格的神谕,也不会替你挡住滑点和爆仓。但它能把盘口里那些散乱的动作,压缩成一套可以建模、回测和执行的量化语言。
盘口不是成交记录,而是一场持续变化的攻防
先把最容易犯的错误掰开。
假设当前买一价格为 \(P_t^b\),卖一价格为 \(P_t^a\),买一挂单量为 \(V_t^b\),卖一挂单量为 \(V_t^a\)。你看到卖一出现一笔大单,直觉是"上方压力很重"。但这笔卖单可能在几百毫秒后撤掉,也可能只是做市商用来测试买方反应的虚假流动性,还可能在价格触及前被其他订单抢先成交。
反过来,买一挂着的大量买单,也不等于下面有人死守。它可能被快速撤掉,也可能只是排在你前面的队列即将被清空,而你自己的订单根本没有成交机会。
盘口真正记录的是一连串事件:
- 新的限价买单进入买方队列,增加买方深度;
- 买方限价单撤单,减少买方深度;
- 市价卖单主动吃掉买一,削弱买方队列;
- 新的限价卖单进入卖方队列,增加卖方深度;
- 卖方限价单撤单,减少卖方深度;
- 市价买单主动吃掉卖一,削弱卖方队列;
- 某一侧最优价位被耗尽,报价向更差一档移动;
- 新报价补回原有深度,价格暂时没有继续扩散。
如果你的模型只记录成交量,不记录挂单和撤单,那么你看到的是已经发生的冲击,而不是冲击正在形成的过程。
盘口里最危险的误判,是把"挂在那里"当成"愿意在那里成交"。
2014年,Cont、Kukanov与Stoikov提出标准化的订单流不平衡指标,将买一和卖一处的限价挂单、撤单以及市价成交纳入同一套加性框架。他们研究的核心不是"成交量越大价格越涨"这种粗糙结论,而是买卖两侧订单事件的净变化,如何与短期价格变化建立线性响应关系。
这条关系通常写成:
\[
\Delta P_t=\beta \cdot OFI_t+\varepsilon_t
\]
其中,\(\Delta P_t\) 是某一时间窗口内的价格变化,\(OFI_t\) 是订单流不平衡,\(\beta\) 是市场对订单流冲击的响应系数,\(\varepsilon_t\) 则代表模型没有捕捉到的噪声、隐藏单、跨市场冲击以及其他无法直接观察的因素。
这不是一条可以拿来无脑追单的公式。它告诉你的,是价格变化和订单簿事件之间存在结构化联系。至于你能不能从这条联系里提取出交易优势,取决于数据质量、时间窗口、盘口规则、交易成本和执行速度。
OFI到底在统计什么
最简单的订单流不平衡,可以理解为一段时间内买方有效订单事件与卖方有效订单事件的差值。
买方增加流动性,通常会增强买方订单簿;买方撤单,通常会削弱买方订单簿;卖方主动成交,则会消耗卖方流动性;卖方撤单,则会减少卖方供给。不同研究和不同市场会采用略有差异的事件编码,但核心都绕不开一个问题:
这一笔订单事件,究竟让买方更强,还是让卖方更强?
在最佳买卖价位上,可以把事件贡献拆开来看。
买方事件的基本方向
当新的限价买单进入买一,买一价格不变但挂单量增加,买方深度增强,订单流不平衡向正方向移动。
当买一价格上移,说明买方报价变得更积极。若新的买一价格高于原买一,原有买方流动性已经被重新定价,事件通常带来更强的正向贡献。
当买一挂单撤掉,买方深度减少,订单流不平衡向负方向移动。这里必须小心:撤单不等于卖出。它表达的是买方流动性撤离,而不是一笔真实的主动卖出成交。
卖方事件的基本方向
当新的限价卖单进入卖一,卖方深度增加,市场上方的可见供给增强,订单流不平衡通常向负方向移动。
当卖一价格下移,说明卖方报价变得更激进,卖方愿意在更低价格成交,负向冲击增强。
当卖一挂单撤掉,卖方可见流动性减少。对买方而言,这相当于上方阻力变薄,订单流不平衡向正方向移动。
这就是为什么单纯观察"成交方向"不够。某一时刻没有任何成交,但如果卖一连续撤单、买一持续补单,盘口依旧发生了明显的力量变化。等到市价买单真正出现时,价格可能已经处于容易被击穿的位置。
用事件而不是快照构建数据
很多初学者从行情软件里抄一张五档盘口,计算买卖总量,然后直接得出"买方占优"。这类指标只能描述一个时刻的静态状态,不能描述订单簿在这个时刻之前经历了什么。
两个完全不同的盘口,可能拥有相同的买卖挂单量:
- 第一个盘口是买方持续补单、卖方持续撤单形成的;
- 第二个盘口是买方刚刚停止补单、卖方刚刚重新挂回来的;
- 第三个盘口是双方都没有动作,只是短暂停留;
- 第四个盘口则是大量订单在同一价位快速进出,表面深度稳定,实际队列已经被反复重排。
四张截图看起来一样,下一步的价格行为却可能完全不同。
因此,构建订单流不平衡时,至少要保存逐笔更新事件、价格、数量、方向、时间戳以及盘口位置。只保存固定间隔的快照,会把大量关键的撤单与补单过程压扁,最后只剩一幅失真的静态图。
从L1到多层级:只看买一卖一还不够
报价不平衡量是交易系统里最容易上手的一类指标。它通常定义为:
\[
\rho_t=\frac{V_t^b-V_t^a}{V_t^b+V_t^a}
\]
其中,\(V_t^b\) 和 \(V_t^a\) 分别代表最佳买价和最佳卖价上的挂单量。这个指标的取值范围在 \([-1,1]\) 之间。
当 \(\rho_t\) 接近 \(1\),说明买一挂单量明显高于卖一;当它接近 \(-1\),说明卖一挂单量明显高于买一;接近零,则代表最佳报价两侧的可见深度比较接近。
它很直观,但也很容易被滥用。
买一挂得很厚,不代表买方真的强。可能是买方队列排着大量等待成交的被动订单,也可能是报价即将撤走。卖一很薄,也不一定意味着价格马上上冲,因为更高一档可能堆着密集的卖单,卖一被吃掉后,价格仍会被下一层流动性挡住。
这就是多层级订单流不平衡,也就是多层级订单流不平衡指标的价值所在。
多层级订单簿的三个变化
第一,价格冲击并不只发生在最佳报价。
当主动买单吃掉卖一,新的卖一在更高价位出现,价格随之向上推进一档。此时,二档、三档甚至更深层的卖方挂单,决定了这次冲击能不能继续扩散。如果只统计卖一,模型会把"卖一暂时变薄"和"整个卖方曲线变薄"混为一谈。
第二,深度变化具有不同的敏感度。
距离中间价一档的订单,对短期成交影响更直接;远离中间价的订单,可能在很长时间内都不会触发。但深层订单并非毫无价值,它们能描述流动性的整体倾斜、潜在支撑和压力分布。
第三,不同层级之间存在相关性。
当卖方从一档到五档同步撤单,单独观察某一档可能只得到弱信号,但组合起来,能看出整个卖方流动性正在后撤。反过来,如果卖一撤单而二档、三档迅速补厚,盘口只是完成了一次局部重排,并未形成真正的供给真空。
Cont团队在2023年进一步提出多层级订单流不平衡的扩展模型,引入标准化与主成分分析,对多层级盘口中的共同变化提取主要成分。相关实证中,第一主成分对多层级波动信息的解释度最高可达85%以上。
这项结果的实际含义很明确:多个盘口层级并不是互相独立的噪声。它们往往受到同一类流动性冲击影响,存在共同运动。你不需要把十档盘口简单相加,而是应该识别其中最主要的结构变化。
多层级指标怎么落地
一个可执行的处理流程,可以分成几步:
1. 按价格层级记录订单事件。
不要只保存总挂单量,至少要区分买一至买五、卖一至卖五,或者根据具体市场的深度进行调整。
2. 对不同层级做标准化。
不同品种、不同交易时段的盘口深度差异很大。直接使用原始数量,会让高流动性品种天然压过低流动性品种,也会让开盘和午盘数据无法直接比较。
3. 分别计算各层级的订单流变化。
每一档的挂单增加、撤单、成交消耗,都要按事件方向编码,而不是只对当前数量做差分。
4. 识别层级之间的共同变化。
可以使用主成分分析压缩维度,也可以根据研究目标构建加权和。权重不是越复杂越好,关键是能否在样本外保持稳定。
5. 将盘口冲击与成交成本绑定。
指标方向正确,不代表策略能够赚钱。如果信号出现后,价差已经扩大,执行时又承受严重滑点,纸面上的预测优势会被手续费和冲击成本直接吃掉。
多层级模型不是把L1模型加长五倍那么简单。它改变的是你对流动性的理解:价格移动之前,盘口结构往往已经先动了;价格移动之后,深层队列又决定冲击能否延续。
真正的压力,不是某一档挂了多少单,而是价格继续前进时,前面还有多少队列愿意接火。
FIFO与Pro-rata:排在前面,才有资格谈成交
订单流模型解决的是"谁在施加冲击",队列模型解决的是"你的订单什么时候能成交"。
这两个问题不能混为一谈。
在连续交易市场中,大量市场采用时间优先,也就是FIFO规则。相同价格下,先提交的订单排在前面,后提交的订单排在后面。你的订单即使价格正确,也不代表会优先成交。前面排着的量没有被吃完,你就只能继续等待。
部分衍生品市场采用按规模比例分配,也就是Pro-rata规则。在同一价格层级上,成交量按照参与订单的规模比例分配。大订单在这种规则下拥有更强的分配权,但这并不意味着无限放大订单就是正确策略,因为资金占用、撤单风险和成交不确定性会同步上升。
两种规则的交易含义完全不同:
| 对比维度 | 时间优先(FIFO) | 按比例分配(Pro-rata) |
|---|---|---|
| 核心优先级 | 先到先得,提交时间决定队列位置 | 同价位订单按规模比例分配成交 |
| 大额订单优势 | 大小本身不改变时间顺序 | 订单规模越大,分配份额通常越高 |
| 主要风险 | 排在队尾,等待期间价格先跑掉 | 为争取成交而挂大单,承担更高撤单与库存风险 |
| 队列估算重点 | 前方订单量、撤单速度、主动吃单量 | 总队列规模、成交分配比例、订单规模 |
| 常见策略倾向 | 尽早排队,减少无效撤单 | 调整挂单规模,争取更高分配权 |
| 回测难点 | 需要估算自己前方还有多少订单 | 需要准确模拟同价位的比例分配过程 |
FIFO下,队列位置就是隐形仓位
假设卖一价格为100,卖一总挂单量为500手。你在100的位置挂入10手,前面已有400手排在你的订单之前。
此时市场出现一笔100手的市价买单。最理想化的判断是这100手从队列最前方被消耗,前方剩余300手,你的订单仍未轮到。可如果前方订单在这段时间里撤掉了330手,实际排在你之前的对手单只剩70手,那么同一笔100手的市价买单在吃完这70手之后,还剩30手余量,会继续推进触及你的10手订单。
因此,订单成交概率并不只由主动成交量决定,还取决于:
- 你提交订单时前方有多少挂单;
- 前方订单撤单的速度;
- 同价位是否有订单修改后重新排队;
- 市价单和可成交限价单的到达频率;
- 价格是否先跳到其他档位;
- 交易所对改单、撤单和部分成交的具体处理方式。
如果回测系统假设"价格触及挂单价就成交",那不是乐观,而是虚构。真实交易中,价格触及某个价位,只能说明这个价位发生了交易或报价变化,不代表你的队列已经轮到。
Pro-rata下,规模改变分配结果
在Pro-rata规则下,同一价格上有多个订单。假设某一时刻总挂单量为1000手,其中你的订单为100手,市场实际可分配成交量为200手。忽略最小分配单位和交易所特殊规则,理论上你的分配量可能与订单规模占比相关。
但这里同样存在陷阱。
第一,规则通常不是简单的"按比例乘一下"。部分市场会设置最小分配、优先分配、数量取整或其他细则。你必须以具体交易所和合约的撮合规则为准。
第二,挂大单会带来库存风险。如果你为了获得更高成交份额,主动扩大订单规模,结果可能在行情快速反转时被动接满仓位。你以为自己在争取成交,实际上是在给波动率提供弹药。
第三,模型必须模拟订单到达和撤单。没有到达过程与撤单过程,Pro-rata只是一道静态算术题,无法反映真实盘口。
队列耗尽:价格突破之前,盘口先被掏空
短期价格冲击常常不是突然发生,而是某一侧队列逐步接近耗尽。
以卖方为例,卖一挂单量持续下降,可能来自三种不同来源:
1. 市价买单不断吃掉卖一;
2. 卖方主动撤销挂单,流动性向后撤;
3. 卖一成交后,新卖单补回,价格暂时保持不动。
这三种状态在价格图上可能都表现为"价格还没动"。但它们的未来路径完全不同。
第一种是主动买方在消耗卖方队列。第二种是卖方撤退,市场上方的可见阻力变薄。第三种则是补单能力尚在,卖方仍然能够承接冲击。
如果你只看最新的卖一数量,无法区分这三种状态。必须将队列变化拆成到达、取消和成交事件,再观察它们的持续时间、聚集程度以及相互触发关系。
在数学建模中,队列深度与耗尽时间常通过连续时间马尔可夫链进行描述。状态可以理解为当前各个价格层级的订单数量,状态之间的转换由挂单到达、撤单和成交事件驱动。
例如,一个简化的单边队列可以写成:
\[
Q_{t+\Delta t}=Q_t+A_t-C_t-R_t
\]
其中:
- \(Q_t\) 是当前队列深度;
- \(A_t\) 是新挂单到达量;
- \(C_t\) 是主动成交消耗量;
- \(R_t\) 是撤单量。
这条式子看起来简单,却直接击中了回测里的关键漏洞。很多策略只建模 \(C_t\),把新增挂单和撤单当成无关噪声。结果就是系统认为队列会按照历史成交量自然耗尽,但真实市场可能在主动成交到来之前就已经撤空,也可能不断补单,让价格在同一价位反复停留。
马尔可夫链适合描述离散状态
如果把每一档订单数量离散化,可以将订单簿状态表示为一个有限或截断状态空间。每次挂单、撤单、成交,都会让系统从一个状态跳转到另一个状态。
这种模型的优势是结构清晰,适合研究:
- 队列耗尽概率;
- 价格向上或向下移动的概率;
- 不同深度状态下的等待时间;
- 买卖双方流动性变化对中间价的影响。
2010年,Cont、Stoikov与Talreja提出限价订单簿动态随机马尔可夫模型。2013年,Cont与De Larrard进一步研究了马尔可夫限价订单市场中的价格动态。
但马尔可夫模型有一个强假设:未来状态主要由当前状态决定。现实订单流并不总是这么干净。一次大额主动成交可能引发撤单,撤单又可能触发更多市价单,随后做市商重新报价。这种事件之间存在明显的连锁反应。
这时,单纯依赖当前状态的模型就会被市场的"记忆"击穿。
Hawkes点过程描述订单流的自激和互激
Hawkes点过程专门用来处理事件之间的自激与互激。
所谓自激,是一笔事件发生后,未来一段时间内同类事件出现的强度上升。例如,一笔主动买单成交后,短时间内继续出现主动买单,形成连续扫单。
所谓互激,是一类事件提高另一类事件的发生强度。例如,卖一被主动买单击穿后,卖方撤单、重新报价或在更高价位挂单的频率发生变化。
Hawkes模型可以把订单到达强度写成类似形式:
\[
\lambda_i(t)=\mu_i+\sum_j\int_0^t\phi_{ij}(t-s)\,dN_j(s)
\]
其中,\(\lambda_i(t)\) 是第 \(i\) 类事件在时刻 \(t\) 的条件强度,\(\mu_i\) 是基础到达强度,\(N_j(s)\) 记录第 \(j\) 类事件,\(\phi_{ij}\) 描述历史事件对当前事件的激发作用。
在实际盘口中,可以把事件分成买方挂单、卖方挂单、买方撤单、卖方撤单、主动买入、主动卖出等类别,然后估计它们之间的激发关系。
这类模型适合回答一些简单指标回答不了的问题:
- 主动买单出现后,后续主动买单会不会集中到达;
- 卖一撤单是否会引发更多卖方撤单;
- 某一方向的冲击持续多久;
- 订单流是短暂脉冲,还是正在形成连续攻击;
- 一次价格跳动之后,盘口恢复还是继续扩散。
你不需要为了写策略而把所有模型都堆上去。模型越复杂,数据要求越苛刻,参数越容易在历史样本里"拟合得漂亮"。真正的战场在样本外。一个简单但能稳定处理时间戳、撮合规则和延迟的模型,往往比一套漂亮的高阶模型更能活过实盘。
从报价不平衡到可交易信号
报价不平衡量的范围是 \([-1,1]\),这让它很适合做标准化处理。不同品种的挂单数量级不同,直接比较买卖深度没有意义;将其压缩到固定区间后,至少能在同一品种的不同时间段之间建立可比关系。
但别急着把 \(\rho_t\) 大于某个阈值就当成开仓信号。盘口指标的可交易性,至少要经过四层过滤。
第一层:价差是否允许你进场
买卖价差以最小变动单位,也就是最小跳动点来表达。若价差只有一个最小跳动单位,做市或短线抢占队列的空间与价差较宽时完全不同。
当价差扩大时,报价不平衡可能看起来非常极端,但你的成交成本也在同步放大。你在买方挂单,可能等不到成交;你用市价单追进去,又会立刻承担价差和滑点。
一个盘口信号即使方向判断正确,只要平均获得的价格优势小于手续费、价差和冲击成本,最终仍然会亏损。
第二层:不平衡是静态结果还是动态变化
静态报价不平衡只回答"现在两侧挂了多少"。订单流不平衡则回答"刚才发生了什么"。
举例来说:
- 买一挂单量高,且买方持续补单,卖方不断撤单;
- 买一挂单量高,但买方持续撤单,卖方主动成交增强;
- 买卖数量接近,但卖一连续被吃,深层卖方也同步变薄;
- 买卖数量接近,双方只是频繁挂单,没有持续方向。
这四种状态不能使用同一个阈值处理。策略需要把静态倾斜与动态变化结合,否则很容易在盘口最拥挤的时候追进去,正好接最后一棒。
第三层:时间窗口要和策略持仓周期匹配
订单流指标常见的时间尺度包括逐笔、毫秒级、秒级和分钟级。持仓周期不同,指标的统计窗口也必须不同。
如果你做的是极短线,几秒前的订单流冲击可能仍有参考价值;如果你的策略持仓数小时,那么几秒级的盘口倾斜很可能早已被新的宏观消息、跨市场套利和大额订单冲刷。
不要把高频信号装进低频策略,也不要用一分钟聚合数据假装自己理解了盘口微观结构。时间尺度错了,模型不是失效,而是从一开始就没有在研究你真正交易的东西。
第四层:跨市场和隐藏流动性
L1和多层盘口记录的是可见订单。冰山单、隐藏单以及其他不可见流动性,会让队列位置估算产生偏差。
这也是研究和实盘必须保持克制的地方。单凭L1订单流不平衡,不能宣称百分之百预测下一跳中间价。可见盘口只是市场的一部分,隐藏订单和微观结构噪声足以让看似坚固的信号突然失灵。
特别是在极端波动行情中,历史上有效的微观结构因子会迅速衰减。盘口被扫空、报价连续跳档、交易所延迟和风控限制同时出现时,回测里那点精细优势,可能还没来得及执行就被滑点吞掉。
一个完整的订单簿策略,应该怎样回放
做盘口策略,最忌讳只看收益曲线。
你需要回到每一笔订单、每一次盘口更新和每一个撮合结果,重建当时你究竟站在队列什么位置。下面这套回放顺序,适合用来检查一个限价订单簿模型有没有把关键环节漏掉。
1. 先确认数据是逐笔更新还是定时快照。
如果数据只有每秒一次的盘口快照,就不要声称自己准确模拟了毫秒级队列。快照可以用于中低频研究,但无法恢复被压扁的撤单和补单顺序。
2. 区分挂单、撤单和主动成交。
订单数量减少,不一定来自主动成交;订单数量增加,也不一定代表真实买方意愿增强。事件类型错判,OFI方向就会被直接写反。
3. 重建每个价位的队列。
在FIFO市场,必须估计你的订单前方有多少量。不能因为历史价格触及你的挂单价,就把整笔订单标记为成交。
4. 模拟部分成交和剩余订单。
一笔主动成交可能只吃掉你订单的一部分。剩余数量继续留在队列中,之后还要面对撤单、价格跳动和订单失效。
5. 加入订单延迟。
信号生成、订单发送、交易所接收、撮合确认,都需要时间。即便每一步延迟很短,快速行情中也足以让你的订单从队首变成队尾。
6. 按真实撮合规则处理成交。
FIFO与Pro-rata不能混用。不同市场对改单、撤单、最小成交单位、优先分配和价格保护的处理方式都可能不同。
7. 把费用和滑点放在策略内部。
不要先看毛收益,再在最后扣除交易成本。费用、价差、冲击和拒单应该在每一笔订单进入回放时就被计算。
8. 专门测试流动性枯竭。
平静时段的盘口模型很容易看起来稳定。真正能击穿策略的是开盘、收盘、消息发布和极端波动时段。你要观察模型在队列快速耗尽、价差扩大和连续撤单时是否仍然能执行。
这不是为了把回测做得复杂,而是为了防止你用虚假的成交填满一条漂亮曲线。
OFI的线性关系,为什么不能直接变成买卖按钮
订单流不平衡与短期价格变化存在显著线性关系,这个结论有价值,但它不等于"OFI为正就买,OFI为负就卖"。
首先,\(\beta\)不是固定常数。不同品种、不同交易时段、不同波动状态下,市场对同样订单流冲击的价格响应不同。盘口很深时,同样规模的主动成交可能只造成轻微漂移;盘口很薄时,少量订单就可能击穿多个价位。
其次,OFI的单位和标准化方式会影响结果。未经处理的订单事件数量,无法直接跨品种比较。交易活跃度、合约乘数、最小跳动点和盘口深度都会改变系数的含义。
再次,线性关系描述的是统计响应,不是确定性路径。公式里的 \(\varepsilon_t\)不是装饰,它代表模型无法解释的部分。你不能因为历史样本里关系显著,就抹掉残差,更不能把残差当成不存在。
最后,价格冲击有延迟和衰减。一次订单流脉冲可能很快被吸收,也可能引发后续事件,形成连续趋势。到底是哪一种,取决于队列是否补回、另一侧是否撤退以及跨市场订单是否同步变化。
所以,OFI更适合成为一个状态变量,而不是单独的交易按钮。它可以进入:
- 短期方向预测模型;
- 做市报价调整模型;
- 订单执行时机模型;
- 队列等待时间估计;
- 成交概率与撤单决策;
- 多因子短线策略;
- 市场冲击成本估算。
当它和价差、盘口深度、订单到达强度、波动率以及持仓限制结合起来,才可能成为一套有执行意义的系统。
盘口研究最容易踩的五个坑
把挂单量当成真实意愿
挂单可以撤。盘口深度是可见流动性,不是不可撤销的承诺。尤其在快速行情中,撤单速度可能比成交速度更快。你看见的厚墙,可能只是下一次价格跳动前的残影。
把价格触及当成自己的成交
这是限价单回测最严重的错误之一。价格到过你的挂单价,只能说明市场在那个价格发生了报价或成交变化。你的订单是否成交,要看队列前方数量和实际消耗。
把OFI和成交量不平衡混为一谈
成交量不平衡只描述主动买卖成交的差异,订单流不平衡还包含挂单和撤单事件。两者都能用来研究短期方向,但统计对象不同,不能互相替代。
把FIFO与Pro-rata混成一个排队模型
FIFO关注时间位置,Pro-rata关注规模分配。你如果用FIFO回放一个按比例分配的市场,成交会被严重低估或高估;反过来也一样。撮合规则一旦错了,后面的精密数学全部变成废铁。
把样本内拟合当成实盘优势
多层级盘口提供了大量变量。你可以轻易找到一个参数组合,让历史收益曲线非常漂亮。但盘口噪声也非常密集,稍微扩大参数空间,就会产生严重的数据挖掘偏差。
真正需要检验的不是某个回测窗口里赚了多少,而是换交易日、换波动状态、换合约、换执行延迟之后,信号是否仍然保留基本结构。
从研究到执行:先问队列,再问方向
你最终要解决的,不是"价格下一跳涨还是跌"这么简单的问题。
如果你的策略使用限价单,那么至少还要回答:
- 我现在挂进去,前面排着多少订单;
- 这段时间内前方队列会撤掉多少;
- 对手方主动成交是否足以吃到我的位置;
- 如果成交只完成一部分,剩余订单应该继续留着还是撤掉;
- 盘口不平衡变化后,信号还能维持多久;
- 价差和滑点是否已经吞掉预期收益;
- 如果判断错误,扫损出口是否足够快。
如果你的策略使用市价单,问题则变成:
- 当前盘口深度能否承受我的订单;
- 会穿过几档报价;
- 预估冲击成本是多少;
- 连续成交是否会引发对手方撤单;
- 实际成交价和信号计算价之间相差多少。
这就是订单簿研究和普通技术指标研究的分水岭。K线可以告诉你价格已经走了哪里,盘口模型则试图解释价格为什么在这一刻被推走,以及你提交的订单有没有资格参与这次移动。
我不反对指标,也不反对机器学习。机器学习可以从多层级盘口、订单事件和时间序列中提取复杂关系,统计套利可以把微观结构信号与跨品种价差结合,趋势策略也可以利用订单流确认突破是否有真实流动性支持。
但算法不会替你修复错误的数据。模型不会自动识别错误的撮合规则。回测也不会替你承担真实市场里的滑点、拒单、延迟和队列落后。
订单流不平衡的价值,在于它把"盘口感觉"变成了可以检验的事件统计;排队机制的价值,在于它逼你承认,正确报价不等于正确成交。
结语:别让盘口的厚度骗走你的本金
限价订单簿的微观结构,核心并不神秘:挂单在增加,撤单在消失,市价单在消耗,队列在移动,价格在流动性被击穿后重新定价。
订单流不平衡提供了观察短期价格冲击的框架;多层级订单流不平衡揭示了不同价位之间的共同变化;FIFO与Pro-rata解释了订单如何获得成交机会;马尔可夫链和Hawkes点过程,则把队列耗尽、订单到达和事件连锁反应放进数学模型。
但别把这些工具包装成预测神谕。L1盘口看不见隐藏单,静态深度无法还原撤单顺序,正向OFI也不能保证下一跳中间价必然上涨。你真正能做的,是把数据、撮合规则、队列位置、执行延迟和交易成本一层层钉死,再决定信号是否值得下注。
市场不会因为你的公式漂亮就给你成交。
队列排在后面,信号再准也只能看着别人吃货;滑点没有算进回测,收益再高也可能在实盘里被一口吞掉。盯住盘口,更要盯住自己的仓位和撤退路线——否则下一次被击穿的,不是卖一,也不是买一,而是你的账户。
Related reading: 期货主力合约的筛选机制:持仓量与成交量背后的流动性逻辑 and 量化交易服务器的部署抉择:物理托管与云服务器的延迟与成本博弈.
