第四章: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)。具体步骤是这样的:

  1. 先估计均值方程:通常用ARMA模型拟合收益率序列,得到残差ε_t
  2. 设定似然函数:假设z_t服从标准正态分布,写出条件似然函数
  3. 数值优化:用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模型知识体系 波动率建模 ARCH模型 ARCH(1)模型 σ² = α₀ + α₁ε²_{t-1} ARCH(q)模型 σ² = α₀ + Σα_iε²_{t-i} 模型估计 最大似然估计(MLE) 波动率预测 VaR计算 风险对冲

从这张图可以看出,ARCH模型是波动率建模的核心环节。它向上承接收益率序列的特征分析,向下为VaR计算和风险对冲提供输入。我个人觉得,理解ARCH模型的关键不在于数学推导,而在于理解它为什么能捕捉波动率聚集现象。

4.6 小结

这一章我们聊了ARCH模型的基本概念、ARCH(1)和ARCH(q)的具体形式,以及估计方法。说白了,ARCH模型就是告诉你:波动率不是常数,它有自己的记忆

嗯,这里要注意一点:ARCH模型虽然经典,但它也有局限性。比如它对正负冲击的处理是对称的,但实际市场中,利空消息往往比利好消息引发更大的波动。这个问题,我们会在后面的GARCH模型及其扩展中解决。

最后留个思考题:如果你用ARCH(1)模型拟合某只股票,发现α₁的估计值大于1,这说明什么?模型还能用吗?


专注资料整理