关于 volatility-modeling
讲解 EWMA、GARCH(1,1)、隐含波动率及相关期权市场概念的金融波动率建模技能,面向研究波动率估计、预测和风险溢价的分析人员,并提供公式、示例及 Python 脚本。
主要功能
- 01EWMA 方差估计
- 02GARCH(1,1) 预测与持续性
- 03隐含波动率概念
- 04波动率微笑与期限结构
- 05波动率风险溢价分析
- 06模型示例 Python 脚本
适用场景
- 01根据收益率序列估计波动率
- 02预测均值回归的波动率
- 03解读隐含波动率与已实现波动率
- 04分析不同行权价和期限的期权波动率
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill volatility-modeling安装后在 Claude Code 中输入/volatility-modeling确认已加载。
附带文件scripts/volatility_modeling.py
详细介绍
波动率建模
核心概念
EWMA(指数加权移动平均)
一种简单的波动率模型,对近期观测值赋予更高权重。RiskMetrics 推广了这一方法,并采用了标准衰减因子。
sigma^2_t = lambda * sigma^2_{t-1} + (1 - lambda) * r^2_{t-1}
其中:
- lambda = 衰减因子(RiskMetrics 标准值:日频为 0.94,月频为 0.97)
- r_{t-1} = t-1 期的收益率(通常会去均值,但对于日收益率,均值通常假定为零)
- sigma^2_{t-1} = 上一期的方差估计值
特性:
- 对过去的收益率平方赋予指数递减的权重。
- 有效窗口约为 1/(1 - lambda) 个观测值。lambda = 0.94 时,有效窗口约为 17 天。
- 不存在均值回归:该模型等价于 alpha + beta = 1 的 IGARCH(积分 GARCH)。波动率冲击会无限期持续。
- 实现简单,只需要一个参数。
GARCH(1,1)
广义自回归条件异方差模型通过加入常数项,使波动率产生均值回归。
sigma^2_t = omega + alpha * r^2_{t-1} + beta * sigma^2_{t-1}
其中:
- omega > 0:常数项(决定长期方差水平)
- alpha >= 0:反应系数(对近期冲击的敏感度)
- beta >= 0:持续性系数(对过去方差的记忆程度)
平稳性条件: alpha + beta < 1。这确保该过程协方差平稳且会均值回归。
长期(无条件)方差:
V_L = omega / (1 - alpha - beta)
长期年化波动率:sigma_L = sqrt(V_L * 252)。
持续性: alpha + beta 衡量波动率回归至长期水平的速度。持续性越高,均值回归越慢。
波动率冲击的半衰期: 波动率冲击衰减一半所需的期数:
h = -ln(2) / ln(alpha + beta)
由于 alpha + beta < 1,因此 ln(alpha + beta) < 0,且 h 为正数。
多步预测: GARCH(1,1) 的 h 步前预测:
E[sigma^2_{t+h}] = V_L + (alpha + beta)^h * (sigma^2_t - V_L)
当 h 趋近无穷大时,预测值会收敛至 V_L。
隐含波动率
将波动率值代入期权定价模型(通常是 Black-Scholes)后,得出的理论价格等于观察到的市场价格。
对于 Black-Scholes 模型下的欧式看涨期权:
C = S * N(d1) - K * exp(-rT) * N(d2)
d1 = [ln(S/K) + (r + sigma^2/2) * T] / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
隐含波动率是满足 C_model(sigma) = C_market 的 sigma。该方程没有闭式解,必须通过数值方法(例如 Newton-Raphson、二分法)求解。
波动率微笑与偏斜
在实践中,隐含波动率会随行权价变化,这与 Black-Scholes 的恒定波动率假设相矛盾。
- 波动率微笑: 深度实值期权和深度虚值期权的 IV 都较高,呈 U 形。这种情况在外汇市场较为常见。
- 波动率偏斜(smirk): 行权价越低,IV 越高(虚值看跌期权的 IV 高于虚值看涨期权)。这是股票市场的主导模式,反映了市场对下行保护的需求,以及左尾较厚这一现实。
- 偏斜通常通过以下方式量化: 25-delta 看跌期权与 25-delta 看涨期权之间的 IV 差异,或 90% 价内程度与 110% 价内程度行权价之间的差异。
波动率期限结构
隐含波动率会随期权到期日变化。
- 正常(向上倾斜): 到期日较远的期权具有更高的 IV,反映了不确定性会随时间推移而增加。
- 倒挂(向下倾斜): 近期 IV 高于长期 IV。在市场承压时较为常见,此时短期不确定性会激增(例如财报、选举或危机期间)。
- 驼峰形: IV 在某个中间期限达到峰值。特定事件预期发生前可能出现这种情况。
波动率曲面
由行权价(或 delta/价内程度)和到期时间共同决定的二维隐含波动率曲面。波动率曲面是最完整地呈现期权市场对未来不确定性看法的方式。
从业者会对曲面进行插值,为任意行权价和到期时间组合的期权定价。曲面动态(曲面如何移动、倾斜和弯曲)对期权投资组合风险管理至关重要。
已实现波动率与隐含波动率:波动率风险溢价
平均而言,隐含波动率系统性地高于之后的已实现波动率。这一差值就是波动率风险溢价(VRP)。
VRP = IV - RV_subsequent
VRP 的存在是因为投资者愿意为期权(保险)支付溢价,而期权卖方则要求获得承担尾部风险的补偿。VRP 通常为正,并且一直是波动率卖方持续的收益来源。
关键考量:
- VRP 会随时间变化,在市场承压时期更高。
- 卖出波动率(获取 VRP)可以赚取稳定溢价,但也面临大额、低频的亏损。
- 极端事件发生时,VRP 可能转为负值。
VIX 指数
CBOE 波动率指数衡量市场对未来 30 天波动率的预期,该指数根据 S&P 500 期权价格计算得出。
- VIX 以年化百分点报价(例如,VIX = 20 表示预期年化波动率约为 20%)。
- VIX 根据大量虚值看跌期权和看涨期权计算得出,而非使用 Black-Scholes 模型。
- VIX 水平:12-15 = 低/市场情绪平稳,15-20 = 正常,20-30 = 偏高,30+ = 市场承压严重,40+ = 危机。
- VIX 具有很强的均值回归特性,并且往往在市场抛售期间飙升(“恐惧指数”)。
关键公式
| 公式 | 表达式 | 用途 |
|---|---|---|
| EWMA 方差 | sigma^2_t = lambda * sigma^2_{t-1} + (1-lambda) * r^2_{t-1} | 简单的波动率预测 |
| GARCH(1,1) 方差 | sigma^2_t = omega + alpha * r^2_{t-1} + beta * sigma^2_{t-1} | 均值回归型波动率预测 |
| GARCH 长期方差 | V_L = omega / (1 - alpha - beta) | 无条件方差水平 |
| GARCH 半衰期 | h = -ln(2) / ln(alpha + beta) | 均值回归速度 |
| GARCH h 步预测 | V_L + (alpha+beta)^h * (sigma^2_t - V_L) | 多期波动率预测 |
| Black-Scholes 看涨期权 | S * N(d1) - K * exp(-rT) * N(d2) | 期权定价(提取 IV) |
| 波动率风险溢价 | IV - RV_subsequent | 波动率卖方获得的溢价 |
| EWMA 有效窗口 | 约 1 / (1 - lambda) | 隐含回看周期 |
示例演算
示例 1:EWMA 方差更新
已知: 昨日的方差估计 sigma^2_{t-1} = 0.0004(日波动率 = 2%),昨日的收益率 r_{t-1} = -3%(即 r = -0.03),且 lambda = 0.94。
计算: 今日的 EWMA 方差估计和日波动率。
解答:
sigma^2_t = 0.94 * 0.0004 + (1 - 0.94) * (-0.03)^2
= 0.94 * 0.0004 + 0.06 * 0.0009
= 0.000376 + 0.000054
= 0.000430
日波动率:
sigma_t = sqrt(0.000430) = 0.02074 = 2.074%
大幅负收益率(-3%)使波动率估计从 2.0% 升至 2.074%。EWMA 对这一冲击作出了响应,但较高的 lambda(0.94)减弱了反应幅度。
示例 2:GARCH(1,1) 长期波动率与半衰期
已知: 根据 S&P 500 日收益率估计得出的 GARCH(1,1) 参数:omega = 0.000002,alpha = 0.08,beta = 0.91。
计算: 长期日方差、长期年化波动率,以及波动率冲击的半衰期。
解答:
平稳性检查: alpha + beta = 0.08 + 0.91 = 0.99 < 1(平稳,但持续性很强)。
长期方差:
V_L = 0.000002 / (1 - 0.99) = 0.000002 / 0.01 = 0.0002
长期日波动率:
sigma_L = sqrt(0.0002) = 0.01414 = 1.414%
年化:
sigma_annual = 0.01414 * sqrt(252) = 22.45%
半衰期:
h = -ln(2) / ln(0.99) = -0.6931 / (-0.01005) = 68.97 ~ 69 trading days
解读:波动率受到冲击后,超额波动率约需 69 个交易日(约 3 个月)才会衰减一半。这种高度持续性(alpha + beta = 0.99)是股票指数收益率的典型特征。
示例 3:隐含波动率解读
**已知:**某只股票的交易价格为 $100。一份 3 个月期平值看涨期权(K = $100)的交易价格为 $6.50。无风险利率为 5%。使用 Black-Scholes 模型,通过数值求解器得出隐含波动率为 30%。
**计算:**这说明了什么?与 22% 的已实现波动率相比如何?
解答:
30% 的隐含波动率代表市场对未来 3 个月年化波动率的一致预期,该预期已反映在期权价格中。
与 22% 的已实现(历史)波动率相比:
VRP = IV - RV = 30% - 22% = 8%
8 个百分点的正差值就是波动率风险溢价。可能的解读:
- 市场预期波动率将高于近期的已实现水平。
- 期权卖方要求获得溢价,以承担尾部风险。
- 近期可能会有某个事件(财报、监管决定)引发波动率飙升。
系统性卖出波动率的策略会卖出这份期权,预期在已实现波动率保持在 22% 左右时,从波动率风险溢价中获利。不过,如果已实现波动率超过 30%,卖方就会承担相应风险。
常见陷阱
- **GARCH 平稳性:**对于 GARCH(1,1) 过程,要满足协方差平稳性,alpha + beta 必须严格小于 1。如果 alpha + beta >= 1,长期方差未定义,模型属于 IGARCH(或为爆炸性模型)。参数估计后务必检查这一条件。
- **EWMA 没有均值回归:**EWMA 等价于 IGARCH(alpha + beta = 1),因此波动率冲击永远不会衰减。这使 EWMA 不适合预期存在均值回归的长期波动率预测。
- **隐含波动率依赖模型:**使用 Black-Scholes 提取的 IV 假设收益服从对数正态分布、波动率恒定、交易连续且不存在跳跃。之所以存在“微笑”和“偏斜”,恰恰是因为这些假设不成立。IV 是一种报价惯例,并非真正的预测值。
- **混淆历史波动率与前瞻波动率:**历史(已实现)波动率衡量已经发生的情况。隐含波动率反映市场对未来的预期。二者回答的是不同问题,也可能存在显著差异。
- **未调整期限结构就使用日频 GARCH 进行长期预测:**日频 GARCH 预测在长期期限上会收敛到无条件方差。使用多步预测公式 E[sigma^2_{t+h}] = V_L + (alpha+beta)^h * (sigma^2_t - V_L),并进行适当汇总。
- **GARCH 模型过拟合:**高阶 GARCH(p,q) 模型或扩展模型(EGARCH、TGARCH、GJR-GARCH)可能会对样本内数据过拟合。对于大多数金融收益率序列,GARCH(1,1) 在样本外表现上很难被超越。请从 GARCH(1,1) 开始,并说明增加复杂度的理由。
- **选择 EWMA 的 lambda:**lambda 的选择会显著影响模型的响应速度。lambda = 0.94 对冲击响应较快(有效窗口约为 17 天);lambda = 0.97 更平滑(有效窗口约为 33 天)。应根据应用场景的期限进行选择。
交叉引用
- historical-risk(财富管理插件):收盘到收盘、Parkinson 和 Yang-Zhang 波动率估算方法提供已实现波动率基准,用于与 GARCH 预测和隐含波动率进行比较。
- forward-risk(财富管理插件):EWMA 和 GARCH 的波动率预测可直接用于参数法和蒙特卡洛 VaR 计算。
- performance-metrics(财富管理插件):波动率估算会影响 Sharpe、Sortino 等风险调整后比率的分母。使用前瞻性(GARCH)波动率可以得到条件绩效比率。
运行脚本
uv run scripts/volatility_modeling.py
PEP 723 标头会自动解析 numpy 和 scipy 依赖项。也可以在运行 pip install numpy scipy 后执行 python3 scripts/volatility_modeling.py。
- 直接运行会打印基于合成 GARCH 动态收益率的演示:EWMA 波动率、GARCH(1,1) 估计和多步预测、已实现波动率和 Parkinson 波动率、期限结构以及波动率锥。
--verify会重新运行关键计算,并断言输出与此技能中的示例一致(打印 PASS/FAIL;不匹配时以非零状态码退出)。--help会列出可用的类和方法。
此文件主要用于作为模块导入,例如 from volatility_modeling import VolatilityModeling。