第三节:价差与深度——买卖价差、加权平均价、市场深度、深度不平衡度
好,咱们今天聊点实在的。订单簿里最核心的两个维度,一个是价差,一个是深度。说白了,价差告诉你交易成本有多高,深度告诉你市场能扛住多大的单子。这两个东西搞明白了,高频信号的一半你就抓住了。
3.1 买卖价差:流动性的直接标尺
买卖价差(Bid-Ask Spread),就是最优卖价减去最优买价。公式简单:
spread = ask_price_1 - bid_price_1
但别小看这个数。我当年做美股做市商策略时,每天盯着这个价差看。价差突然收窄,往往意味着有聪明钱在进场;价差突然拉宽,要么是消息出来了,要么是流动性 provider 在撤退。
关键点:价差越小,流动性越好,交易成本越低。但价差过小也可能是陷阱——比如某些高频做市商在撤单前会故意把价差压得很窄,引诱你进场。
实际计算时,我习惯用相对价差(Relative Spread),也就是价差除以中间价:
mid_price = (ask_price_1 + bid_price_1) / 2
relative_spread = spread / mid_price
这样在不同价格水平的股票之间才有可比性。茅台和工商银行的绝对价差差了几十倍,但相对价差可能都在同一个量级。
我的经验:做跨品种统计时,一定要用相对价差。我曾经在回测里直接用绝对价差做因子,结果茅台永远排在最前面,后来才发现是价格本身在主导,根本不是流动性信号。
3.2 加权平均价:比中间价更聪明
中间价(Mid Price)虽然常用,但它只用了最优一档。我个人觉得,加权平均价(Weighted Average Price)更能反映真实的成交预期。
加权平均价的计算方式有很多种,我最常用的是成交量加权平均价(VWAP),但那是日内的。在订单簿微观结构里,我们更关注订单簿加权平均价:
def weighted_mid_price(bids, asks, levels=5):
"""
bids: [(price, volume), ...]
asks: [(price, volume), ...]
"""
bid_total_vol = sum(v for _, v in bids[:levels])
ask_total_vol = sum(v for _, v in asks[:levels])
bid_weighted_price = sum(p * v for p, v in bids[:levels]) / bid_total_vol
ask_weighted_price = sum(p * v for p, v in asks[:levels]) / ask_total_vol
return (bid_weighted_price + ask_weighted_price) / 2
这个指标的好处是,它把深度也考虑进去了。如果买单集中在低价位,卖单集中在高价位,加权平均价就会偏离中间价,告诉你市场的真实供需重心在哪。
注意:加权平均价的层数选择很敏感。我试过用10层和用5层,结果在某些股票上相关系数只有0.6。建议根据股票的流动性来动态调整层数,比如只取到累计深度达到某个阈值为止。
3.3 市场深度:你能吃下多少单子
市场深度(Market Depth),简单说就是某个价格水平上能成交的量。但光看单层深度不够,我们通常看累计深度:
def cumulative_depth(orders, levels=10):
total_vol = 0
depth_profile = []
for price, vol in orders[:levels]:
total_vol += vol
depth_profile.append((price, total_vol))
return depth_profile
我个人习惯看深度斜率。如果前几档深度很大,后面突然变薄,说明做市商在堆单,实际流动性可能没那么好。斜率陡峭的订单簿,冲击成本会突然放大。
举个例子,某只股票买一挂了1000手,买二只有200手,买三只有50手。这种深度分布,你一个500手的卖单下去,价格可能直接砸穿两层。
实战技巧:我经常用「深度到价格影响1bp所需的量」来衡量市场深度。这个指标在不同股票之间可比,而且能直接告诉你交易成本。
3.4 深度不平衡度:多空力量的博弈
深度不平衡度(Depth Imbalance),是我在实盘中最爱用的信号之一。它衡量的是买单深度和卖单深度的相对大小:
def depth_imbalance(bid_vol, ask_vol):
if bid_vol + ask_vol == 0:
return 0
return (bid_vol - ask_vol) / (bid_vol + ask_vol)
取值范围在-1到1之间。正值表示买单深度更大,市场偏多头;负值表示卖单深度更大,市场偏空头。
嗯,这里要注意:深度不平衡度不是简单的多空指标。我见过很多次,深度不平衡度显示极度偏多,但价格却在下跌。为什么?因为那些买单可能是虚假的,做市商随时准备撤单。
避坑指南:我曾经只靠深度不平衡度做交易,结果被假单坑惨了。后来我加入了「撤单率」这个辅助指标——如果买单深度大但撤单率也高,那这个信号就要打折扣。
实际应用中,我通常计算多个档位的深度不平衡度,比如前3层、前5层、前10层。不同档位的不平衡度如果方向一致,信号可靠性就高很多。
3.5 把这些指标串起来
单独看一个指标都有局限。我习惯把价差、加权平均价、深度、不平衡度组合成一个特征向量,输入到模型里。比如:
features = {
'spread': spread,
'relative_spread': relative_spread,
'weighted_mid': weighted_mid,
'depth_5_bid': cum_depth_bid_5,
'depth_5_ask': cum_depth_ask_5,
'imbalance_3': imbalance_3,
'imbalance_5': imbalance_5,
'imbalance_10': imbalance_10,
'depth_slope_bid': slope_bid,
'depth_slope_ask': slope_ask
}
你想想看,这些特征组合在一起,基本就能刻画订单簿的完整状态了。价差告诉你成本,深度告诉你容量,不平衡度告诉你方向,加权平均价告诉你重心。
我个人觉得,做高频信号提取,最重要的不是找什么神秘指标,而是把这些基础指标理解透、用到位。很多所谓的「Alpha」,其实就是这些基础指标的某种非线性组合。
总结一下:价差看成本,深度看容量,不平衡度看方向,加权平均价看重心。这四个维度缺一不可。
这张图把咱们今天讲的内容串起来了。从订单簿出发,四个核心指标各有侧重,最后组合成特征向量,用于高频信号提取。你写代码的时候,可以按照这个结构来组织你的特征工程代码。