12. 订单流分析:订单流的不平衡、订单流毒性与VPIN指标

做量化交易这些年,我越来越觉得,价格只是表象,订单流才是真相。

你想想看,K线图上那些红红绿绿的柱子,背后是什么?是一笔又一笔真实的成交。每一笔交易,都有人在买,有人在卖。谁更着急?谁在主导?这些信息,都藏在订单流里。

今天我们就来拆解订单流分析的核心。我会重点讲三个东西:订单流不平衡、订单流毒性,以及那个大名鼎鼎的VPIN指标。

12.1 订单流不平衡:谁在主导市场?

先问个问题:市场为什么会涨?

说白了,就是买的人比卖的人更积极。买方主动吃单,价格自然往上走。反过来,卖方主动砸盘,价格就往下掉。

订单流不平衡,衡量的就是这个「谁更积极」的程度。

核心公式:

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

正值表示买方主导,负值表示卖方主导。

我在项目中遇到过这样的情况:某只股票价格没怎么动,但订单流不平衡持续为正。这说明什么?有人在偷偷吸筹。等价格真正启动时,已经晚了。

具体怎么算?看个例子:

# 计算订单流不平衡
def order_flow_imbalance(trades):
    """
    trades: 逐笔成交数据
    每笔包含:price, volume, side (B=主动买, S=主动卖)
    """
    buy_volume = sum(t['volume'] for t in trades if t['side'] == 'B')
    sell_volume = sum(t['volume'] for t in trades if t['side'] == 'S')
    
    imbalance = buy_volume - sell_volume
    return imbalance

嗯,这里要注意:主动买和主动卖怎么区分?看成交价和买卖盘口的关系。成交价在卖一价成交,就是主动买;在买一价成交,就是主动卖。这个逻辑不难,但数据清洗时容易出错。

12.2 订单流毒性:你以为的流动性,其实是陷阱

订单流毒性,这个概念我第一次听到时,觉得名字起得真好——它确实有毒。

什么叫毒性?简单说:你看到市场上有流动性,于是你进场交易。结果你一进去,价格就朝反方向跑。你成了别人的对手盘,被收割了。

我举个例子:

  • 你看到买盘很强,于是追涨买入
  • 结果你一买完,价格立刻掉头向下
  • 你被套住了

为什么会这样?因为那些看似强劲的买盘,其实是知情交易者(比如机构)在出货。他们利用订单流的假象,引诱散户接盘。

避坑指南:

我曾经吃过这个亏。2018年做期货,看到连续大单买入,以为要突破,直接追进去。结果那是主力在诱多,我成了接盘侠。后来我才明白:订单流毒性高的时候,流动性是陷阱,不是机会。

订单流毒性的核心逻辑:

  1. 信息不对称:有人知道你不知道的信息
  2. 订单流预测:毒性高的订单流,能预测短期价格反转
  3. 流动性幻觉:看起来流动性好,实际上一进去就消失

12.3 VPIN:量化订单流毒性的利器

VPIN,全称是Volume-synchronized Probability of Informed Trading。翻译过来就是「成交量同步的知情交易概率」。

这名字有点绕,我拆开讲:

  • 成交量同步:不是按时间切片,而是按成交量切片。每累积一定成交量,算一次指标
  • 知情交易概率:这笔成交量里,有多少是知情交易者干的

VPIN越高,说明订单流毒性越强,市场越危险。

12.3.1 VPIN的计算方法

计算VPIN,分三步走:

步骤 操作 说明
1 划分成交量桶 比如每10000股为一个桶
2 计算每个桶的订单流不平衡 主动买 - 主动卖
3 计算VPIN 不平衡的绝对值 / 总成交量

公式长这样:

VPIN = Σ|主动买入量 - 主动卖出量| / Σ总成交量

我习惯用滚动窗口来计算,比如取最近50个成交量桶。这样指标更平滑,不容易被噪音干扰。

12.3.2 代码实现

import pandas as pd
import numpy as np

def calculate_vpin(trades, bucket_volume=10000, window=50):
    """
    计算VPIN指标
    trades: DataFrame, 包含price, volume, side列
    bucket_volume: 每个成交量桶的大小
    window: 滚动窗口大小
    """
    # 按成交量分桶
    trades['cum_volume'] = trades['volume'].cumsum()
    trades['bucket'] = trades['cum_volume'] // bucket_volume
    
    # 计算每个桶的订单流不平衡
    bucket_data = trades.groupby('bucket').agg(
        buy_volume=('volume', lambda x: x[trades.loc[x.index, 'side'] == 'B'].sum()),
        sell_volume=('volume', lambda x: x[trades.loc[x.index, 'side'] == 'S'].sum()),
        total_volume=('volume', 'sum')
    )
    
    bucket_data['imbalance'] = abs(
        bucket_data['buy_volume'] - bucket_data['sell_volume']
    )
    
    # 计算VPIN
    bucket_data['vpin'] = (
        bucket_data['imbalance'].rolling(window).sum() / 
        bucket_data['total_volume'].rolling(window).sum()
    )
    
    return bucket_data['vpin']

实战技巧:

我建议VPIN阈值设在0.5左右。超过0.5,说明订单流毒性很高,这时候最好别进场。低于0.3,说明市场比较健康,可以正常交易。

当然,不同品种阈值不一样。股指期货和个股差别很大,需要自己调参。

12.4 知识体系总览

下面这张图,把订单流分析的核心逻辑串起来了:

订单流分析核心框架 逐笔成交数据 订单流不平衡 订单流毒性 VPIN指标 主动买 vs 主动卖 衡量市场主导力量 信息不对称程度 识别流动性陷阱 成交量分桶计算 量化知情交易概率 交易决策:进场/离场/风控

12.5 实战中的几点体会

最后,分享几个我在实战中的体会:

  • VPIN不是万能的:它擅长捕捉微观结构的变化,但宏观趋势还得看基本面。别指望一个指标解决所有问题。
  • 参数要调:成交量桶的大小、滚动窗口的长度,这些参数直接影响指标效果。我建议用历史数据回测,找到最优参数。
  • 结合其他指标:VPIN配合订单流不平衡一起看,效果更好。比如VPIN高但不平衡为正,说明买方在硬撑,风险很大。

一句话总结:

订单流分析,就是透过价格看本质。VPIN帮你识别市场里的「毒」,躲开那些看似美好实则危险的交易机会。

好了,这一章的内容就到这里。记住:市场里永远有人比你更聪明,订单流分析就是让你离真相更近一步的工具。