第四章:ARCH模型——波动率预测的起点
说实话,我刚开始做金融时间序列分析的时候,最头疼的就是波动率。价格序列还好说,均值回归、趋势这些都有套路。但波动率这东西,它就像个脾气古怪的老头——有时候安静得像一潭死水,有时候突然暴跳如雷。而且最要命的是,这种"暴跳"往往还会持续一段时间。
嗯,这就是我们为什么要学ARCH模型。它是我个人认为,打开波动率预测大门的第一把钥匙。
4.1 什么是ARCH效应?怎么检验?
先问个问题:你见过股票收益率序列吗?如果画出来,你会发现一个现象——大波动后面往往跟着大波动,小波动后面跟着小波动。这就是所谓的"波动率聚集"现象。
ARCH效应,说白了就是:过去的波动会影响未来的波动。这不是玄学,是数据告诉我们的规律。
那怎么检验呢?我常用的方法是Ljung-Box检验,不过不是对收益率本身,而是对平方收益率做检验。
核心思路:
- 如果收益率序列本身没有自相关,但平方收益率有自相关
- 那就说明波动率存在聚集效应
- 也就是存在ARCH效应
我在项目中遇到过这样的情况:某只股票的日收益率看起来完全是白噪声,但平方收益率却表现出明显的自相关。这就是典型的ARCH效应,意味着我们可以用过去的波动信息来预测未来的波动。
实操小技巧:
做Ljung-Box检验时,滞后期数不要选太少。我个人习惯选10-20期,太少了可能漏掉长记忆效应。
import numpy as np
import pandas as pd
from statsmodels.stats.diagnostic import acorr_ljungbox
# 假设 returns 是收益率序列
squared_returns = returns ** 2
# 对平方收益率做Ljung-Box检验
lb_test = acorr_ljungbox(squared_returns, lags=[10, 15, 20], return_df=True)
print(lb_test)
如果p值小于0.05,就说明存在ARCH效应。嗯,这时候就可以放心地建ARCH模型了。
4.2 ARCH(1)模型:定义与性质
ARCH(1)模型是最简单的ARCH模型。它的数学形式是这样的:
r_t = μ + ε_t
ε_t = σ_t * z_t
σ_t² = ω + α * ε_{t-1}²
其中:
- r_t 是t时刻的收益率
- μ 是均值(通常假设为0)
- z_t 是白噪声(标准正态分布)
- σ_t² 是条件方差
- ω > 0, α ≥ 0 是参数
这个模型的核心思想是:今天的波动率,取决于昨天的冲击(残差)大小。如果昨天有个大波动(ε_{t-1}很大),那么今天的波动率就会变大。
注意:
为了保证模型平稳,需要满足 α < 1。如果 α ≥ 1,波动率会爆炸——这在现实中很少见,但确实存在(比如某些加密货币)。
我记得有一次做外汇数据,α估计出来是0.98,差点就超过1了。这说明外汇市场的波动持续性很强,一个冲击的影响会持续很久。
ARCH(1)模型有几个重要性质:
- 无条件方差:Var(ε_t) = ω / (1 - α),前提是α < 1
- 尖峰厚尾:即使z_t是正态分布,ε_t的分布也是尖峰厚尾的——这很符合金融数据的特征
- 波动率聚集:大波动后面跟着大波动,小波动后面跟着小波动
4.3 参数估计:最大似然估计(MLE)
估计ARCH模型的参数,最常用的方法是最大似然估计(MLE)。说白了,就是找一组参数,让观测到的数据出现的概率最大。
对于ARCH(1)模型,似然函数是这样的:
L(ω, α) = Π (1 / √(2πσ_t²)) * exp(-ε_t² / (2σ_t²))
取对数后:
log L = -0.5 * Σ [log(2π) + log(σ_t²) + ε_t² / σ_t²]
实际编程时,我们通常用数值优化来求解。我习惯用scipy.optimize.minimize或者直接用arch库。
避坑指南:
我曾经在优化时遇到过参数跑到负值的情况。解决办法是:对参数做变换,比如用exp(θ)代替ω和α,保证它们非负。
from arch import arch_model
# 拟合ARCH(1)模型
model = arch_model(returns, vol='ARCH', p=1)
result = model.fit()
# 查看结果
print(result.summary())
输出结果会包含参数估计值、标准误、p值等信息。我个人习惯先看α的p值,如果显著(p<0.05),说明ARCH效应确实存在。
4.4 ARCH模型的预测
模型建好了,怎么用?当然是做预测。
对于ARCH(1)模型,向前一步预测很简单:
σ_{t+1}² = ω + α * ε_t²
也就是说,用今天的残差平方,就能预测明天的波动率。
多步预测呢?嗯,这里要注意:
- 一步预测:直接用公式,准确度较高
- 多步预测:会收敛到无条件方差 ω/(1-α)
为什么会这样?因为多步预测时,我们不知道未来的残差,只能用期望值代替。而残差平方的期望就是无条件方差。
实际应用中的经验:
我一般只做1-5步的短期预测。超过10步,预测值基本就变成一条直线了——没什么参考价值。
# 做预测
forecasts = result.forecast(horizon=5)
print(forecasts.variance.iloc[-1])
输出的是未来5期的条件方差预测值。注意,这是方差,如果要得到波动率(标准差),记得开根号。
知识体系总览
下面这张图,是我自己总结的ARCH模型知识框架。你可以把它当作学习路线图:
这张图把ARCH模型的整个流程串起来了:从发现问题(波动聚集),到检验(Ljung-Box),再到建模(ARCH(1)),最后到估计和预测。我个人建议你把这个框架记在脑子里,以后学GARCH、EGARCH这些扩展模型时,会发现它们都是在这个基础上加东西。
最后提醒一句:
ARCH模型虽然经典,但它有个缺点——为了捕捉波动率的长记忆性,需要很高的阶数(比如ARCH(10))。这时候参数太多,估计不稳定。后来出现的GARCH模型就是专门解决这个问题的。不过那是下一章的内容了。
公众号:蓝海资料掘金营,微信deep3321