4. 订单簿不平衡:订单簿不平衡指标(LOB Imbalance)、价格压力信号
各位同学,今天我们来聊聊订单簿不平衡。这个概念,说白了就是看买卖双方谁更「着急」。我刚开始做高频策略的时候,总觉得价格涨跌就是看大单往哪边砸。后来发现,真正决定短期走势的,往往是订单簿两侧的「力量对比」——也就是我们常说的 LOB Imbalance。
4.1 什么是订单簿不平衡?
订单簿不平衡,衡量的是买单和卖单在数量上的差异。你想想看,如果买一档挂了1000手,卖一档只有100手,那价格是不是更容易往上走?反过来也一样。
我习惯用这个公式来计算:
Imbalance = (BidVolume - AskVolume) / (BidVolume + AskVolume)
结果范围在 -1 到 1 之间。正值表示买方强势,负值表示卖方占优。嗯,这里要注意:这个指标只反映当前时刻的静态不平衡,不包含未来订单的流入信息。
核心要点:订单簿不平衡不是预测指标,而是当前市场情绪的「快照」。它告诉我们,在当下这个时间点,哪一方更愿意「堆单」。
4.2 价格压力信号:从不平衡到价格变动
光看不平衡还不够,我们得把它转化成价格压力信号。我在项目中遇到过这样的情况:不平衡值很高,但价格就是不涨。为什么?因为大单可能是「挂单」而不是「吃单」。
所以,我通常会把不平衡和订单簿的「深度」结合起来看。这里有个实用的信号构造方法:
def price_pressure_signal(lob_data, levels=5):
"""
计算价格压力信号
lob_data: 包含各档位买卖量的字典
levels: 考虑的前几档深度
"""
bid_vol = sum([lob_data[f'bid_{i}_vol'] for i in range(1, levels+1)])
ask_vol = sum([lob_data[f'ask_{i}_vol'] for i in range(1, levels+1)])
imbalance = (bid_vol - ask_vol) / (bid_vol + ask_vol + 1e-8)
# 加权处理:越近的档位权重越大
weighted_bid = sum([lob_data[f'bid_{i}_vol'] * (levels - i + 1) for i in range(1, levels+1)])
weighted_ask = sum([lob_data[f'ask_{i}_vol'] * (levels - i + 1) for i in range(1, levels+1)])
pressure = (weighted_bid - weighted_ask) / (weighted_bid + weighted_ask + 1e-8)
return imbalance, pressure
我的经验:用加权方式计算压力信号,比简单求和更敏感。我曾经在回测中发现,不加权的信号经常滞后1-2个tick,而加权信号能提前捕捉到价格反转的苗头。
4.3 不同时间尺度下的不平衡特征
订单簿不平衡在不同时间尺度下表现完全不同。我整理了一个表格,方便大家对比:
| 时间尺度 | 不平衡特征 | 信号可靠性 | 常见应用 |
|---|---|---|---|
| Tick级(毫秒) | 剧烈波动,噪声大 | 低 | 做市商对冲 |
| 秒级 | 趋势性开始显现 | 中 | 高频反转策略 |
| 分钟级 | 稳定,与成交量配合 | 高 | 日内趋势跟踪 |
| 小时级 | 与订单流不平衡趋同 | 较高 | 持仓方向判断 |
说白了,你不可能用毫秒级的不平衡信号去做分钟级别的交易决策。我见过有人把tick级的不平衡直接当趋势信号用,结果被来回打脸。嗯,这里要记住:信号的时间尺度必须和你的交易频率匹配。
4.4 实战中的避坑指南
我曾经踩过一个坑:只盯着买一卖一的不平衡看。结果发现,有些大资金会故意在买一挂大单,然后在买二偷偷撤单。表面上看买方很强,实际上是个陷阱。
所以我现在做不平衡分析时,会额外检查以下几点:
- 订单撤销率:如果买单撤销率突然升高,说明买方在虚张声势
- 吃单比例:挂单不平衡 vs 吃单不平衡,两者背离时要警惕
- 价差变化:不平衡很大但价差在扩大,往往是流动性枯竭的前兆
警告:不要单独使用订单簿不平衡作为交易信号。它必须和成交量、波动率、订单到达率等指标配合使用。我见过最惨的案例是有人只靠不平衡做高频,结果在流动性骤降时爆仓。
4.5 知识体系框架
为了让大家更直观地理解本章内容,我画了一张结构图:
4.6 一个完整的信号示例
最后,我给大家展示一个我在实盘中用过的信号组合。它把不平衡和价格压力结合起来,效果还不错:
def combined_signal(lob_data, trade_data):
"""
综合信号:不平衡 + 价格压力 + 成交确认
"""
imbalance, pressure = price_pressure_signal(lob_data)
# 最近10笔成交的买卖方向
recent_trades = trade_data[-10:]
buy_trades = sum(1 for t in recent_trades if t['side'] == 'buy')
trade_imbalance = (buy_trades - (10 - buy_trades)) / 10
# 信号合成
signal = 0.4 * imbalance + 0.4 * pressure + 0.2 * trade_imbalance
# 阈值过滤
if abs(signal) < 0.3:
return 0 # 信号太弱,不交易
return 1 if signal > 0 else -1
小技巧:信号合成时,权重可以根据市场状态动态调整。比如在趋势市中,加大pressure的权重;在震荡市中,加大trade_imbalance的权重。我一般用滚动窗口的夏普比来动态调权。
好了,关于订单簿不平衡和价格压力信号,今天就聊到这里。记住,这个指标不是万能的,但它绝对是理解市场微观结构的一把好钥匙。下次当你看到盘口挂单时,不妨算算不平衡值,说不定能发现一些有趣的东西。