第4章 价差与波动率:买卖价差的决定因素、波动率对做市策略的影响、如何利用波动率调整报价宽度

4.1 买卖价差的决定因素

做市商赚的是什么?说白了,就是买卖价差。但价差不是你想设多少就设多少,它背后有一整套逻辑在驱动。

我个人习惯把价差的决定因素分成三类:市场结构因素资产特性因素时间因素

4.1.1 市场结构因素

  • 交易量:流动性越好的品种,价差越小。比如BTC/USDT在币安的主交易对,价差经常只有0.01%。
  • 订单簿深度:深度越厚,大单对价格的冲击越小,价差可以收窄。
  • 竞争程度:做市商越多,价差越薄。我在做美股ETF时,一个标的同时有十几家做市商报价,价差压到0.01美元以下。
  • 交易规则:比如最小价格变动单位(tick size)直接限制了价差的下限。

4.1.2 资产特性因素

  • 波动率:这是核心变量,后面会详细讲。
  • 价格水平:高价股和低价股的价差绝对值不同,但相对价差可能接近。
  • 信息不对称风险:比如财报发布前,价差通常会扩大。

4.1.3 时间因素

  • 交易时段:开盘和收盘时段价差通常较大,盘中相对稳定。
  • 事件窗口:重大新闻发布前后,价差会急剧扩大。

核心公式:最优价差 = 库存风险成本 + 逆向选择成本 + 订单处理成本

这个公式我用了很多年,每次调整参数时都会重新审视这三个成本的比例。

4.2 波动率对做市策略的影响

波动率这东西,做市商又爱又恨。爱的是波动大意味着价差可以设大一点,赚得更多;恨的是波动大意味着库存风险急剧上升,一不小心就亏回去。

我记得有一次做ETH的做市,波动率突然从30%飙到120%。我按老习惯设了0.05%的价差,结果一个小时内库存被吃光,反向波动直接亏了2个ETH。嗯,从那以后我再也不敢忽视波动率了。

4.2.1 波动率如何影响做市商的利润

做市商的利润公式可以简化为:

利润 ≈ 价差收入 - 库存损失 - 手续费

波动率主要影响库存损失这一项。波动越大,库存价值的不确定性越高,潜在的损失也越大。

你想想看,如果波动率是10%,你持有一分钟的风险敞口可能只有0.01%。但如果波动率是100%,同样一分钟的风险敞口可能达到0.1%。差了整整10倍。

4.2.2 波动率与最优报价宽度的关系

学术界有个经典模型叫Avellaneda-Stoikov,它给出了一个理论上的最优报价宽度公式:

最优半价差 = 0.5 * γ * σ² * T * Q

其中:

  • γ:风险厌恶系数
  • σ:波动率
  • T:持仓时间
  • Q:当前库存量

这个公式告诉我们一个简单道理:波动率翻倍,价差应该翻四倍(因为σ²)。

注意:这个公式是理论模型,实际应用中需要根据市场情况调整。我曾经在低波动率市场直接套用这个公式,结果价差设得太小,被高频交易者反复收割。

4.3 如何利用波动率调整报价宽度

理论讲完了,咱们来点实际的。怎么在代码里实现波动率驱动的报价宽度调整?

4.3.1 波动率计算

我个人习惯用指数加权移动平均(EWMA)来计算实时波动率,而不是简单的历史波动率。原因很简单:EWMA对近期数据更敏感,能更快响应市场变化。

def calc_ewma_volatility(prices, lambda_=0.94):
    """
    计算EWMA波动率
    lambda_:衰减因子,通常取0.94-0.97
    """
    returns = np.diff(np.log(prices))
    variance = 0
    for r in reversed(returns):
        variance = lambda_ * variance + (1 - lambda_) * r ** 2
    return np.sqrt(variance * 252)  # 年化

4.3.2 动态报价宽度策略

基于波动率调整报价宽度,我常用的策略是:

  1. 基准价差:设定一个基础价差,比如0.02%
  2. 波动率乘数:当前波动率 / 基准波动率
  3. 调整后的价差 = 基准价差 × 波动率乘数^α

其中α是一个可调参数,我一般设在0.5到1.5之间。α越大,价差对波动率越敏感。

def calc_spread(base_spread, current_vol, base_vol, alpha=1.0):
    """
    根据波动率调整报价宽度
    """
    vol_ratio = current_vol / base_vol
    adjusted_spread = base_spread * (vol_ratio ** alpha)
    # 限制价差范围,防止极端情况
    adjusted_spread = max(min_spread, min(max_spread, adjusted_spread))
    return adjusted_spread

实战技巧:我建议把波动率分成几个区间,每个区间用不同的参数。比如:

  • 低波动(<20%):α=0.5,价差收窄以吸引订单
  • 中波动(20%-60%):α=1.0,正常调整
  • 高波动(>60%):α=1.5,价差大幅扩大以保护库存

4.3.3 波动率调整的实时监控

在实际系统中,波动率不是一成不变的。我习惯每秒钟重新计算一次波动率,然后动态调整报价。

这里有个坑:波动率突变。比如突然出现一个巨量成交,波动率瞬间飙升。如果你立刻把价差拉大,可能会错过后续的稳定行情。

我的做法是加一个平滑滤波器

smoothed_vol = 0.9 * prev_smoothed_vol + 0.1 * current_vol

这样既保留了波动率的趋势,又避免了被瞬时噪音干扰。

4.4 知识体系总览

下面这张图总结了本章的核心逻辑,我画了很久才满意:

价差与波动率:知识体系 做市报价策略 价差决定因素 市场结构:流动性、深度、竞争 资产特性:波动率、价格、信息 时间因素:时段、事件窗口 波动率影响 库存风险:波动越大风险越高 利润公式:价差收入-库存损失 Avellaneda-Stoikov模型 报价宽度调整 EWMA波动率计算 动态乘数:基准×波动率^α 平滑滤波:避免突变干扰 核心原则:波动率驱动价差,库存控制风险 动态调整 + 平滑过渡 + 区间管理

4.5 实战中的避坑指南

做市这么多年,我踩过的坑不少。挑几个典型的说说:

坑1:波动率计算周期选错

我曾经用5分钟K线算波动率,结果在快速行情下反应太慢。后来改成1秒Tick级别,又发现噪音太大。最终折中方案:用10秒窗口的EWMA,效果最好。

坑2:价差调整过于激进

有一次波动率从20%跳到80%,我直接把价差扩大了4倍。结果市场很快回归平静,我的报价完全失去竞争力,一整天没成交。后来加了平滑和区间限制,再没出过这种问题。

我的建议:刚开始做波动率调整时,先把α设小一点(比如0.3),观察一段时间再逐步加大。宁可少赚,不要大亏。

4.6 本章小结

价差和波动率的关系,说白了就是风险定价。波动率越高,你承担的风险越大,价差就应该越宽。

但要注意,这不是一个简单的线性关系。市场结构、资产特性、时间因素都会影响最终的报价宽度。我个人的经验是:先理解理论模型,再根据实际数据调整参数

最后送大家一句话:做市不是赌博,是概率游戏。波动率是你的朋友,但前提是你得学会怎么用它。


公众号:蓝海资料掘金营,微信deep3321