第四章:ARCH模型——波动率建模的起点
说实话,在接触金融时间序列之前,我一直以为波动率就是个标准差,算出来是多少就是多少。直到我在实盘交易中遇到一个问题:明明整体波动率不高,但某几天价格像发了疯一样上蹿下跳。这时候我才意识到——波动率是会变的,而且它有自己的规律。
ARCH模型,就是用来捕捉这种规律的。它全称是自回归条件异方差模型,名字挺绕口,但说白了就是:过去的波动会影响现在的波动。
4.1 什么是ARCH模型?
先问一个问题:为什么普通的时间序列模型搞不定波动率?
你看,传统的ARMA模型假设方差是常数。但金融数据不是这样——大涨大跌之后,往往跟着更大的波动。这种现象叫"波动率聚集"。我刚开始做量化时,用ARMA模型去预测收益率,结果预测区间老是偏小,就是因为没考虑方差的变化。
ARCH模型的核心思想是:当前时刻的方差,取决于过去几期的残差平方。用数学语言说:
ε_t = σ_t * z_t
σ_t² = α₀ + α₁*ε_{t-1}² + α₂*ε_{t-2}² + ... + α_q*ε_{t-q}²
其中z_t是白噪声,通常假设为标准正态分布。σ_t²就是条件方差,它随着时间变化。
关键点:ARCH模型不是预测收益率,而是预测收益率的波动率。它告诉我们:今天的不确定性有多大。
4.2 ARCH(1)模型——最简单的波动率模型
先从最简单的开始。ARCH(1)模型只依赖上一期的残差平方:
σ_t² = α₀ + α₁ * ε_{t-1}²
这里有两个参数:α₀是基础波动率,α₁是波动率的敏感度。α₁越大,说明过去的冲击对当前波动的影响越强。
我记得有一次帮朋友分析某只股票的日收益率,用ARCH(1)模型拟合,α₁估计出来是0.68。这意味着什么呢?如果昨天收益率波动很大(比如涨跌超过3%),今天的波动率会显著上升。这个结果很符合直觉——大事件之后市场需要时间消化。
实用技巧:ARCH(1)模型要求α₀ > 0,0 ≤ α₁ < 1。如果α₁接近1,说明波动率有很强的持续性,这时候可能需要考虑GARCH模型了。
4.3 ARCH(q)模型——更灵活的滞后结构
ARCH(1)虽然简单,但有时候不够用。比如,有些市场的波动率会持续好几天,只靠前一天的信息不够。这时候就需要ARCH(q)模型:
σ_t² = α₀ + α₁*ε_{t-1}² + α₂*ε_{t-2}² + ... + α_q*ε_{t-q}²
q是滞后阶数,表示用过去多少天的残差来预测今天的波动率。怎么选q?我个人的习惯是用AIC或BIC准则,但也要结合实际业务理解。
举个例子,我在做外汇波动率建模时,发现EUR/USD的波动率通常受过去3-5天的影响。用ARCH(5)模型效果不错。但如果是股票指数,有时候需要更长的滞后阶数。
避坑指南:我曾经犯过一个错误——为了追求拟合优度,把q设得很大(比如q=20)。结果模型参数太多,过拟合严重,样本外预测一塌糊涂。记住:ARCH模型的参数必须满足非负约束,而且所有α_i之和必须小于1,否则模型不稳定。
4.4 ARCH模型的估计方法
估计ARCH模型,最常用的方法是最大似然估计(MLE)。具体步骤是这样的:
- 先估计均值方程:通常用ARMA模型拟合收益率序列,得到残差ε_t
- 设定似然函数:假设z_t服从标准正态分布,写出条件似然函数
- 数值优化:用BFGS或Nelder-Mead等算法最大化似然函数
下面是一个用Python实现ARCH(1)模型估计的示例:
import numpy as np
from scipy.optimize import minimize
def arch1_log_likelihood(params, residuals):
alpha0, alpha1 = params
T = len(residuals)
sigma2 = np.zeros(T)
sigma2[0] = alpha0 / (1 - alpha1) # 无条件方差初始化
log_lik = 0
for t in range(1, T):
sigma2[t] = alpha0 + alpha1 * residuals[t-1]**2
log_lik += -0.5 * np.log(2 * np.pi * sigma2[t]) - 0.5 * residuals[t]**2 / sigma2[t]
return -log_lik
# 假设residuals是已经去均值后的收益率序列
# result = minimize(arch1_log_likelihood, [0.01, 0.1], args=(residuals,), method='L-BFGS-B', bounds=[(1e-6, None), (0, 1)])
这段代码看起来简单,但实际应用中要注意几点:
- 初始值的选择很重要,我一般用OLS估计的残差方差作为α₀的初值
- 边界约束必须加上,否则可能得到负的方差
- 如果数据量小,可以考虑用Bootstrap来获取参数的标准误
实战经验:在实际项目中,我通常不会手动写优化代码,而是直接用statsmodels库的ARCH模块。它内置了多种估计方法,还提供了诊断检验。但理解底层原理很重要——至少你得知道它在干什么。
4.5 知识体系总览
为了让你更直观地理解ARCH模型在整个波动率建模中的位置,我画了一张图:
从这张图可以看出,ARCH模型是波动率建模的核心环节。它向上承接收益率序列的特征分析,向下为VaR计算和风险对冲提供输入。我个人觉得,理解ARCH模型的关键不在于数学推导,而在于理解它为什么能捕捉波动率聚集现象。
4.6 小结
这一章我们聊了ARCH模型的基本概念、ARCH(1)和ARCH(q)的具体形式,以及估计方法。说白了,ARCH模型就是告诉你:波动率不是常数,它有自己的记忆。
嗯,这里要注意一点:ARCH模型虽然经典,但它也有局限性。比如它对正负冲击的处理是对称的,但实际市场中,利空消息往往比利好消息引发更大的波动。这个问题,我们会在后面的GARCH模型及其扩展中解决。
最后留个思考题:如果你用ARCH(1)模型拟合某只股票,发现α₁的估计值大于1,这说明什么?模型还能用吗?