在 R 中使用 ARMA-GARCH 预测时间序列

机器算法验证 r 预测 有马 加奇
2022-03-15 16:20:33

我正在使用rugarch包来估计和预测我的时间序列。首先,我估计一个 ARMA 模型:

y <- readRDS("y.rds")
y.test <- readRDS("y-test.rds")
m1.mean.model <- auto.arima(y, allowmean=F )
ar.comp <- arimaorder(m1.mean.model)[1]
ma.comp <- arimaorder(m1.mean.model)[3]

但通常误差项显示 GARCH 过程的典型特征。随后,我拟合了一个 ARMA-GARCH(1,1) 过程,并对测试数据进行了一步预测:

library(rugarch)
model.garch = ugarchspec(mean.model=list(armaOrder=c(ar.comp,ma.comp)),
                         variance.model=list(garchOrder=c(1,1)),
                         distribution.model = "std")
model.garch.fit = ugarchfit(data=c(y,y.test), spec=model.garch, out.sample = length(y.test),  solver = 'hybrid' )


modelfor=ugarchforecast(model.garch.fit, data = NULL, n.ahead = 1, n.roll
                        = length(y.test), out.sample = length(y.test))

results1 <- modelfor@forecast$seriesFor[1,] + modelfor@forecast$sigmaFor[1,]
results2 <- modelfor@forecast$seriesFor[1,] - modelfor@forecast$sigmaFor[1,]

ylim <- c(min(y.test), max(y.test))
plot.ts(y.test , col="blue", ylim=ylim)
par(new=TRUE)
modelfor@forecast$seriesFor[1,]  %>% plot.ts(ylim=ylim)
par(new=TRUE)
plot.ts(results1, col="red", ylim=ylim)
par(new=TRUE)
plot.ts(results2, col="red", ylim=ylim)

蓝色:观察到,黑色:平均预测,红色:平均预测 + 1 sigma 测试数据的波动率预测

这就是我感到困惑的地方。查看均值 ( modelfor@forecast$seriesFor, black) 的预测,它们几乎从零开始移动。但是,如果我添加sigma它,它会非常接近。事实上,sigma(第二张图)的预测表明它正在捕捉变化的方差。我的问题是,鉴于我们知道方差预测进入了均值预测方程(例如本书的第 204 页),为什么我的预测如此糟糕?

数据:y-test.rds , y.rds

1个回答

众所周知,获得金融时间序列的准确点预测非常困难。这与金融市场的性质有关;参与者寻找利用任何可预测性的机会,并在他们这样做的同时将其删除(资产预期盈利能力的供需资产价格变化)。这在活跃的市场中发生得非常快,因此可预测性不会持续足够长的时间,模型无法捕捉到它。因此,金融时间序列通常表现得像具有一些异方差性的随机游走。

同时,金融时间序列的波动性更容易预测,因为显然没有市场机制来消除可预测性。这就是为什么你的 GARCH 对波动率的预测似乎运作良好的原因。

但是您应该注意,拟合波动率与已实现平方收益的图表可能会有些误导。撇开平方收益只是实际波动率的一个嘈杂的代表这一事实不谈,还有一件事:我们的眼睛很容易被你帖子中的第一个图表所欺骗。当谈到拟合优度时,我们的眼睛不仅关注拟合值和实际值之间的垂直距离,这很重要,而且还关注水平距离。因此,而不是图形拟合。与实际值(两条线)相比,仅绘制两者之间的差异(一条线)很有帮助。您可能会惊讶地发现,从第一种类型的图表中看起来很小的差异在第二种类型的图表中描述时并没有那么小。这是因为 GARCH 的拟合波动率通常比实际波动率滞后一个时期。如果一个时间序列有很多数据点,这个滞后(水平差异)在视觉上很小,几乎不会被注意到,所以拟合看起来比实际更好。