r语言arma-garch怎样预测
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了r语言arma-garch怎样预测相关的知识,希望对你有一定的参考价值。
原文链接:http://tecdat.cn/?p=20015
本文将说明单变量和多变量金融时间序列的不同模型,特别是条件均值和条件协方差矩阵、波动率的模型。
均值模型
本节探讨条件均值模型。
iid模型
我们从简单的iid模型开始。iid模型假定对数收益率xt为N维高斯时间序列:
均值和协方差矩阵的样本估计量分别是样本均值
和样本协方差矩阵
我们从生成数据开始,熟悉该过程并确保估计过程给出正确的结果(即完整性检查)。然后使用真实的市场数据并拟合不同的模型。
让我们生成合成iid数据并估算均值和协方差矩阵:
# 生成综合收益数据X <- rmvnorm(n = T, mean = mu, sigma = Sigma)# 样本估计(样本均值和样本协方差矩阵)mu_sm <- colMeans(X)Sigma_scm <- cov(X)# 误差norm(mu_sm - mu, "2")#> [1] 2.44norm(Sigma_scm - Sigma, "F")#> [1] 70.79
现在,让我们针对不同数量的观测值T再做一次:
# 首先生成所有数据X <- rmvnorm(n = T_max, mean = mu, sigma = Sigma)# 现在遍历样本的子集for (T_ in T_sweep) # 样本估算 mu_sm <- colMeans(X_) Sigma_scm <- cov(X_) # 计算误差 error_mu_vs_T <- c(error_mu_vs_T, norm(mu_sm - mu, "2")) error_Sigma_vs_T <- c(error_Sigma_vs_T, norm(Sigma_scm - Sigma, "F"))# 绘图plot(T_sweep, error_mu_vs_T, main = "mu估计误差",
plot(T_sweep, error_Sigma_vs_T main = "Sigma估计中的误差", ylab = "误差"
单变量ARMA模型
对数收益率xt上的ARMA(p,q)模型是
其中wt是均值为零且方差为σ2的白噪声序列。模型的参数是系数ϕi,θi和噪声方差σ2。
请注意,ARIMA(p,d,q)模型是时间差分为d阶的ARMA(p,q)模型。因此,如果我们用xt代替对数价格,那么先前的对数收益模型实际上就是ARIMA(p,1,q)模型,因为一旦对数价格差分,我们就获得对数收益。
rugarch生成数据
我们将使用rugarch包 生成单变量ARMA数据,估计参数并进行预测。
首先,我们需要定义模型:
# 指定具有给定系数和参数的AR(1)模型#> #> *----------------------------------*#> * ARFIMA Model Spec *#> *----------------------------------*#> Conditional Mean Dynamics#> ------------------------------------#> Mean Model : ARFIMA(1,0,0)#> Include Mean : TRUE #> #> Conditional Distribution#> ------------------------------------#> Distribution : norm #> Includes Skew : FALSE #> Includes Shape : FALSE #> Includes Lambda : FALSE#> Level Fixed Include Estimate LB UB#> mu 0.01 1 1 0 NA NA#> ar1 -0.90 1 1 0 NA NA#> ma 0.00 0 0 0 NA NA#> arfima 0.00 0 0 0 NA NA#> archm 0.00 0 0 0 NA NA#> mxreg 0.00 0 0 0 NA NA#> sigma 0.20 1 1 0 NA NA#> alpha 0.00 0 0 0 NA NA#> beta 0.00 0 0 0 NA NA#> gamma 0.00 0 0 0 NA NA#> eta1 0.00 0 0 0 NA NA#> eta2 0.00 0 0 0 NA NA#> delta 0.00 0 0 0 NA NA#> lambda 0.00 0 0 0 NA NA#> vxreg 0.00 0 0 0 NA NA#> skew 0.00 0 0 0 NA NA#> shape 0.00 0 0 0 NA NA#> ghlambda 0.00 0 0 0 NA NA#> xi 0.00 0 0 0 NA NAfixed.pars#> $mu#> [1] 0.01#> #> $ar1#> [1] -0.9#> #> $sigma#> [1] 0.2true_params#> mu ar1 sigma #> 0.01 -0.90 0.20
然后,我们可以生成时间序列:
# 模拟一条路径apath(spec, n.sim = T)# 转换为xts并绘图plot(synth_log_returns, main = "ARMA模型的对数收益率"plot(synth_log_prices, main = "ARMA模型的对数价格"
ARMA模型
现在,我们可以估计参数(我们已经知道):
# 指定AR(1)模型arfimaspec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))# 估计模型#> mu ar1 sigma #> 0.0083 -0.8887 0.1987#> mu ar1 sigma #> 0.01 -0.90 0.20
我们还可以研究样本数量T对参数估计误差的影响:
# 循环for (T_ in T_sweep) estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(arma_fit)) error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs(coef(arma_fit) - true_params)/true_params)# 绘图matplot(T_sweep, estim_coeffs_vs_T, main = "估计的ARMA系数", xlab = "T", ylab = "值",
matplot(T_sweep, 100*error_coeffs_vs_T, main = "估计ARMA系数的相对误差", xlab = "T", ylab = "误差 (%)",
首先,真正的μ几乎为零,因此相对误差可能显得不稳定。在T = 800个样本之后,其他系数得到了很好的估计。
ARMA预测
为了进行健全性检查,我们现在将比较两个程序包 Forecast 和 rugarch的结果:
# 指定具有给定系数和参数的AR(1)模型spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE), fixed.pars = list(mu = 0.005, ar1 = -0.9, sigma = 0.1))# 生成长度为1000的序列arfima(arma_fixed_spec, n.sim = 1000)@path$seriesSim# 使用 rugarch包指定和拟合模型spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))# 使用包“ forecast”拟合模型#> ARIMA(1,0,0) with non-zero mean #> #> Coefficients:#> ar1 mean#> -0.8982 0.0036#> s.e. 0.0139 0.0017#> #> sigma^2 estimated as 0.01004: log likelihood=881.6#> AIC=-1757.2 AICc=-1757.17 BIC=-1742.47# 比较模型系数#> ar1 intercept sigma #> -0.898181148 0.003574781 0.100222964#> mu ar1 sigma #> 0.003605805 -0.898750138 0.100199956
确实,这两个软件包给出了相同的结果。
ARMA模型选择
在先前的实验中,我们假设我们知道ARMA模型的阶数,即p = 1和q = 0。实际上,阶数是未知的,因此必须尝试不同的阶数组合。阶数越高,拟合越好,但这将不可避免地导致过度拟合。已经开发出许多方法来惩罚复杂性的增加以避免过度拟合,例如AIC,BIC,SIC,HQIC等。
# 尝试不同的组合# 查看排名#> AR MA Mean ARFIMA BIC converged#> 1 1 0 1 0 -0.38249098 1#> 2 1 1 1 0 -0.37883157 1#> 3 2 0 1 0 -0.37736340 1#> 4 1 2 1 0 -0.37503980 1#> 5 2 1 1 0 -0.37459177 1#> 6 3 0 1 0 -0.37164609 1#> 7 1 3 1 0 -0.37143480 1#> 8 2 2 1 0 -0.37107841 1#> 9 3 1 1 0 -0.36795491 1#> 10 2 3 1 0 -0.36732669 1#> 11 3 2 1 0 -0.36379209 1#> 12 3 3 1 0 -0.36058264 1#> 13 0 3 1 0 -0.11875575 1#> 14 0 2 1 0 0.02957266 1#> 15 0 1 1 0 0.39326050 1#> 16 0 0 1 0 1.17294875 1#选最好的armaOrder#> AR MA #> 1 0
在这种情况下,由于观察次数T = 1000足够大,因此阶数被正确地检测到。相反,如果尝试使用T = 200,则检测到的阶数为p = 1,q = 3。
ARMA预测
一旦估计了ARMA模型参数ϕi ^ i和θ^j,就可以使用该模型预测未来的值。例如,根据过去的信息对xt的预测是
并且预测误差将为xt-x ^ t = wt(假设参数已被估计),其方差为σ2。软件包 rugarch 使对样本外数据的预测变得简单:
# 估计模型(不包括样本外)coef(arma_fit)#> mu ar1 sigma #> 0.007212069 -0.898745183 0.200400119# 整个样本外的预测对数收益forecast_log_returns <- xts(arma_fore@forecast$seriesFor[1, ], dates_out_of_sample)# 恢复对数价格prev_log_price <- head(tail(synth_log_prices, out_of_sample+1), out_of_sample)# 对数收益图plot(cbind("fitted" = fitted(arma_fit),# 对数价格图plot(cbind("forecast" = forecast_log_prices, main = "对数价格预测", legend.loc = "topleft")
多元VARMA模型
对数收益率xt上的VARMA(p,q)模型是
其中wt是具有零均值和协方差矩阵Σw的白噪声序列。该模型的参数是矢量/矩阵系数ϕ0,Φi,Θj和噪声协方差矩阵Σw。
比较
让我们首先加载S&P500:
# 加载标普500数据head(SP500_index_prices)#> SP500#> 2012-01-03 1277.06#> 2012-01-04 1277.30#> 2012-01-05 1281.06#> 2012-01-06 1277.81#> 2012-01-09 1280.70#> 2012-01-10 1292.08# 准备训练和测试数据logreturns_trn <- logreturns[1:T_trn]logreturns_tst <- logreturns[-c(1:T_trn)]# 绘图 plot(logreturns, addEventLines(xts("训练"
现在,我们使用训练数据(即,对于t = 1,…,Ttrnt = 1,…,Ttrn)来拟合不同的模型(请注意,通过指示排除了样本外数据 out.sample = T_tst)。特别是,我们将考虑iid模型,AR模型,ARMA模型以及一些ARCH和GARCH模型(稍后将对方差建模进行更详细的研究)。
# 拟合i.i.d.模型coef(iid_fit)#> mu sigma #> 0.0005712982 0.0073516993mean(logreturns_trn)#> [1] 0.0005681388sd(logreturns_trn)#> [1] 0.007360208# 拟合AR(1)模型coef(ar_fit)#> mu ar1 sigma #> 0.0005678014 -0.0220185181 0.0073532716# 拟合ARMA(2,2)模型coef(arma_fit)#> mu ar1 ar2 ma1 ma2 sigma #> 0.0007223304 0.0268612636 0.9095552008 -0.0832923604 -0.9328475211 0.0072573570# 拟合ARMA(1,1)+ ARCH(1)模型coef(arch_fit)#> mu ar1 ma1 omega alpha1 #> 6.321441e-04 8.720929e-02 -9.391019e-02 4.898885e-05 9.986975e-02#拟合ARMA(0,0)+ARCH(10)模型coef(long_arch_fit)#> mu omega alpha1 alpha2 alpha3 alpha4 alpha5 #> 7.490786e-04 2.452099e-05 6.888561e-02 7.207551e-02 1.419938e-01 1.909541e-02 3.082806e-02 #> alpha6 alpha7 alpha8 alpha9 alpha10 #> 4.026539e-02 3.050040e-07 9.260183e-02 1.150128e-01 1.068426e-06# 拟合ARMA(1,1)+GARCH(1,1)模型coef(garch_fit)#> mu ar1 ma1 omega alpha1 beta1 #> 6.660346e-04 9.664597e-01 -1.000000e+00 7.066506e-06 1.257786e-01 7.470725e-01
我们使用不同的模型来预测对数收益率:
# 准备预测样本外周期的对数收益# i.i.d.模型预测forecast(iid_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# AR(1)模型进行预测forecast(ar_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(2,2)模型进行预测forecast(arma_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# 使用ARMA(1,1)+ ARCH(1)模型进行预测forecast(arch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(0,0)+ARCH(10)模型预测forecast(long_arch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(1,1)+GARCH(1,1)模型预测forecast(garch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)
我们可以计算不同模型的预测误差(样本内和样本外):
print(error_var)#> in-sample out-of-sample#> iid 5.417266e-05 8.975710e-05#> AR(1) 5.414645e-05 9.006139e-05#> ARMA(2,2) 5.265204e-05 1.353213e-04#> ARMA(1,1) + ARCH(1) 5.415836e-05 8.983266e-05#> ARCH(10) 5.417266e-05 8.975710e-05#> ARMA(1,1) + GARCH(1,1) 5.339071e-05 9.244012e-05
我们可以观察到,随着模型复杂度的增加,样本内误差趋于变小(由于拟合数据的自由度更高),尽管差异可以忽略不计。重要的实际上是样本外误差:我们可以看到,增加模型复杂度可能会得出较差的结果。就预测收益的误差而言,似乎最简单的iid模型已经足够了。
最后,让我们展示一些样本外误差的图表:
plot(error, main = "不同模型收益预测的样本外误差",
请注意,由于我们没有重新拟合模型,因此随着时间的发展,误差越大(对于ARCH建模尤其明显)。
滚动窗口比较
让我们首先通过一个简单的示例比较静态预测与滚动预测的概念:
#ARMA(2,2)模型spec <- spec(mean.model = list(armaOrder = c(2,2), include.mean = TRUE))# 静态拟合和预测ar_static_fit <- fit(spec = spec, data = logreturns, out.sample = T_tst)#滚动拟合和预测modelroll <- aroll(spec = spec, data = logreturns, n.ahead = 1, # 预测图plot(cbind("static forecast" = ar_static_fore_logreturns, main = "使用ARMA(2,2)模型进行预测", legend.loc = "topleft")# 预测误差图plot(error_logreturns, col = c("black", "red"), lwd = 2, main = "ARMA(2,2)模型的预测误差", legend.loc = "topleft")
我们可以清楚地观察到滚动窗口过程对时间序列的影响。
现在,我们可以在滚动窗口的基础上重做所有模型的所有预测:
# 基于i.i.d.模型的滚动预测roll(iid_spec, data = logreturns, n.ahead = 1, forecast.length = T_t# AR(1)模型的滚动预测roll(ar_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, # ARMA(2,2)模型的滚动预测roll(arma_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, # ARMA(1,1)+ ARCH(1)模型的滚动预测roll(arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, refit.win# ARMA(0,0)+ ARCH(10)模型的滚动预测roll(long_arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, # ARMA(1,1)+ GARCH(1,1)模型的滚动预测roll(garch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, refit.window
让我们看看滚动基准情况下的预测误差:
print(rolling_error_var)#> in-sample out-of-sample#> iid 5.417266e-05 8.974166e-05#> AR(1) 5.414645e-05 9.038057e-05#> ARMA(2,2) 5.265204e-05 8.924223e-05#> ARMA(1,1) + ARCH(1) 5.415836e-05 8.991902e-05#> ARCH(10) 5.417266e-05 8.976736e-05#> ARMA(1,1) + GARCH(1,1) 5.339071e-05 8.895682e-05
和一些图表:
plot(error_logreturns, main = "不同模型的滚动预测误差", legend.loc = "topleft"
我们看到,现在所有模型都拟合了时间序列。此外,我们在模型之间没有发现任何显着差异。
我们最终可以比较静态误差和滚动误差:
barplot(rbind(error_var[, "out-of-sample"], rolling_error_var[, "out-of-sample"]) col = c("darkblue", "darkgoldenrod"), legend = c("静态预测", "滚动预测"),
我们可以看到,滚动预测在某些情况下是必须的。因此,实际上,我们需要定期进行滚动预测改进。
方差模型
ARCH和GARCH模型
对数收益率残差wt的ARCH(m)模型为
其中zt是具有零均值和恒定方差的白噪声序列,而条件方差σ2t建模为
其中,m为模型阶数,ω> 0,αi≥0为参数。
GARCH(m,s)模型使用σ2t上的递归项扩展了ARCH模型:
其中参数ω> 0,αi≥0,βj≥0需要满足∑mi =1αi+ ∑sj = 1βj≤1的稳定性。
rugarch生成数据
首先,我们需要定义模型:
# 指定具有给定系数和参数的GARCH模型#> #> *---------------------------------*#> * GARCH Model Spec *#> *---------------------------------*#> #> Conditional Variance Dynamics #> ------------------------------------#> GARCH Model : sGARCH(1,1)#> Variance Targeting : FALSE #> #> Conditional Mean Dynamics#> ------------------------------------#> Mean Model : ARFIMA(1,0,0)#> Include Mean : TRUE #> GARCH-in-Mean : FALSE #> #> Conditional Distribution#> ------------------------------------#> Distribution : norm #> Includes Skew : FALSE #> Includes Shape : FALSE #> Includes Lambda : FALSE#> Level Fixed Include Estimate LB UB#> mu 0.005 1 1 0 NA NA#> ar1 -0.900 1 1 0 NA NA#> ma 0.000 0 0 0 NA NA#> arfima 0.000 0 0 0 NA NA#> archm 0.000 0 0 0 NA NA#> mxreg 0.000 0 0 0 NA NA#> omega 0.001 1 1 0 NA NA#> alpha1 0.300 1 1 0 NA NA#> beta1 0.650 1 1 0 NA NA#> gamma 0.000 0 0 0 NA NA#> eta1 0.000 0 0 0 NA NA#> eta2 0.000 0 0 0 NA NA#> delta 0.000 0 0 0 NA NA#> lambda 0.000 0 0 0 NA NA#> vxreg 0.000 0 0 0 NA NA#> skew 0.000 0 0 0 NA NA#> shape 0.000 0 0 0 NA NA#> ghlambda 0.000 0 0 0 NA NA#> xi 0.000 0 0 0 NA NA#> $mu#> [1] 0.005#> #> $ar1#> [1] -0.9#> #> $omega#> [1] 0.001#> #> $alpha1#> [1] 0.3#> #> $beta1#> [1] 0.65true_params#> mu ar1 omega alpha1 beta1 #> 0.005 -0.900 0.001 0.300 0.650
然后,我们可以生成收益率时间序列:
# 模拟一条路径hpath(garch_spec, n.sim = T)#> num [1:2000, 1] 0.167 -0.217 # 绘图对数收益 plot(synth_log_returns, main = "GARCH模型的对数收益", lwd = 1.5) lines(synth_volatility
GARCH
现在,我们可以估计参数:
# 指定一个GARCH模型ugarchspec(mean.model = list(armaOrder = c(1,0)# 估计模型coef(garch_fit)#> mu ar1 omega alpha1 beta1 #> 0.0036510100 -0.8902333595 0.0008811434 0.2810460728 0.6717486402#> mu ar1 omega alpha1 beta1 #> 0.005 -0.900 0.001 0.300 0.650# 系数误差#> mu ar1 omega alpha1 beta1 #> 0.0013489900 0.0097666405 0.0001188566 0.0189539272 0.0217486402
我们还可以研究样本数量T对参数估计误差的影响:
# 循环for (T_ in T_sweep) garch_fit error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs((coef(garch_fit) - true_params)/true_params)) estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(garch_fit))# 绘图matplot(T_sweep, 100*error_coeffs_vs_T, main = "估计GARCH系数的相对误差", xlab = "T", ylab = "误差 (%)",
真实的ω几乎为零,因此误差非常不稳定。至于其他系数,就像在ARMA情况下一样,μ的估计确实很差(相对误差超过50%),而其他系数似乎在T = 800个样本后得到了很好的估计。
GARCH结果比较
作为健全性检查,我们现在将比较两个软件包 fGarch 和 rugarch的结果:
# 指定具有特定参数值的ARMA(0,0)-GARCH(1,1)作为数据生成过程garch_spec #生成长度为1000的数据path(garch_fixed_spec, n.sim = 1000)@path$# 使用“ rugarch”包指定和拟合模型rugarch_fit <- ugarchfit(spec = garch_spec, data = x)# 使用包“ fGarch”拟合模型garchFit(formula = ~ garch(1, 1), data = x, trace = FALSE)# 比较模型系数#> mu omega alpha1 beta1 #> 0.09749904 0.01395109 0.13510445 0.73938595#> mu omega alpha1 beta1 #> 0.09750394 0.01392648 0.13527024 0.73971658# 比较拟合的标准偏差print(head(fGarch_fi#> [1] 0.3513549 0.3254788 0.3037747 0.2869034 0.2735266 0.2708994print(head(rugar#> [1] 0.3538569 0.3275037 0.3053974 0.2881853 0.2745264 0.2716555
确实,这两个软件包给出了相同的结果。
使用rugarch包进行GARCH预测
一旦估计出GARCH模型的参数,就可以使用该模型预测未来的值。例如,基于过去的信息对条件方差的单步预测为
给定ω^ /(1-∑mi =1α^ i-∑sj =1β^ j)。软件包 rugarch 使对样本外数据的预测变得简单:
# 估计模型,不包括样本外garch_fit coef(garch_fit)#> mu ar1 omega alpha1 beta1 #> 0.0034964331 -0.8996287630 0.0006531088 0.3058756796 0.6815452241# 预测整个样本的对数收益garch_fore@forecast$sigmaFor[1, ]# 对数收益图plot(cbind("fitted" = fitted(garch_fit), main = "合成对数收益预测", legend.loc = "topleft")
#波动率对数收益图plot(cbind("fitted volatility" = sigma(garch_fit), main = "预测合成对数收益率的波动性", legend.loc = "topleft")
不同方法
让我们首先加载S&P500:
# 加载标准普尔500指数数据head(SP500_index_prices)#> SP500#> 2008-01-02 1447.16#> 2008-01-03 1447.16#> 2008-01-04 1411.63#> 2008-01-07 1416.18#> 2008-01-08 1390.19#> 2008-01-09 1409.13# 准备训练和测试数据x_trn <- x[1:T_trn]x_tst <- x[-c(1:T_trn)]# 绘图 plot(x, main = "收益" addEventLines(xts("训练", in
常数
让我们从常数开始:
plot(cbind(sqrt(var_constant), x_trn) main = "常数")
移动平均值
现在,让我们使用平方收益的移动平均值:
plot(cbind(sqrt(var_t), x_trn), main = "基于简单滚动平方均值的包络线(时间段=20)
EWMA
指数加权移动平均线(EWMA):
请注意,这也可以建模为ETS(A,N,N)状态空间模型:
plot(cbind(std_t, x_trn), main = "基于平方EWMA的包络")
乘法ETS
我们还可以尝试ETS模型的不同变体。例如,具有状态空间模型的乘性噪声版本ETS(M,N,N):
参考技术A 不清楚R语言使用ARIMA模型预测股票收益
原文链接:http://tecdat.cn/?p=2831
“预测非常困难,特别是关于未来”。丹麦物理学家尼尔斯·波尔(Neils Bohr)很多人都会看到这句名言。预测是这篇博文的主题。在这篇文章中,我们将介绍流行的ARIMA预测模型,以预测库存的回报,并演示使用R编程的ARIMA建模的逐步过程。
时间序列中的预测模型是什么?
预测涉及使用其历史数据点预测变量的值,或者还可以涉及在给定另一个变量的值的变化的情况下预测一个变量的变化。预测方法主要分为定性预测和定量预测。时间序列预测属于定量预测的范畴,其中统计原理和概念应用于变量的给定历史数据以预测同一变量的未来值。使用的一些时间序列预测技术包括:
自回归模型(AR)
移动平均模型(MA)
季节回归模型
分布式滞后模型
什么是自回归移动平均模型(ARIMA)?
ARIMA代表Autoregressive Integrated Moving Average。ARIMA也被称为Box-Jenkins方法。Box和Jenkins声称,通过对系列Y t进行差分,可以使非平稳数据静止。Y t的一般模型写成,
ARIMA模型结合了三种基本方法:
自回归(AR) - 在自回归的一个给定的时间序列数据在他们自己的滞后值,这是由在模型中的“P”值表示回归的值。
差分(I-for Integrated) - 这涉及对时间序列数据进行差分以消除趋势并将非平稳时间序列转换为静态时间序列。这由模型中的“d”值表示。如果d = 1,则查看两个时间序列条目之间的差异,如果d = 2,则查看在d = 1处获得的差异的差异,等等。
移动平均线(MA) - 模型的移动平均性质由“q”值表示,“q”值是误差项的滞后值的数量。
该模型称为自回归整合移动平均值或Y t的 ARIMA(p,d,q)。我们将按照下面列举的步骤来构建我们的模型。
第1步:测试和确保平稳性
要使用Box-Jenkins方法对时间序列进行建模,该系列必须是静止的。静止时间序列表示没有趋势的时间序列,其中一个具有恒定的均值和随时间的方差,这使得预测值变得容易。
测试平稳性 -我们使用Augmented Dickey-Fuller单位根测试测试平稳性。对于静止的时间序列,由ADF测试得到的p值必须小于0.05或5%。如果p值大于0.05或5%,则可以得出结论:时间序列具有单位根,这意味着它是一个非平稳过程。
差分 -为了将非平稳过程转换为静止过程,我们应用差分方法。区分时间序列意味着找出时间序列数据的连续值之间的差异。差异值形成新的时间序列数据集,可以对其进行测试以发现新的相关性或其他有趣的统计特性。
我们可以连续多次应用差分方法,产生“第一差异”,“二阶差异”等。
在我们进行下一步之前,我们应用适当的差分顺序(d)使时间序列静止。
第2步:识别p和q
在此步骤中,我们通过使用自相关函数(ACF)和部分自相关函数(PACF)来确定自回归(AR)和移动平均(MA)过程的适当顺序。有关ACF和PACF功能的说明,请参阅我们的博客“从时间序列开始”。
识别AR模型的p阶
对于AR模型,ACF将以指数方式衰减,PACF将用于识别AR模型的顺序(p)。如果我们在PACF上的滞后1处有一个显着峰值,那么我们有一个1阶AR模型,即AR(1)。如果我们在PACF上有滞后1,2和3的显着峰值,那么我们有一个3阶AR模型,即AR(3)。
识别MA模型的q阶
对于MA模型,PACF将以指数方式衰减,ACF图将用于识别MA过程的顺序。如果我们在ACF上的滞后1处有一个显着的峰值,那么我们有一个1阶的MA模型,即MA(1)。如果我们在ACF上的滞后1,2和3处有显着的峰值,那么我们有一个3阶的MA模型,即MA(3)。
第3步:估算和预测
一旦我们确定了参数(p,d,q),我们就可以估算ARIMA模型在训练数据集上的准确性,然后使用拟合模型使用预测函数预测测试数据集的值。最后,我们交叉检查我们的预测值是否与实际值一致。
使用R编程构建ARIMA模型
现在,让我们按照解释的步骤在R中构建ARIMA模型。有许多软件包可用于时间序列分析和预测。我们加载相关的R包进行时间序列分析,并从雅虎财务中提取股票数据。
#从雅虎财经中提取数据
getSymbols('TECHM.NS',from ='2012-01-01',to =''2015-01-01')
#选择相关的收盘价系列
stock_prices = TECHM.NS [,4]
在下一步中,我们计算股票的对数收益,因为我们希望ARIMA模型预测日志收益而不是股票价格。我们还使用绘图函数绘制了日志返回系列。
#计算股票 一阶差分
stock = diff(log(stock_prices),lag = 1)
plot(stock,type ='l',main ='log return plot')
接下来,我们对返回系列数据调用ADF测试以检查平稳性。来自ADF测试的p值为0.01告诉我们该系列是静止的。如果系列是非静止的,我们首先会对回归系列进行区分,使其保持静止。
在下一步中,我们修复了一个断点,该断点将用于将返回数据集拆分为代码中的两部分。
#将数据集拆分为两部分 - 训练和测试
acf.stock = acf(stock [c(1:breakpoint),],main ='ACF Plot',lag.max = 100)
我们可以观察这些图并得出自回归(AR)订单和移动平均(MA)订单。
我们知道,对于AR模型,ACF将呈指数衰减,PACF图将用于识别AR模型的阶数(p)。对于MA模型,PACF将以指数方式衰减,ACF图将用于识别MA模型的顺序(q)。从这些图中我们选择AR order = 2和MA order = 2.因此,我们的ARIMA参数将是(2,0,2)。
我们的目标是从断点开始预测整个回报序列。我们将在R中使用For循环语句,在此循环中,我们将预测测试数据集中每个数据点的返回值。
在下面给出的代码中,我们首先初始化一个系列,它将存储实际的回报,另一个系列来存储预测的回报。在For循环中,我们首先根据动态断点形成训练数据集和测试数据集。
我们在训练数据集上调用arima函数,其指定的顺序为(2,0,2)。我们使用这个拟合模型通过使用forecast.Arima函数来预测下一个数据点。该功能设置为99%置信水平。可以使用置信度参数来增强模型。我们将使用模型中的预测点估计。预测函数中的“h”参数表示我们要预测的值的数量,在这种情况下,第二天返回。
我们可以使用摘要功能确认ARIMA模型的结果在可接受的范围内。在最后一部分中,我们将每个预测收益和实际收益分别附加到预测收益序列和实际收益序列。
#初始化实际日志返回的xts对象
Actual_series = xts(0,as.Date(“2014-11-25”,“%Y-%m-%d”))
#初始化预测返回系列的数据帧
fit = arima(stock_train,order = c(2,0,2),include.mean = FALSE)
#绘制残差的acf图
arima.forecast = forecast.Arima(fit,h = 1,level = 99)
#绘制预测
#为预测期创建一系列预测回报
forecasted_series = rbind(forecasted_series,arima.forecast $ mean [1])
#为预测期创建一系列实际回报
Actual_series = c(Actual_series,xts(Actual_return))
RM(Actual_return)
}
在我们转到代码的最后部分之前,让我们从测试数据集中检查ARIMA模型的结果以获取样本数据点。
从得到的系数,返回方程可写为:
Y t = 0.6072 * Y (t-1) -0.8818 * Y (t-2) -0.5447ε (t-1)+0.8972ε (t-2)
系数给出了标准误差,这需要在可接受的范围内。Akaike信息标准(AIC)评分是ARIMA模型准确性的良好指标。模型更好地降低AIC得分。我们还可以查看残差的ACF图; 良好的ARIMA模型的自相关性将低于阈值限制。预测的点返回为-0.001326978,在输出的最后一行中给出。
让我们通过比较预测回报与实际回报来检查ARIMA模型的准确性。代码的最后一部分计算此准确性信息。
#调整实际返回系列的长度
Actual_series = Actual_series [-1]
#创建预测系列的时间序列对象
forecasted_series = xts(forecasted_series,index(Actual_series))
#创建两个回归系列的图 - 实际与预测
#创建一个表格,用于预测的准确性
comparsion = merge(Actual_series,forecasted_series)
comparsion $ Accuracy = sign(comparsion $ Actual_series)== sign(comparsion $ Precasted)
#计算准确度百分比指标
Accuracy_percentage = sum(comparsion $ Accuracy == 1)* 100 / length(comparsion $ Accuracy)
如果预测收益的符号等于实际收益的符号,我们已为其指定了正准确度得分。模型的准确率百分比达到55%左右,看起来像是一个不错的数字。可以尝试运行模型以获得(p,d,q)的其他可能组合,或者使用auto.arima函数选择最佳的最佳参数来运行模型。
结论
最后,在本文中,我们介绍了ARIMA模型,并将其应用于使用R编程语言预测股票价格回报。我们还通过实际回报检查了我们的预测结果。在我们即将发布的帖子中,我们将介绍其他时间序列预测技术,并使用Python / R编程语言进行尝试。
点击标题查阅往期内容
更多内容,请点击左下角“阅读原文”查看
案例精选、技术干货 第一时间与您分享
长按二维码加关注
更多内容,请点击左下角“阅读原文”查看
以上是关于r语言arma-garch怎样预测的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用lm函数拟合多元线性回归模型假定预测变量之间有交互作用R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响