波动率基础:定义、分类与数学表达

做配对交易这些年,我越来越觉得波动率是个绕不开的核心。说白了,波动率就是资产价格跳动的剧烈程度。你想想看,没有波动率,套利空间从哪来?

我个人习惯把波动率比作市场的「心跳」。心跳太快或太慢,都说明市场不太正常。而我们要做的,就是读懂这个心跳,从中找到交易机会。

波动率的三种面孔

实际工作中,我们主要跟三种波动率打交道。它们各有各的脾气,也各有各的用处。

1. 历史波动率(Historical Volatility, HV)

历史波动率,就是看过去。它衡量的是资产价格在过去一段时间内的实际波动幅度。

计算方式其实不复杂:

# 计算历史波动率的简单示例
import numpy as np

# 假设有每日收盘价
prices = [100, 102, 101, 105, 107, 106, 110]
log_returns = np.diff(np.log(prices))  # 对数收益率
hv = np.std(log_returns) * np.sqrt(252)  # 年化
print(f"年化历史波动率: {hv:.4f}")

这里有个细节要注意。我刚开始做量化时,直接用标准差乘上根号252。后来发现,如果数据频率是日线,这样没问题。但如果是分钟线,就得用对应的年化系数。

我的经验:历史波动率适合做参考基准。比如你发现当前波动率远低于历史均值,那可能意味着市场即将「爆发」。

2. 隐含波动率(Implied Volatility, IV)

隐含波动率就更有意思了。它不是算出来的,而是从期权价格里「反推」出来的。

什么意思呢?市场参与者对未来的预期,都藏在期权价格里。我们用Black-Scholes模型,把期权价格代入,反解出那个让模型价格等于市场价格的波动率——这就是隐含波动率。

# 用scipy求解隐含波动率(示意)
from scipy.optimize import brentq
import numpy as np

def implied_volatility(option_price, S, K, T, r, option_type='call'):
    """求解隐含波动率"""
    def bs_price(sigma):
        d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
        d2 = d1 - sigma*np.sqrt(T)
        if option_type == 'call':
            return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
        else:
            return K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
    
    return brentq(lambda s: bs_price(s) - option_price, 0.01, 5.0)

嗯,这里要注意。隐含波动率反映的是市场情绪。我见过很多新手,看到IV很高就觉得期权贵了,想卖。但有时候IV高是有原因的——比如财报前、重大事件前,市场确实预期会有大波动。

避坑指南:我曾经在2018年做空VIX(隐含波动率指数),觉得IV太高了不合理。结果市场继续恐慌,IV更高了。后来我明白一个道理:隐含波动率可以「不合理」很久,直到你爆仓。

3. 已实现波动率(Realized Volatility, RV)

已实现波动率,是高频数据下的「真实」波动。它跟历史波动率的区别在于:

  • 历史波动率:通常用日线数据,低频
  • 已实现波动率:用分钟级甚至tick级数据,高频

计算方式上,已实现波动率用的是日内高频收益率的平方和:

# 已实现波动率计算
def realized_volatility(high_freq_prices):
    """输入高频价格序列,返回已实现波动率"""
    log_returns = np.diff(np.log(high_freq_prices))
    rv = np.sqrt(np.sum(log_returns**2))
    return rv

说白了,已实现波动率更「精细」。它能捕捉到一天内的剧烈波动,而历史波动率可能被平滑掉了。

波动率的数学表达

搞量化交易,数学表达是基本功。波动率的核心公式其实就几个:

类型 公式 说明
对数收益率 rt = ln(Pt / Pt-1) 比简单收益率更符合正态分布假设
样本标准差 σ = √( Σ(rt - μ)² / (n-1) ) 历史波动率的基础
年化因子 σ年化 = σ × √252 日线数据用252个交易日
已实现波动率 RV = √( Σ ri² ) 高频数据,假设均值接近0

我个人习惯用对数收益率。为什么?因为对数收益率在时间上可加,而且更接近正态分布。虽然实际数据有厚尾,但至少比简单收益率好处理。

波动率微笑与偏斜

这个现象很有意思。理论上,Black-Scholes模型假设波动率是常数。但实际市场中,不同行权价的期权,隐含波动率是不一样的。

波动率微笑:把不同行权价的IV画出来,形状像个微笑。平值期权IV最低,两边越来越高。

波动率偏斜:在股票市场,通常是虚值看跌期权的IV高于虚值看涨期权。这说明市场更担心大跌,而不是大涨。

核心要点:

  • 波动率微笑说明市场不是Black-Scholes假设的那么理想
  • 偏斜程度可以衡量市场恐慌情绪
  • 在配对交易中,我们关注的是两只股票的波动率差异,而不是绝对水平

我做过一个项目,利用波动率偏斜来优化配对交易的入场时机。当某只股票的偏斜突然变大,说明市场在给它定价风险溢价。这时候,如果配对组合的另一只股票没有相应变化,就出现了套利机会。

你想想看,波动率本身就是一个信息载体。读懂它,就等于读懂了市场的「潜台词」。

波动率知识体系 波动率 历史波动率 (HV) 隐含波动率 (IV) 已实现波动率 (RV) 日线数据 年化因子√252 BS模型反推 市场情绪指标 高频数据 平方和法 波动率微笑与偏斜

这张图把波动率的知识体系串起来了。从中心出发,三条主线分别对应三种波动率。每种波动率又有自己的计算方法和应用场景。最下面那个虚线连接的,就是波动率微笑和偏斜——它是市场实际表现对理论模型的「修正」。

实战建议:在配对交易中,我通常这样用波动率:
  1. 用历史波动率做长期基准,判断当前波动率水平
  2. 用隐含波动率观察市场情绪,寻找极端情况
  3. 用已实现波动率做实时监控,捕捉短期套利机会

好了,波动率的基础就聊到这。记住一句话:波动率不是风险本身,而是风险的「价格」。理解了这一点,后面的配对交易优化就好办了。

专注资料整理