3. ARCH模型:波动率建模的起点

说实话,我刚入行做量化的时候,最头疼的就是波动率。价格预测好歹有个趋势可循,波动率这东西,忽大忽小,像个醉汉走路。直到我遇到了ARCH模型,才算是找到了门道。

ARCH模型,全称是自回归条件异方差模型。名字挺唬人,说白了就是:波动率不是随机的,它有自己的记忆。大的波动后面往往跟着大的波动,小的波动后面跟着小的波动——这就是所谓的“波动率聚集”现象。

核心思想:今天的波动率,取决于过去几天的“冲击”(即残差平方)。

3.1 为什么需要ARCH模型?

传统的计量模型,比如ARIMA,假设方差是恒定的。但金融数据不是这样。你想想看,2008年金融危机时,波动率是平时的好几倍。如果用恒定方差去建模,那预测结果肯定一塌糊涂。

我在做期权定价时遇到过这个问题。用BS公式算出来的价格,跟市场实际价格总是差一截。后来才发现,BS公式假设波动率不变,但市场波动率是时变的。嗯,这就是ARCH模型要解决的问题。

3.2 ARCH模型原理

ARCH(q)模型由两部分组成:

  • 均值方程:描述价格或收益率的平均水平,比如AR模型
  • 方差方程:描述波动率如何随时间变化

方差方程长这样:

σ²_t = ω + α₁·ε²_{t-1} + α₂·ε²_{t-2} + ... + α_q·ε²_{t-q}

其中:

  • σ²_t 是第t期的条件方差(即波动率平方)
  • ω 是常数项(长期平均波动率)
  • ε²_{t-i} 是第t-i期的残差平方(即过去的冲击)
  • α_i 是系数,表示过去冲击对当前波动率的影响程度

说白了,ARCH模型就是用过去的“意外”来预测今天的波动率。如果昨天市场大跌(残差很大),那么今天的波动率就会偏高。

我的经验:α系数之和越接近1,波动率的持续性越强。如果α之和大于1,模型就不稳定了——这种情况我在高频数据中遇到过几次,需要特别小心。

3.3 阶数选择:到底用几阶?

选择ARCH模型的阶数q,说白了就是决定“用过去几天的冲击来预测今天的波动率”。

我个人习惯用两种方法:

  1. ACF/PACF图:看残差平方的自相关函数。如果残差平方在滞后q阶后截尾,那就选q阶。
  2. 信息准则:AIC或BIC,选值最小的那个。

举个例子,我做过一个沪深300的波动率模型:

# 计算残差平方的ACF
from statsmodels.graphics.tsaplots import plot_acf
import matplotlib.pyplot as plt

# 假设returns是收益率序列
residuals = returns - returns.mean()
squared_resid = residuals ** 2

plot_acf(squared_resid, lags=20)
plt.show()

如果ACF图显示滞后1阶、2阶显著,那ARCH(2)可能就是合适的选择。不过要注意,阶数太高容易过拟合。我一般不超过5阶。

避坑指南:我曾经在选阶数时一味追求低AIC,结果选了ARCH(12)。模型参数太多,估计不稳定,预测效果反而更差。记住:简单模型往往更可靠。

3.4 模型估计:怎么算出参数?

ARCH模型的估计用的是最大似然估计(MLE)。原理不复杂:找到一组参数,使得观测数据出现的概率最大。

实际操作中,我们直接用Python的arch库:

from arch import arch_model

# 拟合ARCH(2)模型
model = arch_model(returns, vol='ARCH', p=2)
result = model.fit()

# 查看结果
print(result.summary())

输出结果会包含:

  • ω、α₁、α₂的估计值
  • 标准误和p值
  • 对数似然值、AIC、BIC等

我一般先看α系数的显著性。如果p值大于0.05,说明这个滞后项不显著,可以考虑去掉。

3.5 波动率预测:实战应用

模型建好了,怎么用?很简单,用forecast方法:

# 预测未来5天的波动率
forecasts = result.forecast(horizon=5)
print(forecasts.variance[-1:])

预测结果是一个DataFrame,每一列对应未来第几天的波动率预测值。

我在实盘交易中是这样用的:

  • 如果预测波动率上升,就降低仓位或买入期权对冲
  • 如果预测波动率下降,就适当加仓或卖出期权收权利金

一个小技巧:不要只看点预测,要看预测区间。ARCH模型能给出波动率的置信区间,这对风险管理特别有用。我每次做风控报告,都会附上波动率的上下界。

3.6 知识体系总览

下面这张图,是我自己总结的ARCH模型知识框架。你看一眼,心里就有数了:

ARCH模型知识体系 ARCH模型核心 模型原理 阶数选择 模型估计 波动率预测 • 条件异方差 • 波动率聚集 • 方差方程 • ACF/PACF图 • AIC/BIC准则 • 残差平方分析 • 最大似然估计 • arch库使用 • 参数显著性 • 点预测 • 置信区间 • 风险管理应用 从理论到实战的完整链路

3.7 一个完整的例子

最后,我给你看一个完整的实战代码。这是我以前做的一个项目,用ARCH模型预测上证50ETF的波动率:

import pandas as pd
import numpy as np
from arch import arch_model
import matplotlib.pyplot as plt

# 加载数据(假设已有)
# data = pd.read_csv('shanghai50.csv', index_col=0, parse_dates=True)
# returns = data['close'].pct_change().dropna() * 100

# 模拟数据做演示
np.random.seed(42)
n = 1000
returns = np.random.normal(0, 1, n) * 0.5

# 拟合ARCH(2)模型
model = arch_model(returns, vol='ARCH', p=2, dist='normal')
result = model.fit(disp='off')

print(result.summary())

# 预测未来10天
forecasts = result.forecast(horizon=10)
pred_var = forecasts.variance.iloc[-1]
pred_vol = np.sqrt(pred_var)

print("\n未来10天波动率预测(标准差%):")
print(pred_vol)

# 可视化
plt.figure(figsize=(10, 5))
plt.plot(result.conditional_volatility, label='条件波动率', color='blue')
plt.axhline(y=returns.std(), color='red', linestyle='--', label='无条件波动率')
plt.legend()
plt.title('ARCH模型 - 条件波动率 vs 无条件波动率')
plt.show()

你看,代码其实不复杂。关键是理解背后的逻辑:波动率不是常数,它有自己的规律。ARCH模型就是帮我们抓住这个规律的工具。

总结一下:ARCH模型是波动率建模的基石。它告诉我们,过去的冲击会影响今天的波动率。虽然现在有更复杂的GARCH、EGARCH模型,但ARCH的思想贯穿始终。把这个搞懂了,后面的路就好走了。


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