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年做期货,看到连续大单买入,以为要突破,直接追进去。结果那是主力在诱多,我成了接盘侠。后来我才明白:订单流毒性高的时候,流动性是陷阱,不是机会。
订单流毒性的核心逻辑:
- 信息不对称:有人知道你不知道的信息
- 订单流预测:毒性高的订单流,能预测短期价格反转
- 流动性幻觉:看起来流动性好,实际上一进去就消失
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 知识体系总览
下面这张图,把订单流分析的核心逻辑串起来了:
12.5 实战中的几点体会
最后,分享几个我在实战中的体会:
- VPIN不是万能的:它擅长捕捉微观结构的变化,但宏观趋势还得看基本面。别指望一个指标解决所有问题。
- 参数要调:成交量桶的大小、滚动窗口的长度,这些参数直接影响指标效果。我建议用历史数据回测,找到最优参数。
- 结合其他指标:VPIN配合订单流不平衡一起看,效果更好。比如VPIN高但不平衡为正,说明买方在硬撑,风险很大。
一句话总结:
订单流分析,就是透过价格看本质。VPIN帮你识别市场里的「毒」,躲开那些看似美好实则危险的交易机会。
好了,这一章的内容就到这里。记住:市场里永远有人比你更聪明,订单流分析就是让你离真相更近一步的工具。