第四章: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) — σ²_t = ω + α * ε²_{t-1} 性质:尖峰厚尾、波动聚集 估计:MLE(最大似然) 预测:短期有效,长期收敛 应用:风险度量、期权定价、组合管理

这张图把ARCH模型的整个流程串起来了:从发现问题(波动聚集),到检验(Ljung-Box),再到建模(ARCH(1)),最后到估计和预测。我个人建议你把这个框架记在脑子里,以后学GARCH、EGARCH这些扩展模型时,会发现它们都是在这个基础上加东西。

最后提醒一句:

ARCH模型虽然经典,但它有个缺点——为了捕捉波动率的长记忆性,需要很高的阶数(比如ARCH(10))。这时候参数太多,估计不稳定。后来出现的GARCH模型就是专门解决这个问题的。不过那是下一章的内容了。


公众号:蓝海资料掘金营,微信deep3321