AI实现GARCH模型
编辑
0
2025-06-29

提示词
# Python代码
# 导入ARCH模型
from arch import arch_model
returns = df['收盘价'].pct_change().dropna() * 100 # 计算日收益率
# 拟合ARCH模型
model = arch_model(returns, mean="Zero",
vol="ARCH", p=1, q=0)
result = model.fit(disp="off")
# 打印模型摘要
result.summary()
仍然使用前面的期货行情数据,演示GARCH模型的拟合,请给出示例代码。
答案
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model
# 1. 数据准备
# 假设df是包含日期索引和'收盘价'列的DataFrame
# 计算日收益率(百分比形式)
# df['收益率'] = df['收盘价'].pct_change().dropna() * 100
# returns = df['收益率'].dropna()
# 2. 拟合GARCH(1,1)模型
# 使用均值方程(Constant)和GARCH波动率模型
model = arch_model(
returns,
mean='Constant', # 常数均值模型
vol='Garch', # GARCH波动率模型
p=1, q=1, # GARCH(1,1)模型
dist='t' # 使用t分布考虑厚尾特征
)
# 拟合模型
result = model.fit(disp='off', show_warning=False)
# 3. 输出模型结果
print("\n" + "="*80)
print("GARCH(1,1)模型拟合结果")
print("="*80)
print(result.summary())
# 提取关键参数
omega = result.params['omega']
alpha = result.params['alpha[1]']
beta = result.params['beta[1]']
nu = result.params['nu'] # t分布自由度
# 4. 添加条件波动率到DataFrame
df['条件波动率'] = result.conditional_volatility
# 5. 可视化结果
plt.figure(figsize=(14, 10))
# 5.1 原始价格序列
plt.subplot(3, 1, 1)
plt.plot(df['收盘价'], label='收盘价')
plt.title('期货价格走势')
plt.ylabel('价格')
plt.grid(alpha=0.3)
plt.legend()
# 5.2 收益率与条件波动率
plt.subplot(3, 1, 2)
plt.plot(returns, label='日收益率', alpha=0.7)
plt.plot(df['条件波动率'], label='条件波动率', color='red')
plt.title('收益率与波动率')
plt.ylabel('百分比')
plt.grid(alpha=0.3)
plt.legend()
# 5.3 波动率聚类现象
plt.subplot(3, 1, 3)
plt.scatter(returns, returns.shift(1), alpha=0.5)
plt.title('波动率聚类现象(今日收益率 vs 昨日收益率)')
plt.xlabel('昨日收益率 (%)')
plt.ylabel('今日收益率 (%)')
plt.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('garch_results.png', dpi=300)
plt.show()
# 6. 模型诊断
# 6.1 标准化残差分析
std_resid = result.resid / result.conditional_volatility
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.hist(std_resid, bins=50, density=True, alpha=0.7)
plt.title('标准化残差分布')
plt.grid(alpha=0.3)
plt.subplot(2, 2, 2)
plt.scatter(std_resid, std_resid.shift(1), alpha=0.5)
plt.title('残差自相关')
plt.xlabel('t-1期残差')
plt.ylabel('t期残差')
plt.grid(alpha=0.3)
plt.subplot(2, 2, 3)
plt.scatter(result.conditional_volatility, np.abs(returns), alpha=0.5)
plt.title('波动率与绝对收益率')
plt.xlabel('条件波动率')
plt.ylabel('|收益率|')
plt.grid(alpha=0.3)
plt.subplot(2, 2, 4)
plt.plot(std_resid**2, alpha=0.7)
plt.title('标准化残差平方')
plt.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('garch_diagnostics.png', dpi=300)
plt.show()
# 7. 波动率预测
# 预测未来5天的波动率
forecast = result.forecast(horizon=5)
future_vol = np.sqrt(forecast.variance.iloc[-1])
print("\n未来波动率预测:")
print(future_vol)
# 8. 高级分析 - 滚动波动率预测
rolling_vol = pd.Series(index=returns.index, dtype=float)
window_size = 252 # 1年交易日的滚动窗口
for i in range(window_size, len(returns)):
train_data = returns.iloc[i-window_size:i]
model = arch_model(train_data, mean='Constant', vol='Garch', p=1, q=1)
res = model.fit(disp='off', show_warning=False)
rolling_vol.iloc[i] = res.conditional_volatility.iloc[-1]
# 可视化滚动预测
plt.figure(figsize=(12, 6))
plt.plot(returns, label='收益率', alpha=0.5)
plt.plot(rolling_vol, label='滚动波动率预测', color='red')
plt.title('滚动GARCH波动率预测(252天窗口)')
plt.ylabel('百分比')
plt.grid(alpha=0.3)
plt.legend()
plt.tight_layout()
plt.savefig('rolling_garch_volatility.png', dpi=300)
plt.show()
# 9. 模型参数稳定性检验
print("\n模型参数稳定性:")
print(f"ARCH效应系数 (α): {alpha:.4f}")
print(f"GARCH效应系数 (β): {beta:.4f}")
print(f"持续性参数 (α+β): {alpha+beta:.4f}")
print(f"t分布自由度 (ν): {nu:.2f}")
# 10. 模型解释
print("\n模型解释:")
if alpha + beta < 1:
print("→ 模型稳定,波动率冲击会随时间衰减")
else:
print("→ 模型可能不稳定,波动率冲击具有持续性")
if alpha > 0.1:
print("→ 市场对短期冲击敏感,波动率响应强烈")
elif alpha < 0.05:
print("→ 市场对短期冲击反应温和")
if beta > 0.85:
print("→ 波动率高度持续性,历史波动率影响大")
if nu < 5:
print("→ 收益率分布厚尾特征明显,极端事件概率高")
结果:
- 0
- 0
-
赞助
支付宝
微信
-
分享