第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 动态报价宽度策略
基于波动率调整报价宽度,我常用的策略是:
- 基准价差:设定一个基础价差,比如0.02%
- 波动率乘数:当前波动率 / 基准波动率
- 调整后的价差 = 基准价差 × 波动率乘数^α
其中α是一个可调参数,我一般设在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 知识体系总览
下面这张图总结了本章的核心逻辑,我画了很久才满意:
4.5 实战中的避坑指南
做市这么多年,我踩过的坑不少。挑几个典型的说说:
坑1:波动率计算周期选错
我曾经用5分钟K线算波动率,结果在快速行情下反应太慢。后来改成1秒Tick级别,又发现噪音太大。最终折中方案:用10秒窗口的EWMA,效果最好。
坑2:价差调整过于激进
有一次波动率从20%跳到80%,我直接把价差扩大了4倍。结果市场很快回归平静,我的报价完全失去竞争力,一整天没成交。后来加了平滑和区间限制,再没出过这种问题。
我的建议:刚开始做波动率调整时,先把α设小一点(比如0.3),观察一段时间再逐步加大。宁可少赚,不要大亏。
4.6 本章小结
价差和波动率的关系,说白了就是风险定价。波动率越高,你承担的风险越大,价差就应该越宽。
但要注意,这不是一个简单的线性关系。市场结构、资产特性、时间因素都会影响最终的报价宽度。我个人的经验是:先理解理论模型,再根据实际数据调整参数。
最后送大家一句话:做市不是赌博,是概率游戏。波动率是你的朋友,但前提是你得学会怎么用它。
公众号:蓝海资料掘金营,微信deep3321