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 做风控。最后再考虑价格冲击系数。别想一口吃成胖子。
好了,关于订单簿不平衡的内容就聊到这儿。记住一点:微观结构指标不是圣杯,它们只是帮你更好地理解市场。真正赚钱的,是你对市场的理解和纪律的执行。
公众号:蓝海数据掘金营,微信deep3321