用Python实现时间序列模型实战——Day 13: 自回归条件异方差模型 (ARCH/GARCH)
一、学习内容
1. ARCH 模型的原理与公式
ARCH (Autoregressive Conditional Heteroskedasticity) 模型用于建模时间序列中的条件异方差现象,即时间序列的波动性随时间变化,而不是恒定的。ARCH 模型主要用于金融时间序列数据的波动性建模,适合处理金融市场中波动率“簇状”变化的情况。
ARCH 模型的基本思想是,序列的方差(或波动性)随着过去误差项的平方变化。
ARCH 模型的数学表达式为:
其中:
- 是时间 的观察值。
- 是常数项。
- 是误差项,且 是标准正态分布的随机变量。
- 是时间 的条件方差,表示波动性。
- 是常数, 是 ARCH 模型的系数。
2. GARCH 模型的扩展与应用
GARCH (Generalized Autoregressive Conditional Heteroskedasticity) 模型是 ARCH 模型的扩展,它考虑了波动率的自回归特性,不仅与过去的误差项平方有关,还与过去的波动率有关。
GARCH 模型的数学表达式为:
其中:
- 是常数项。
- 是过去 的系数(ARCH 部分)。
- 是过去波动率 的系数(GARCH 部分)。
GARCH 模型在金融时间序列中应用广泛,特别是用于预测资产的波动性。与 ARCH 模型不同,GARCH 模型能够更好地捕捉时间序列中长期的波动性行为。
二、实战案例
我们将使用 arch
库对实际的金融数据进行 GARCH 模型的建模,并对未来的波动性进行预测。
1. 数据加载与处理
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model
import yfinance as yf
# 获取金融时间序列数据(例如,S&P 500 指数)
data = yf.download('^GSPC', start='2015-01-01', end='2023-01-01')
程序解释:
- 我们使用
yfinance
库获取 S&P 500 指数的历史数据,计算每日收益率。
2. 收益率计算
# 计算每日收益率
data['Returns'] = 100 * data['Adj Close'].pct_change().dropna()
# 绘制原始收盘价格与收益率
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(data['Adj Close'])
plt.title('S&P 500 Adjusted Close Prices')
plt.subplot(2, 1, 2)
plt.plot(data['Returns'])
plt.title('S&P 500 Daily Returns')
plt.tight_layout()
plt.show()
程序解释:
- 收益率的计算公式为:
结果输出:
3. GARCH(1,1) 模型构建
# 构建 GARCH(1,1) 模型
model = arch_model(data['Returns'].dropna(), vol='Garch', p=1, q=1)
程序解释:
- 使用
arch
库构建 GARCH(1,1) 模型,其中p=1
表示 ARCH 部分的阶数,q=1
表示 GARCH 部分的阶数。
4. 模型拟合与输出
garch_results = model.fit()
# 输出模型结果摘要
print(garch_results.summary())
程序解释:
- 模型的拟合结果通过
garch_results.summary()
输出,包含模型的系数估计和相关统计信息。
结果输出:
Iteration: 1, Func. Count: 6, Neg. LLF: 20667.16102392424
Iteration: 2, Func. Count: 16, Neg. LLF: 11556.186315949726
Iteration: 3, Func. Count: 25, Neg. LLF: 4392.78439962319
Iteration: 4, Func. Count: 32, Neg. LLF: 2695.7348659192867
Iteration: 5, Func. Count: 38, Neg. LLF: 5829.16018261846
Iteration: 6, Func. Count: 44, Neg. LLF: 2620.6882024298106
Iteration: 7, Func. Count: 50, Neg. LLF: 2619.537212678392
Iteration: 8, Func. Count: 55, Neg. LLF: 2619.532852046368
Iteration: 9, Func. Count: 60, Neg. LLF: 2619.532845407908
Iteration: 10, Func. Count: 64, Neg. LLF: 2619.532845407653
Optimization terminated successfully (Exit mode 0)
Current function value: 2619.532845407908
Iterations: 10
Function evaluations: 64
Gradient evaluations: 10
Constant Mean - GARCH Model Results
==============================================================================
Dep. Variable: Returns R-squared: 0.000
Mean Model: Constant Mean Adj. R-squared: 0.000
Vol Model: GARCH Log-Likelihood: -2619.53
Distribution: Normal AIC: 5247.07
Method: Maximum Likelihood BIC: 5269.50
No. Observations: 2013
Date: Fri, Sep 06 2024 Df Residuals: 2012
Time: 13:21:16 Df Model: 1
Mean Model
==========================================================================
coef std err t P>|t| 95.0% Conf. Int.
--------------------------------------------------------------------------
mu 0.0813 1.654e-02 4.919 8.717e-07 [4.892e-02, 0.114]
Volatility Model
============================================================================
coef std err t P>|t| 95.0% Conf. Int.
----------------------------------------------------------------------------
omega 0.0385 1.079e-02 3.569 3.580e-04 [1.736e-02,5.966e-02]
alpha[1] 0.2130 3.672e-02 5.800 6.615e-09 [ 0.141, 0.285]
beta[1] 0.7661 3.225e-02 23.752 1.049e-124 [ 0.703, 0.829]
============================================================================
Covariance estimator: robust
5. 波动性预测
# 获取波动性预测
forecast = garch_results.forecast(horizon=5)
# 获取预测的波动性(条件方差)
predicted_variance = forecast.variance.iloc[-1] # 提取最后一个预测值
# 重新设置时间索引为未来的日期
last_date = data.index[-1]
predicted_dates = pd.date_range(last_date, periods=5, freq='B') # 使用未来5个工作日
# 绘制预测的波动性
plt.figure(figsize=(10, 6))
plt.plot(predicted_dates, predicted_variance, color='blue', label='Predicted Variance (Volatility)')
plt.title('GARCH Model Predicted Variance (Volatility)')
plt.xlabel('Date')
plt.ylabel('Predicted Variance')
plt.legend()
plt.grid(True)
plt.show()
程序解释:
- 使用模型对未来 5 天的波动性进行预测,并绘制预测的波动性。
结果输出:
三、结果分析
1. S&P 500 收盘价格与收益率
- 上图展示了 S&P 500 指数的历史收盘价格,随着时间的推移,指数显示出长期的上升趋势。
- 下图展示了每日的收益率,收益率波动较大,符合金融市场的特点。
2. GARCH 模型拟合结果
- GARCH 模型输出了各个系数的估计值及其显著性,通常 α\alphaα 和 β\betaβ 都应该是正的,并且它们的和应小于 1,表明模型是稳定的。
3. 波动性预测
- 波动性预测结果展示了未来 5 天的条件方差(波动性)的变化,预测的波动性反映了市场未来的风险水平。
四、总结
通过使用 ARCH 和 GARCH 模型,我们能够对金融时间序列的波动性进行有效建模和预测。GARCH 模型的优点在于它能够同时捕捉短期和长期的波动性变化,因此广泛用于金融领域的风险管理和资产定价。