1. 波动率建模导论:为什么需要ARCH/GARCH?

大家好,欢迎来到这门课。今天咱们聊聊波动率建模的起点——为什么金融时间序列需要ARCH和GARCH这类模型。

说实话,我刚入行做量化的时候,也天真地以为用普通的时间序列模型就能搞定一切。直到有一次,我在回测一个简单的均值回归策略时,发现模型在平静期表现完美,一到市场剧烈波动时就彻底崩盘。嗯,那次教训让我意识到:金融数据没那么简单。

金融时间序列的“怪脾气”

你想想看,股票收益率序列有什么特点?我总结了三个最典型的特征:

  • 波动率聚集:大的波动后面往往跟着大的波动,小的波动后面跟着小的波动。这不是玄学,是数据里明摆着的规律。
  • 厚尾分布:极端值出现的概率比正态分布预测的要高得多。说白了,市场暴跌和暴涨的频率远超你的想象。
  • 杠杆效应:坏消息对波动率的影响通常比好消息更大。这个在股票市场尤其明显。

为什么会这样?我个人的理解是:市场参与者的情绪和交易行为会自我强化。恐慌会传染,贪婪也会传染。这就导致了波动率不是恒定的,而是随时间变化的。

为什么普通模型不行?

传统的ARIMA模型假设方差是常数。这在很多工程领域没问题,但在金融领域就尴尬了。我举个例子:

# 模拟一个简单的AR(1)模型
import numpy as np
np.random.seed(42)
n = 1000
epsilon = np.random.normal(0, 1, n)
y = np.zeros(n)
for t in range(1, n):
    y[t] = 0.5 * y[t-1] + epsilon[t]

# 看看残差平方的自相关
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(epsilon**2, lags=20)

你会发现,如果用普通模型拟合金融数据,残差平方往往存在显著的自相关。这说明什么?说明方差不是常数,而是有记忆的。

核心洞察:金融时间序列的波动率本身就是一个值得建模的对象,而不是可以忽略的噪声。

波动率建模的直觉

我建议你这样理解:波动率就像人的情绪。平时很稳定,但遇到大事就会剧烈波动,而且需要一段时间才能平复。ARCH模型就是捕捉这种“情绪记忆”的工具。

具体来说,ARCH模型假设当前时刻的方差是过去若干期残差平方的线性组合。GARCH模型更进一步,把过去的方差也纳入考虑。说白了,就是让方差自己也有“记忆”。

个人经验:我在做期权定价时发现,用GARCH(1,1)模型估计的波动率曲面,比用历史波动率平滑出来的结果要准确得多。尤其是在市场转折点附近,GARCH模型的反应更及时。

一个简单的可视化框架

下面我用一张SVG图来展示波动率建模的核心逻辑。这张图我画了很多次,每次给学生讲都先从这个框架开始:

波动率建模核心逻辑框架 金融时间序列 收益率数据 特征检测 波动率聚集? 厚尾分布? 模型选择 ARCH / GARCH EGARCH等 应用场景 VaR计算 | 期权定价 | 风险管理 动态波动率估计 时变方差 / 条件方差 图1:从金融数据到波动率模型的核心流程

什么时候该用ARCH/GARCH?

我个人的经验是,只要你的数据满足以下条件,就该考虑波动率模型了:

  1. 残差平方存在自相关——这是最直接的信号。用Ljung-Box检验一下残差平方序列,p值小于0.05就别犹豫了。
  2. 数据存在明显的波动率聚集——画个收益率时序图,看看大波动是不是扎堆出现。
  3. 你关心的是风险而非收益——如果你在做VaR计算、期权定价或投资组合优化,那波动率模型就是你的必修课。

避坑指南:我曾经在一个项目中直接用GARCH模型拟合日度收益率,结果发现模型参数不稳定。后来才意识到,数据里有个别极端值(比如某天暴跌10%)严重影响了估计结果。建议在建模前先做异常值检测和处理。

一个小测试

你可以用下面这段代码快速检查你的数据是否适合用ARCH/GARCH模型:

import yfinance as yf
import matplotlib.pyplot as plt
from statsmodels.stats.diagnostic import acorr_ljungbox

# 下载数据
data = yf.download('AAPL', start='2020-01-01', end='2023-12-31')
returns = data['Close'].pct_change().dropna()

# 检查残差平方的自相关
lb_test = acorr_ljungbox(returns**2, lags=[10], return_df=True)
print(lb_test)

# 如果p值小于0.05,说明存在ARCH效应
if lb_test['lb_pvalue'].values[0] < 0.05:
    print("存在ARCH效应,建议使用波动率模型")
else:
    print("未检测到明显ARCH效应")

这段代码我用了很多次,简单直接。你试试看,大概率会发现金融数据都存在显著的ARCH效应。

总结一下

波动率建模不是锦上添花,而是金融时间序列分析的刚需。普通模型假设方差恒定,这在金融世界里基本不成立。ARCH/GARCH模型的出现,让我们能够捕捉波动率的动态变化,从而更准确地评估风险。

嗯,这一章就到这里。记住:波动率本身也是可以建模的,而且值得建模。下一章我们会深入ARCH模型的具体数学形式,到时候我会分享一些我在实际项目中踩过的坑。

一句话记住:金融数据的波动率不是噪声,而是信号。

专注资料整理