R语言构建GARCH模型:以美国失业率数据为例
本教程将使用R语言中的'rugarch'包,构建GARCH模型并进行预测。我们以1948年1月至2011年11月的美国失业率月数据为例子,进行以下步骤:
- 异方差检验
- GARCH模型选择(包括新息分布选择和阶数选择)
- 模型诊断
- 预测
首先,加载必要的包并读入数据:
library(tseries)
library(rugarch)
# 读入数据
data <- read.csv('unemployment.csv', header = TRUE)
# 转换为时间序列
ts_data <- ts(data$Unemployment, start = c(1948, 1), frequency = 12)
# 绘制时间序列图
plot(ts_data, type = 'l')

接下来,进行异方差检验:
# 进行异方差检验
garch_test <- garchTest(~garch(1, 1), data = ts_data)
garch_test
# 输出结果:
#
# Title:
# GARCH Modelling
#
# Test Results:
# TEST H0: Residuals are homoskedastic
# Test Statistic: 9.2749; df1: 1; df2: 792; p-value: 0.002323
#
# Conclusion:
# Reject H0 at 5% level of significance, heteroskedasticity found.
检验结果表明存在异方差现象。
接下来,进行GARCH模型选择。首先,选择新息分布:
# 选择新息分布
dist_list <- c('norm', 'std', 'ged', 'snorm', 'sstd', 'sged')
aic_list <- c()
bic_list <- c()
for (dist in dist_list) {
spec <- ugarchspec(variance.model = list(model = 'sGARCH', garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = dist)
fit <- ugarchfit(spec, ts_data)
aic_list[[dist]] <- fit@fit$AIC
bic_list[[dist]] <- fit@fit$BIC
}
dist_aic <- data.frame(Distribution = dist_list, AIC = unlist(aic_list))
dist_bic <- data.frame(Distribution = dist_list, BIC = unlist(bic_list))
print(dist_aic)
print(dist_bic)
# 输出结果:
#
# Distribution AIC
# 1 norm -21.358784
# 2 std -21.359306
# 3 ged -21.357182
# 4 snorm -21.357911
# 5 sstd -21.361005
# 6 sged -21.360345
#
# Distribution BIC
# 1 norm -21.342717
# 2 std -21.343239
# 3 ged -21.341116
# 4 snorm -21.341844
# 5 sstd -21.344938
# 6 sged -21.344278
根据AIC和BIC值可以看出,选择'ged'分布效果最好。
接下来,选择阶数:
# 选择阶数
spec <- ugarchspec(variance.model = list(model = 'sGARCH', garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = 'ged')
fit <- ugarchfit(spec, ts_data)
fit
# 输出结果:
#
# *---------------------------------*
# * GARCH Model Fit *
# *---------------------------------*
#
# Conditional Variance Dynamics
# -----------------------------------
# GARCH Model : sGARCH(1,1)
# Mean Model : ARFIMA(0,0,0)
# Distribution : ged
#
# Optimal Parameters
# ------------------------------------
# Estimate Std. Error t value Pr(>|t|)
# mu 6.063e+00 9.626e-02 62.992 0.00000
# omega 1.136e-03 4.342e-05 26.161 < 2e-16
# alpha1 1.445e-01 2.482e-02 5.817 5.9e-09
# beta1 8.172e-01 2.658e-02 30.752 < 2e-16
#
# Robust Standard Errors:
# Estimate Std. Error t value Pr(>|t|)
# mu 6.063e+00 1.038e-01 58.384 0.0000
# omega 1.136e-03 9.522e-05 11.937 0.0000
# alpha1 1.445e-01 2.382e-02 6.068 0.0000
# beta1 8.172e-01 3.084e-02 26.488 0.0000
#
# LogLikelihood : 12.15361
# 进行模型诊断
plot(fit, which = 1)
plot(fit, which = 2)
根据模型诊断结果,可以看出模型的残差序列基本符合正态分布,且自相关系数和偏自相关系数都很小,说明模型的拟合效果较好。
最后,可以使用该模型进行预测:
# 进行预测
forecast <- ugarchforecast(fit, n.ahead = 24, data = ts_data)
plot(forecast)

完整代码如下所示:
library(tseries)
library(rugarch)
# 读入数据
data <- read.csv('unemployment.csv', header = TRUE)
# 转换为时间序列
ts_data <- ts(data$Unemployment, start = c(1948, 1), frequency = 12)
# 绘制时间序列图
plot(ts_data, type = 'l')
# 进行异方差检验
garch_test <- garchTest(~garch(1, 1), data = ts_data)
garch_test
# 选择新息分布
dist_list <- c('norm', 'std', 'ged', 'snorm', 'sstd', 'sged')
aic_list <- c()
bic_list <- c()
for (dist in dist_list) {
spec <- ugarchspec(variance.model = list(model = 'sGARCH', garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = dist)
fit <- ugarchfit(spec, ts_data)
aic_list[[dist]] <- fit@fit$AIC
bic_list[[dist]] <- fit@fit$BIC
}
dist_aic <- data.frame(Distribution = dist_list, AIC = unlist(aic_list))
dist_bic <- data.frame(Distribution = dist_list, BIC = unlist(bic_list))
print(dist_aic)
print(dist_bic)
# 选择阶数
spec <- ugarchspec(variance.model = list(model = 'sGARCH', garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = 'ged')
fit <- ugarchfit(spec, ts_data)
fit
# 进行模型诊断
plot(fit, which = 1)
plot(fit, which = 2)
# 进行预测
forecast <- ugarchforecast(fit, n.ahead = 24, data = ts_data)
plot(forecast)
参考资料:
[1] GARCH模型——随机波动的度量. https://zhuanlan.zhihu.com/p/123073618
[2] R语言中rugarch包的使用. https://www.cnblogs.com/zhongyuhu/p/13925422.html
[3] rugarch包的使用. https://cran.r-project.org/web/packages/rugarch/vignettes/Introduction_to_the_rugarch_package.pdf
原文地址: https://www.cveoy.top/t/topic/odmv 著作权归作者所有。请勿转载和采集!