当前位置: 首页 > article >正文

用Python实现时间序列模型实战——Day 13: 自回归条件异方差模型 (ARCH/GARCH)

一、学习内容
1. ARCH 模型的原理与公式

ARCH (Autoregressive Conditional Heteroskedasticity) 模型用于建模时间序列中的条件异方差现象,即时间序列的波动性随时间变化,而不是恒定的。ARCH 模型主要用于金融时间序列数据的波动性建模,适合处理金融市场中波动率“簇状”变化的情况。

ARCH 模型的基本思想是,序列的方差(或波动性)随着过去误差项的平方变化。

ARCH 模型的数学表达式为:

y_t = \mu + \epsilon_t, \quad \epsilon_t = \sigma_t z_t

\sigma_t^2 = \alpha_0 + \alpha_1 \epsilon_{t-1}^2 + \dots + \alpha_q \epsilon_{t-q}^2

其中:

  • y_t ​ 是时间 t 的观察值。
  • \mu  是常数项。
  • \epsilon_t ​ 是误差项,且 z_t​ 是标准正态分布的随机变量。
  • \sigma_t^2​ 是时间 t 的条件方差,表示波动性。
  • \alpha_0​ 是常数,\alpha_1, \dots, \alpha_q​ 是 ARCH 模型的系数。
2. GARCH 模型的扩展与应用

GARCH (Generalized Autoregressive Conditional Heteroskedasticity) 模型是 ARCH 模型的扩展,它考虑了波动率的自回归特性,不仅与过去的误差项平方有关,还与过去的波动率有关。

GARCH 模型的数学表达式为:

\sigma_t^2 = \alpha_0 + \sum_{i=1}^{q} \alpha_i \epsilon_{t-i}^2 + \sum_{j=1}^{p} \beta_j \sigma_{t-j}^2

其中:

  • \alpha_0 是常数项。
  • \alpha_i​ 是过去 \epsilon_t^2​ 的系数(ARCH 部分)。
  • \beta_j 是过去波动率 \sigma_{t-j}^2​ 的系数(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()

程序解释:  

  • 收益率的计算公式为:
  • \text{Returns} = \frac{\text{Price}_{t} - \text{Price}_{t-1}}{\text{Price}_{t-1}} \times 100

结果输出: 

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 模型的优点在于它能够同时捕捉短期和长期的波动性变化,因此广泛用于金融领域的风险管理和资产定价。


http://www.kler.cn/a/294062.html

相关文章:

  • 求A/B高精度值
  • 谷歌Gemini发布iOS版App,live语音聊天免费用!
  • 接口文档的编写
  • 前端知识点---this的用法 , this动态绑定(Javascript)
  • Linux系统常用操作与命令指南
  • JVM详解:类的加载过程
  • 《深度学习》OpenCV轮廓检测 轮廓近似 解析及实现
  • Linux date命令 日期格式化与计算
  • VScode 的下载安装及常见插件 + Git的下载和安装
  • 2024年四川省安全员A证证考试题库及四川省安全员A证试题解析
  • 数据结构(1)数据结构基础(单向链表)
  • 双雄并肩:Tesla P40 GTX 1650 AI工作站搭建指南
  • redis之缓存淘汰策略
  • Keysight U8031A DC power supply
  • MySQL表操作及约束
  • WSL 在 Windows 上删除已经安装的 Ubuntu | WSL 再次重装 Ubuntu | cv2.imshow() 弹窗支持
  • Java面试题-JavaEE框架中间件(二)
  • 基于Linux单片机的中心网关设计:实时监控传感器数据的触控屏可视化详细流程
  • Python的math库——常用数学函数全解析
  • 【软件测试】设计测试用例
  • 哈希算法是什么?
  • 四战搜索,抖音难造“百度”
  • 【Springboot系列】SpringBoot如何优雅地实现一个错误异常捕捉
  • 基于FPGA的开源项目:FOC/SHA/USB/JPEG等
  • 如何使用 Java Stream API 优化数据处理
  • 分类预测|基于粒子群优化轻量级梯度提升机算法数据预测Matlab程序PSO-LightGBM 多特征输入多类别输出