3、波动率度量方法:历史波动率计算、隐含波动率提取、波动率曲面构建

波动率这东西,说白了就是市场的「脾气」。

我刚开始做量化那会儿,总觉得波动率就是个数字。后来亏了几次才明白——波动率是套利的命门。你连市场脾气都摸不准,怎么跟它玩?

这一章,咱们就把波动率的三种度量方法掰开揉碎。历史波动率、隐含波动率、波动率曲面,一个一个来。

3.1 历史波动率:看过去,猜未来

历史波动率,就是拿过去的价格数据算出来的。它告诉你:这只股票过去有多疯

我个人习惯用对数收益率来算,而不是简单收益率。为什么?因为对数收益率更符合正态分布假设,而且可加性更好。你想想看,连续复利算下来,时间加总就是累加,多清爽。

核心公式:

σ = √(252) × √( (1/(n-1)) × Σ(Rᵢ - R̄)² )

其中 Rᵢ = ln(Pᵢ / Pᵢ₋₁),n 是样本天数,252 是年化因子

代码实现其实不复杂。我贴一段我常用的 Python 代码,你们可以直接拿去用:

import numpy as np
import pandas as pd

def historical_volatility(prices, window=20):
    """
    计算历史波动率
    prices: 价格序列
    window: 滚动窗口天数
    """
    log_returns = np.log(prices / prices.shift(1))
    rolling_std = log_returns.rolling(window=window).std()
    # 年化
    hv = rolling_std * np.sqrt(252)
    return hv

# 使用示例
df = pd.read_csv('stock_prices.csv')
df['HV_20'] = historical_volatility(df['Close'], window=20)

避坑指南:

  • 窗口长度怎么选? 我一般用 20 天(一个月)和 60 天(一个季度)两个窗口。太短了噪声大,太长了反应迟钝。
  • 数据频率呢? 日频数据最常用。但如果你做高频套利,用 5 分钟甚至 1 分钟数据会更敏感。
  • 异常值处理: 我曾经遇到过一只股票突然停牌复牌,价格跳空 30%。这种数据如果不剔除,算出来的波动率直接翻倍,完全失真。

我的小技巧: 算历史波动率时,我习惯同时算 EWMA(指数加权移动平均)。给近期的数据更高权重,反应更快。代码就一行:

ewma_vol = log_returns.ewm(span=20).std() * np.sqrt(252)

3.2 隐含波动率:市场在告诉你什么?

历史波动率看的是过去,隐含波动率看的是未来预期

说白了,隐含波动率就是把期权价格反推出来的波动率。市场觉得这只股票未来会波动多大,全写在期权价格里了。

怎么提取?用BSM 模型反推。BSM 公式里,除了波动率,其他参数都是已知的(标的价格、行权价、到期时间、无风险利率)。那就用数值方法把 σ 解出来。

核心思路:

给定期权市场价格 C_market,求解 σ 使得:

C_BSM(S, K, T, r, σ) - C_market = 0

常用方法:牛顿迭代法、二分法

代码实现,我习惯用牛顿迭代法,收敛快:

from scipy.stats import norm
from scipy.optimize import fsolve

def bsm_call_price(S, K, T, r, sigma):
    d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)

def implied_volatility(market_price, S, K, T, r):
    # 目标函数:BSM价格 - 市场价格 = 0
    def objective(sigma):
        return bsm_call_price(S, K, T, r, sigma) - market_price
    
    # 初始猜测 0.3,求解
    iv = fsolve(objective, 0.3)[0]
    return iv

# 示例
iv = implied_volatility(market_price=5.2, S=100, K=105, T=30/365, r=0.03)
print(f"隐含波动率: {iv:.2%}")

注意: 牛顿迭代法对初始值敏感。我建议先用二分法粗算一个范围,再用牛顿法精算。不然容易发散。

另外,深度虚值期权和深度实值期权的隐含波动率往往不稳定。我一般只取平值附近 2-3 档的期权来算。

3.3 波动率曲面:三维视角看市场

单个期权的隐含波动率只是一个点。但市场是立体的——不同行权价、不同到期日,隐含波动率都不一样

把这些点连起来,就形成了波动率曲面

为什么会这样?理论上 BSM 模型假设波动率是常数,但现实不是。市场参与者对短期风险的定价和对长期风险的定价不一样,对虚值期权的定价和对实值期权的定价也不一样。这就形成了「波动率微笑」和「波动率期限结构」。

构建波动率曲面的步骤:

  1. 数据采集: 获取同一标的所有期权合约的隐含波动率
  2. 按维度整理: 行权价 K 为一维,到期时间 T 为另一维
  3. 插值平滑: 用样条插值或核平滑,把离散点连成连续曲面
  4. 外推处理: 边界处的数据点往往稀疏,需要合理外推

我贴一张我常用的波动率曲面示意图,你们感受一下:

波动率曲面示意图 行权价 (K) 隐含波动率 (IV) 到期时间 (T) T=30天 T=60天 T=90天 T=180天 波动率微笑 期限结构

这张图里,你能看到两个特征:

  • 波动率微笑: 平值附近波动率最低,两边虚值和实值方向走高
  • 期限结构: 短期波动率变化剧烈,长期波动率相对平滑

实战经验: 我每天开盘前第一件事,就是看波动率曲面有没有「异常隆起」。如果某个行权价附近的隐含波动率突然高出周围一大截,往往意味着有大资金在布局。这时候,套利机会就来了。

3.4 三种波动率的联动关系

这三种波动率不是孤立的。它们之间有个核心关系

波动率类型 数据来源 反映什么 套利用途
历史波动率 标的价格历史 过去实际波动 判断当前 IV 是否合理
隐含波动率 期权市场价格 市场未来预期 寻找 IV 与 HV 的偏离
波动率曲面 全部期权合约 市场全貌 跨期、跨品种套利

我常用的一个策略是:当隐含波动率远高于历史波动率时,做空波动率;反之做多。但要注意,这个「远高于」没有固定标准。我一般看 IV/HV 比值,超过 1.5 倍才动手。

血的教训: 我曾经看到 IV 比 HV 高了 2 倍,果断做空波动率。结果第二天财报出来,股价直接崩了 20%,IV 瞬间翻倍。亏得我怀疑人生。

所以记住:IV 高不一定意味着回归,可能是市场在定价一个尾部风险。做波动率套利,一定要看基本面有没有大事发生。

嗯,这一章的内容就到这儿。波动率度量是套利的基础,你把这些搞透了,后面的资金管理才有根。


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