mcpField
V
volatility-modeling

volatility-modeling

github.com/joellewis数据与数据库218720 次安装15 周前更新
代码仓库

关于 volatility-modeling

讲解 EWMA、GARCH(1,1)、隐含波动率及相关期权市场概念的金融波动率建模技能,面向研究波动率估计、预测和风险溢价的分析人员,并提供公式、示例及 Python 脚本。

主要功能

  1. 01EWMA 方差估计
  2. 02GARCH(1,1) 预测与持续性
  3. 03隐含波动率概念
  4. 04波动率微笑与期限结构
  5. 05波动率风险溢价分析
  6. 06模型示例 Python 脚本

适用场景

  1. 01根据收益率序列估计波动率
  2. 02预测均值回归的波动率
  3. 03解读隐含波动率与已实现波动率
  4. 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。

评论

支持 Markdown