11. 订单不平衡:买单与卖单的失衡

做交易这么多年,我越来越觉得——市场说白了就是一场拔河比赛。一边是买方,一边是卖方。哪边力气大,价格就往哪边倒。

但问题来了:你怎么知道哪边力气大?

看成交量?不够。看K线?太滞后。真正能实时反映力量对比的,是订单流里的订单不平衡

11.1 什么是订单不平衡

订单不平衡,英文叫Order Imbalance。简单说,就是在某个时间窗口内,主动买单和主动卖单的数量不相等。

我举个例子。假设在1分钟内,市场上有1000手主动买单,但只有600手主动卖单。那这400手的差值,就是订单不平衡。

你想想看,多出来的400手买单,它们想买却没人卖。怎么办?只能往上加价。价格自然就被推高了。

核心公式:

订单不平衡 = 主动买单量 - 主动卖单量

正值 = 买方强势,价格倾向于上涨

负值 = 卖方强势,价格倾向于下跌

我在项目中遇到过好几次这样的情况:明明K线看起来是横盘,但订单不平衡指数已经连续几分钟为正。这时候我就知道,有人在偷偷吸筹。等K线突破的时候,黄花菜都凉了。

11.2 订单不平衡指数

光看绝对值还不够。1000手的不平衡,放在成交量1万手的市场里,和放在成交量10万手的市场里,意义完全不同。

所以我们需要一个标准化的指标——订单不平衡指数。

指标名称 计算公式 含义
绝对不平衡 主动买单 - 主动卖单 净方向力量的大小
相对不平衡 (主动买单 - 主动卖单) / (主动买单 + 主动卖单) 力量对比的百分比
加权不平衡 Σ(每笔买单量 × 价格) - Σ(每笔卖单量 × 价格) 考虑资金量的真实冲击

我个人习惯用相对不平衡。为什么?因为它把量纲去掉了。不管你是做股票、期货还是币圈,这个值都在-1到1之间,一眼就能看出强弱。

比如相对不平衡是0.6,说明买方力量占了60%。这时候价格大概率要往上走。

实战小技巧:

我一般把阈值设在±0.3。超过0.3算强势,低于-0.3算弱势。在0.3以内晃悠的,我选择观望。别什么信号都做,做多了容易亏。

11.3 失衡带来的价格冲击

订单不平衡为什么会推动价格?这里有个很直白的逻辑。

你想想看,每一笔成交,都是一次「主动方」和「被动方」的博弈。主动方为了成交,必须吃掉对手盘上的挂单。

当主动买单远多于主动卖单时,买单会一层一层吃掉卖盘上的挂单。卖一被吃掉,价格就跳到卖二。卖二被吃掉,价格就跳到卖三。这就是价格上行的微观机制。

反过来也一样。主动卖单多,价格就一层一层往下砸。

我记得有一次做股指期货的日内交易,看到订单不平衡指数突然从0.1飙到0.7。我当时心里咯噔一下——这不对劲。果然,不到30秒,价格直接拉了5个点。如果等K线确认,早就错过了。

注意:

订单不平衡不是万能的。它反映的是当前的供需关系,不代表未来。有时候大资金会故意制造不平衡来诱多或诱空。我曾经吃过这个亏,后来加了「成交量确认」这个条件,才把胜率提上来。

11.4 核心逻辑框架

下面这张图,是我自己梳理的订单不平衡分析框架。每次做策略之前,我都会过一遍这个流程。

订单不平衡分析框架 原始订单流数据 计算订单不平衡指数 判断:|指数| > 阈值? 观望 / 等待确认 执行交易信号

这个框架看着简单,但用起来很实在。数据进来,算指数,过阈值,做决策。每一步都不能省。

11.5 代码实现:计算订单不平衡指数

下面是我自己写的一个Python函数。嗯,代码不长,但核心逻辑都在里面了。

def calculate_order_imbalance(trades_df, window='1min'):
    """
    计算订单不平衡指数
    
    参数:
        trades_df: DataFrame,包含字段 ['time', 'side', 'volume', 'price']
        window: 时间窗口,默认1分钟
    
    返回:
        imbalance_df: DataFrame,包含时间戳和不平衡指数
    """
    # 区分主动买单和主动卖单
    buy_trades = trades_df[trades_df['side'] == 'buy'].copy()
    sell_trades = trades_df[trades_df['side'] == 'sell'].copy()
    
    # 按时间窗口重采样
    buy_volume = buy_trades.resample(window, on='time')['volume'].sum()
    sell_volume = sell_trades.resample(window, on='time')['volume'].sum()
    
    # 计算相对不平衡指数
    total_volume = buy_volume + sell_volume
    imbalance = (buy_volume - sell_volume) / total_volume
    
    # 处理除零情况
    imbalance[total_volume == 0] = 0
    
    return imbalance

避坑指南:

我曾经在计算时忘了处理除零情况,结果回测时出现一堆NaN。后来我加了个判断:如果总成交量为0,不平衡指数直接设为0。别小看这个细节,它能省你半天调试时间。

11.6 实战中的注意事项

说了这么多,最后给你几个实在的建议:

  • 别只看一个时间窗口。我一般同时看1分钟、5分钟和15分钟的不平衡指数。短周期抓入场点,长周期看趋势方向。
  • 结合价格位置。同样的不平衡指数,在支撑位和阻力位的意义完全不同。在支撑位出现正不平衡,那是强信号。在阻力位出现,可能是假突破。
  • 注意数据质量。有些交易所的订单流数据有延迟或缺失。我建议至少用两个数据源做交叉验证。

订单不平衡这个东西,说白了就是让你看到市场里「谁在用力」。用好了,你能比别人早一步看到方向。用不好,那就是噪音。

我个人觉得,这是订单流分析里最基础也最实用的工具之一。希望你能把它吃透。