4. 订单簿不平衡:订单簿不平衡指标、订单流毒性、逆向选择

订单簿不平衡,说白了就是买卖双方的力量对比。我刚开始做高频交易那会儿,总觉得看价格就够了。后来被市场狠狠教育了几次,才发现订单簿的微观结构里藏着大量信息。今天咱们就聊聊这个核心话题。

4.1 订单簿不平衡指标

订单簿不平衡(Order Book Imbalance, OBI)衡量的是买方和卖方挂单量的差异。我个人习惯用这个指标来判断短期价格方向。

最简单的计算公式:

OBI = (BidVolume - AskVolume) / (BidVolume + AskVolume)

其中 BidVolume 是买一到买五的总量,AskVolume 是卖一到卖五的总量。OBI 的取值范围在 -1 到 1 之间。正值表示买方力量强,负值表示卖方力量强。

我在项目中遇到过一个问题:直接用原始挂单量算 OBI,效果并不好。为什么?因为有些大单是虚挂的,俗称「冰山订单」。后来我改用加权 OBI:

def weighted_obi(bids, asks, levels=5):
    """
    加权订单簿不平衡指标
    bids: [(price, volume), ...] 买盘
    asks: [(price, volume), ...] 卖盘
    """
    bid_weight = 0.0
    ask_weight = 0.0
    
    for i in range(min(levels, len(bids))):
        price, vol = bids[i]
        # 越靠近最优价,权重越大
        weight = 1.0 / (i + 1)
        bid_weight += vol * weight
    
    for i in range(min(levels, len(asks))):
        price, vol = asks[i]
        weight = 1.0 / (i + 1)
        ask_weight += vol * weight
    
    if bid_weight + ask_weight == 0:
        return 0.0
    
    return (bid_weight - ask_weight) / (bid_weight + ask_weight)

小技巧:我通常用前3档的加权 OBI,效果比用5档好。因为越远的档位噪音越大,而且容易被操纵。

4.2 订单流毒性

订单流毒性(Order Flow Toxicity)这个概念,我第一次接触是在读 Easley、López de Prado 和 O'Hara 的论文时。它描述的是:当订单流中包含大量知情交易者的信息时,做市商就会面临逆向选择风险。

衡量订单流毒性的经典指标是 VPIN(Volume-synchronized Probability of Informed Trading)。

VPIN 的核心思想:把交易量分成若干桶,每个桶里统计买卖方向。如果某个桶里买卖方向极度不平衡,说明可能有知情交易者在行动。

def compute_vpin(trades, bucket_volume=10000):
    """
    计算 VPIN 指标
    trades: [(price, volume, side), ...] side: 'buy' or 'sell'
    """
    buy_volume = 0
    sell_volume = 0
    vpin_values = []
    
    for price, vol, side in trades:
        if side == 'buy':
            buy_volume += vol
        else:
            sell_volume += vol
        
        # 当总交易量达到一个桶的容量
        if buy_volume + sell_volume >= bucket_volume:
            imbalance = abs(buy_volume - sell_volume) / (buy_volume + sell_volume)
            vpin_values.append(imbalance)
            buy_volume = 0
            sell_volume = 0
    
    return np.mean(vpin_values) if vpin_values else 0.0

避坑指南:我曾经在回测中直接用 VPIN 做交易信号,结果亏得很惨。后来发现 VPIN 更适合做风控指标,而不是入场信号。当 VPIN 过高时,最好减少仓位,而不是反向开仓。

4.3 逆向选择

逆向选择(Adverse Selection)是微观结构理论的核心概念。简单说:当你作为做市商或流动性提供者,你面对的对手方可能知道你不知道的信息。

举个例子:假设你在某只股票上挂了买单。突然有大单砸下来,你接住了。但随后价格继续下跌——你接到的不是「便宜货」,而是「烫手山芋」。这就是逆向选择。

我常用的逆向选择指标是「价格冲击系数」:

def price_impact_coefficient(trades, mid_prices, lookback=10):
    """
    计算价格冲击系数
    衡量订单流对价格的持续影响
    """
    impacts = []
    
    for i in range(lookback, len(trades)):
        trade = trades[i]
        mid_before = mid_prices[i - lookback]
        mid_after = mid_prices[i]
        
        # 计算价格变化
        price_change = (mid_after - mid_before) / mid_before
        
        # 计算净订单流
        if trade['side'] == 'buy':
            net_flow = trade['volume']
        else:
            net_flow = -trade['volume']
        
        if net_flow != 0:
            impact = price_change / net_flow
            impacts.append(impact)
    
    return np.mean(impacts) if impacts else 0.0

价格冲击系数越大,说明逆向选择越严重。你想想看,如果一笔大单成交后价格持续朝不利方向移动,那说明对手方很可能掌握了更多信息。

4.4 三个指标的综合应用

在实际交易中,我很少单独使用某个指标。通常我会把 OBI、VPIN 和价格冲击系数结合起来看。

实战框架

  • OBI > 0.3 且 VPIN 较低 → 买方主导,可以顺势做多
  • OBI < -0.3 且 VPIN 较低 → 卖方主导,可以顺势做空
  • VPIN > 0.6 → 市场存在信息不对称,减少交易频率
  • 价格冲击系数突然升高 → 可能有知情交易者在行动,谨慎接单

我记得有一次做期货夜盘,VPIN 突然从 0.3 飙到 0.7,OBI 却显示买方很强。按照常规思路应该做多,但 VPIN 的异常让我选择了观望。结果半小时后,一个大户砸盘,价格暴跌了 2%。嗯,VPIN 救了我一命。

4.5 核心逻辑图

下面这张图展示了订单簿不平衡、订单流毒性和逆向选择之间的关系:

订单簿不平衡 OBI 指标 加权/原始挂单量 买卖力量对比 订单流毒性 VPIN 指标 信息不对称程度 知情交易概率 逆向选择 价格冲击系数 信息劣势风险 流动性成本 影响 导致 综合决策框架 OBI 判断方向 + VPIN 评估风险 + 价格冲击系数确认 三者结合,降低逆向选择风险

这三个指标构成了一个完整的分析框架。OBI 告诉你市场方向,VPIN 告诉你风险程度,价格冲击系数告诉你执行成本。三者缺一不可。

我的建议:刚开始学的时候,先盯住 OBI 一个指标就够了。等你能熟练判断市场方向了,再加入 VPIN 做风控。最后再考虑价格冲击系数。别想一口吃成胖子。

好了,关于订单簿不平衡的内容就聊到这儿。记住一点:微观结构指标不是圣杯,它们只是帮你更好地理解市场。真正赚钱的,是你对市场的理解和纪律的执行。


公众号:蓝海数据掘金营,微信deep3321