本教程将使用R语言中的'rugarch'包,构建GARCH模型并进行预测。我们以1948年1月至2011年11月的美国失业率月数据为例子,进行以下步骤:

  1. 异方差检验
  2. GARCH模型选择(包括新息分布选择和阶数选择)
  3. 模型诊断
  4. 预测

首先,加载必要的包并读入数据:

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')

unemployment_ts

接下来,进行异方差检验:

# 进行异方差检验
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)

unemployment_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

R语言构建GARCH模型:以美国失业率数据为例

原文地址: https://www.cveoy.top/t/topic/odmv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录