波动率概念与度量:定义波动率,介绍历史波动率、隐含波动率、已实现波动率的计算方法与区别
波动率,说白了就是资产价格上下跳动的幅度。我刚开始做量化那会儿,总觉得波动率就是个标准差,后来踩了不少坑才明白——波动率其实是个大家族,不同场景下用的度量方式完全不一样。
今天咱们就把三种最主流的波动率掰开揉碎讲清楚:历史波动率、隐含波动率、已实现波动率。嗯,这三兄弟各有各的脾气,用错了地方,模型直接翻车。
1. 波动率的本质定义
先给个严谨定义:波动率是资产收益率的标准差,衡量价格的不确定性。数学上长这样:
σ = √(Var(r))
其中 r 是收益率序列。但这里有个坑——你用的是对数收益率还是简单收益率?我个人习惯用对数收益率,因为它在时间上可加,而且分布更接近正态。我在项目中遇到过用简单收益率算波动率,结果回测漂亮,实盘一塌糊涂,后来才发现是收益率定义出了问题。
核心要点:波动率不是价格变动的绝对值,而是收益率的标准差。年化波动率 = 日波动率 × √252,这个转换公式一定要记牢。
2. 历史波动率(Historical Volatility)
历史波动率,顾名思义,就是拿过去的数据算波动率。它假设历史会重演,说白了就是「过去怎么跳,未来也怎么跳」。
计算步骤其实很简单:
- 取过去 N 天的收盘价,计算每日对数收益率
- 计算这些收益率的标准差
- 年化处理(乘以 √252)
代码实现也就几行:
import numpy as np
import pandas as pd
def historical_volatility(prices, window=20):
# 对数收益率
log_returns = np.log(prices / prices.shift(1))
# 滚动标准差
hv = log_returns.rolling(window).std() * np.sqrt(252)
return hv
我的经验:窗口期选多少?20天适合短线,60天适合中线,252天看长期。我曾经用20天窗口做期权定价,结果波动率剧烈抖动,策略根本没法执行。后来改成60天,稳定多了。
历史波动率的缺点也很明显——它只能反映过去,对突发事件完全没反应。你想想看,如果明天突然来个黑天鹅,历史波动率还是慢悠悠地更新,根本来不及预警。
3. 隐含波动率(Implied Volatility)
隐含波动率就聪明多了。它不是从价格算出来的,而是从期权价格反推出来的。说白了,市场认为未来会波动成什么样,隐含波动率就是那个答案。
怎么算?用BSM模型反解:
C_market = BSM(S, K, T, r, σ_implied)
# 解出 σ_implied 使得理论价格 = 市场价格
这个方程没有解析解,只能用数值方法。我一般用牛顿法或者二分法:
from scipy.optimize import brentq
import py_vollib.black_scholes as bs
def implied_volatility(price, S, K, T, r, flag='c'):
# 目标函数:理论价 - 市场价 = 0
def objective(sigma):
return bs.black_scholes(flag, S, K, T, r, sigma) - price
# 二分法求解
try:
iv = brentq(objective, 0.01, 5.0)
except ValueError:
iv = np.nan
return iv
避坑指南:我曾经用牛顿法求解隐含波动率,结果初始值设得不好,迭代发散直接报错。后来改用brentq二分法,虽然慢一点,但稳定多了。记住,数值稳定性比速度重要。
隐含波动率有个有趣的现象——波动率微笑。为什么?因为市场认为极端行情发生的概率比正态分布预测的要高。我见过不少新手看到微笑曲线就慌了,其实这是常态。
4. 已实现波动率(Realized Volatility)
已实现波动率是高频数据的产物。它用日内分钟级甚至秒级的数据,计算更精确的波动率。公式如下:
RV = √( Σ(r_i²) )
其中 r_i 是日内每个时间段的收益率。注意,这里用的是平方和,不是标准差。为什么?因为高频数据均值接近0,平方和就是方差的无偏估计。
代码实现:
def realized_volatility(high_freq_prices):
# 假设数据是5分钟频率
log_returns = np.log(high_freq_prices / high_freq_prices.shift(1))
# 日内平方和
rv = np.sqrt(np.sum(log_returns**2))
# 年化
rv_annual = rv * np.sqrt(252 * 78) # 一天78个5分钟
return rv_annual
关键区别:已实现波动率用的是日内高频数据,能捕捉到盘中波动细节。而历史波动率用的是日频数据,丢失了大量日内信息。我做过对比,用已实现波动率做风险预警,比历史波动率提前了大约2-3小时。
5. 三种波动率的对比
咱们用一张表总结一下:
| 类型 | 数据来源 | 计算方式 | 特点 | 适用场景 |
|---|---|---|---|---|
| 历史波动率 | 日频收盘价 | 收益率标准差 | 滞后、稳定 | 长期风险度量 |
| 隐含波动率 | 期权价格 | BSM反解 | 前瞻、易变 | 期权定价、市场情绪 |
| 已实现波动率 | 高频数据 | 日内平方和 | 实时、精确 | 高频交易、风险预警 |
你想想看,这三种波动率其实对应着不同的时间维度:历史波动率看过去,隐含波动率看未来,已实现波动率看当下。做GARCH模型时,我通常用已实现波动率作为真实值来检验模型效果,效果比用日频数据好得多。
6. 知识体系结构图
下面这张图帮你理清三种波动率的关系:
个人建议:做GARCH模型时,别只盯着历史波动率。我习惯把三种波动率都算出来,画在一张图上对比。如果隐含波动率和已实现波动率出现大幅背离,往往意味着市场要变盘了。
嗯,波动率这块内容就讲到这里。记住,没有哪种波动率是万能的,关键看你用在什么场景。做风控用历史波动率,做期权用隐含波动率,做高频用已实现波动率——各司其职,别混着用。