时间序列算法(2): ARCH (自回归条件异方差)
ARCH (自回归条件异方差) 时间序列分析
ARCH (Autoregressive Conditional Heteroskedasticity) 模型是由 Engle(1982)提出的一种非线性时间序列模型,专门用于捕捉金融时间序列中的波动聚集现象。
ARCH 模型的基本原理
ARCH 模型的核心思想是将时间序列的条件方差建模为过去观测值平方的函数,从而捕捉金融市场中常见的波动聚集特性。
ARCH(q) 模型的数学表达式
ARCH(q) 模型可以表达为:
- 均值方程:\(r_t = \mu_t + \varepsilon_t\)
- 条件方差方程:\(\sigma_t^2 = \alpha_0 + \alpha_1\varepsilon_{t-1}^2 + \alpha_2\varepsilon_{t-2}^2 + ... + \alpha_q\varepsilon_{t-q}^2\)
- 误差项:\(\varepsilon_t = \sigma_t z_t\),其中 \(z_t\) 是独立同分布的随机变量,通常假设服从标准正态分布
其中的参数限制条件:
- \(\alpha_0 > 0\)(保证方差为正)
- \(\alpha_i \geq 0\) 对所有 \(i = 1, 2, ..., q\)(保证方差非负)
- \(\sum_{i=1}^q \alpha_i < 1\)(保证方差平稳)
小数据示例
假设我们有一个简单的 ARCH(1) 模型:
\(r_t = 0.01 + \varepsilon_t\)
\(\sigma_t^2 = 0.05 + 0.7\varepsilon_{t-1}^2\)
\(\varepsilon_t = \sigma_t z_t\),其中 \(z_t \sim N(0,1)\)
我们可以手动计算几个时间点的值:
-
假设 \(\varepsilon_0 = 0\)
-
在 \(t=1\) 时:
- \(\sigma_1^2 = 0.05 + 0.7 \times 0^2 = 0.05\)
- 假设 \(z_1 = 1.2\),则 \(\varepsilon_1 = \sqrt{0.05} \times 1.2 \approx 0.265\)
- \(r_1 = 0.01 + 0.265 = 0.275\)
-
在 \(t=2\) 时:
- \(\sigma_2^2 = 0.05 + 0.7 \times 0.265^2 \approx 0.099\)
- 假设 \(z_2 = -0.8\),则 \(\varepsilon_2 = \sqrt{0.099} \times (-0.8) \approx -0.252\)
- \(r_2 = 0.01 + (-0.252) = -0.242\)
Python 实现
下面使用 arch
库来模拟和估计 ARCH 模型:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model
import yfinance as yf
from datetime import datetime, timedelta
# 1. 模拟 ARCH(1) 过程
np.random.seed(123)
n = 1000
# 模型参数
omega = 0.05
alpha = 0.7
# 初始化
epsilon = np.zeros(n)
sigma2 = np.zeros(n)
returns = np.zeros(n)
# 模拟 ARCH(1) 过程
for t in range(1, n):
sigma2[t] = omega + alpha * epsilon[t-1]**2
epsilon[t] = np.sqrt(sigma2[t]) * np.random.normal(0, 1)
returns[t] = 0.01 + epsilon[t]
# 2. 可视化模拟数据
plt.figure(figsize=(12, 6))
plt.subplot(211)
plt.plot(returns)
plt.title('模拟的ARCH(1)收益率')
plt.ylabel('收益率')
plt.subplot(212)
plt.plot(np.sqrt(sigma2))
plt.title('模拟的条件标准差')
plt.ylabel('条件标准差')
plt.tight_layout()
plt.show()
# 3. 使用arch库估计ARCH模型
model = arch_model(returns, vol='ARCH', p=1, mean='Constant')
results = model.fit(disp='off')
print(results.summary())
# 4. 使用真实数据演示 - 获取上证指数数据
end_date = datetime.now()
start_date = end_date - timedelta(days=365*5) # 5年数据
# 尝试使用yfinance获取上证指数数据
df = yf.download('^SSEC', start=start_date, end=end_date)
returns = 100 * df['Adj Close'].pct_change().dropna()
# 估计ARCH模型
model = arch_model(returns, vol='ARCH', p=1, mean='Constant')
results = model.fit(disp='off')
print(results.summary())
# 可视化拟合结果
plt.figure(figsize=(12, 8))
plt.subplot(311)
plt.plot(returns)
plt.title('上证指数日收益率')
plt.subplot(312)
plt.plot(results.conditional_volatility)
plt.title('估计的条件波动率')
plt.subplot(313)
plt.plot(results.std_resid)
plt.title('标准化残差')
plt.tight_layout()
plt.show()
ARCH 模型的优缺点
优点:
- 能够捕捉金融时间序列中的波动聚集现象
- 模拟了"大变动后面跟着大变动,小变动后面跟着小变动"的特性
- 考虑了条件异方差,使预测区间更准确
缺点:
- 无法捕捉杠杆效应(负面冲击通常带来更大的波动)
- 在高持续性波动的情况下,需要较多的参数
- 在实践中往往被更复杂的GARCH模型取代
扩展版本的ARCH模型包括GARCH、EGARCH、TGARCH等,能够解决上述一些局限性。