第三节:价差与深度——买卖价差、加权平均价、市场深度、深度不平衡度

好,咱们今天聊点实在的。订单簿里最核心的两个维度,一个是价差,一个是深度。说白了,价差告诉你交易成本有多高,深度告诉你市场能扛住多大的单子。这两个东西搞明白了,高频信号的一半你就抓住了。

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」,其实就是这些基础指标的某种非线性组合。

总结一下:价差看成本,深度看容量,不平衡度看方向,加权平均价看重心。这四个维度缺一不可。

订单簿微观结构 买卖价差 加权平均价 市场深度 深度不平衡度 绝对价差 相对价差 成交量加权VWAP 订单簿加权平均 累计深度 深度斜率 多档位不平衡度 撤单率辅助 组合特征 → 高频信号提取

这张图把咱们今天讲的内容串起来了。从订单簿出发,四个核心指标各有侧重,最后组合成特征向量,用于高频信号提取。你写代码的时候,可以按照这个结构来组织你的特征工程代码。