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 知识体系框架

为了让大家更直观地理解本章内容,我画了一张结构图:

订单簿不平衡与价格压力信号知识体系 订单簿不平衡 (LOB Imbalance) 计算方法 简单不平衡: (Bid-Ask)/(Bid+Ask) 加权压力: 考虑深度与距离 不同时间尺度特征 Tick级: 噪声大, 适合做市 秒级: 趋势初现, 适合反转 分钟级: 稳定可靠, 适合趋势 实战避坑要点 检查订单撤销率 对比挂单与吃单不平衡 监控价差变化 价格压力信号 → 交易决策

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的权重。我一般用滚动窗口的夏普比来动态调权。

好了,关于订单簿不平衡和价格压力信号,今天就聊到这里。记住,这个指标不是万能的,但它绝对是理解市场微观结构的一把好钥匙。下次当你看到盘口挂单时,不妨算算不平衡值,说不定能发现一些有趣的东西。

专注资料整理