全文下载链接: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")
点击题目查阅往期内容
GARCH-DCC 模型和 DCC(MVT)建模预计
左右滑动查看更多
01
02
03
04
多元 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):
plot(cbind(std_t, x_trn), col = c("red", "black") main = "基于平方的 ETS(M,N,N)的包络"
ARCH
当初,咱们能够应用更简单的 ARCH 建模:
plot(cbind(std_t, x_trn), col = c("red", "black") main = "基于 ARCH(5) 的包络")
GARCH
咱们能够将模型晋升到 GARCH:
plot(cbind(std_t, x_trn), col = c("red", "black") main = "基于 GARCH(1,1)的包络")
SV 随机稳定率
最初,咱们能够应用随机稳定率建模:
或者,等效地,
plot(cbind(std_t, x_trn), col = c("red", "black"), main = "基于随机稳定率的包络剖析")
比拟
当初,咱们能够比拟每种办法在样本外期间的方差预计中的误差:
#> MA EWMA ETS(M,N,N) ARCH(5) GARCH(1,1) SV #> 2.204965e-05 7.226188e-06 3.284057e-06 7.879039e-05 6.496545e-06 6.705059e-06barplot(error_all, main = "样本外方差预计中的误差"
滚动窗口比拟
六种办法的滚动窗口比拟:MA,EWMA,ETS(MNN),ARCH(5),GARCH(1,1)和 SV。
#滚动窗口 lookback <- 200len_tst <- 40for (i in seq(lookback, T-len_tst, by = len_tst)) {# MA var_t <- roll_meanr(x_trn^2, n = 20, fill = NA) var_fore <- var(x_trn/sqrt(var_t), na.rm = TRUE) * tail(var_t, 1) error_ma <- c(error_ma, abs(var_fore - var_tst)) # EWMA error_ewma <- c(error_ewma, abs(var_fore - var_tst)) # ETS(M,N,N) error_ets_mnn <- c(error_ets_mnn, abs(var_fore - var_tst)) # ARCH error_arch <- c(error_arch, abs(var_fore - var_tst)) # GARCH error_garch <- c(error_garch, abs(var_fore - var_tst)) # SV error_sv <- c(error_sv, abs(var_fore - var_tst))}barplot(error_all, main = "方差预计误差",
多元 GARCH 模型
出于阐明目标,咱们将仅思考恒定条件相干(CCC)和动静条件相干(DCC)模型,因为它们是最受欢迎的模型。对数收益率残差 wt 建模为
其中 zt 是具备零均值和恒定协方差矩阵 II 的 iid 白噪声序列。条件协方差矩阵 Σt 建模为
其中 Dt = Diag(σ1,t,…,σN,t)是标准化噪声向量 C,协方差矩阵 ηt=C-1wt(即,它蕴含等于 1 的对角线元素)。
基本上,应用此模型,对角矩阵 Dt 蕴含一组单变量 GARCH 模型,而后矩阵 C 蕴含序列之间的一些相关性。该模型的次要毛病是矩阵 C 是恒定的。为了克服这个问题,DCC 被提议为
其中 Ct 蕴含等于 1 的对角元素。要强制等于 1 的对角元素,Engle 将其建模为
Qt 具备任意对角线元素并遵循模型
咱们将生成数据,预计参数和预测。
从加载多元 ETF 数据开始:
- SPDR S&P 500 ETF
- 20 年以上国债 ETF
- IEF:7-10 年期国债 ETF
# 下载数据 prices <- xts()head(prices)#> SPY TLT IEF#> 2013-01-02 127.8779 99.85183 93.65224#> 2013-01-03 127.5890 98.49886 93.17085#> 2013-01-04 128.1493 98.88306 93.21463#> 2013-01-07 127.7991 98.92480 93.26714#> 2013-01-08 127.4314 99.57622 93.49468#> 2013-01-09 127.7553 99.48438 93.54719# 绘制三个对数价格序列 plot(log(prices) main = "三个 ETF 的对数价格", legend.loc = "topleft")
首先,咱们定义模型:
# 指定 i.i.d. 单变量工夫序列模型 ugarch_spec # 指定 DCC 模型 spec(multispec(replicate(spec, n = 3))
接下来,咱们拟合模型:
# 预计模型 #> #> *---------------------------------*#> * DCC GARCH Fit *#> *---------------------------------*#> #> Distribution : mvnorm#> Model : DCC(1,1)#> No. Parameters : 44#> [VAR GARCH DCC UncQ] : [30+9+2+3]#> No. Series : 3#> No. Obs. : 1007#> Log-Likelihood : 12198.4#> Av.Log-Likelihood : 12.11 #> #> Optimal Parameters#> -----------------------------------#> Estimate Std. Error t value Pr(>|t|)#> [SPY].omega 0.000004 0.000000 11.71585 0.000000#> [SPY].alpha1 0.050124 0.005307 9.44472 0.000000#> [SPY].beta1 0.870051 0.011160 77.96041 0.000000#> [TLT].omega 0.000001 0.000001 0.93156 0.351563#> [TLT].alpha1 0.019716 0.010126 1.94707 0.051527#> [TLT].beta1 0.963760 0.006434 149.79210 0.000000#> [IEF].omega 0.000000 0.000001 0.46913 0.638979#> [IEF].alpha1 0.031741 0.023152 1.37097 0.170385#> [IEF].beta1 0.937777 0.016498 56.84336 0.000000#> [Joint]dcca1 0.033573 0.014918 2.25044 0.024421#> [Joint]dccb1 0.859787 0.079589 10.80278 0.000000#> #> Information Criteria#> ---------------------#> #> Akaike -24.140#> Bayes -23.925#> Shibata -24.143#> Hannan-Quinn -24.058#> #> #> Elapsed time : 0.8804049
咱们能够绘制时变相关性:
# 提取时变协方差和相关矩阵 dim(dcc_cor)#> [1] 3 3 1007# 绘图 plot(corr_t main = "时变相干", legend.loc = "left")
咱们看到两个收益 ETF 之间的相关性十分高且相当稳固。与 SPY 的相关性较小,在小于 0 的区间稳定。
点击文末 “浏览原文”
获取全文残缺代码、数据资料。
本文选自《R 语言用多元 ARMA,GARCH ,EWMA, ETS, 随机稳定率 SV 模型对金融工夫序列数据建模》。
点击题目查阅往期内容
R 语言基于 ARMA-GARCH-VaR 模型拟合和预测实证钻研剖析案例
R 语言对 S&P500 股票指数进行 ARIMA + GARCH 交易策略
R 语言 ARMA GARCH COPULA 模型拟合股票收益率工夫序列和模仿可视化
ARMA-GARCH-COPULA 模型和金融工夫序列案例
工夫序列剖析:ARIMA GARCH 模型剖析股票价格数据
GJR-GARCH 和 GARCH 稳定率预测普尔指数工夫序列和 Mincer Zarnowitz 回归、DM 测验、JB 测验
【视频】工夫序列剖析:ARIMA-ARCH / GARCH 模型剖析股票价格
工夫序列 GARCH 模型剖析股市稳定率
PYTHON 用 GARCH、离散随机稳定率模型 DSV 模仿预计股票收益工夫序列与蒙特卡洛可视化
极值实践 EVT、POT 超阈值、GARCH 模型剖析股票指数 VaR、条件 CVaR:多元化投资组合预测危险测度剖析
Garch 稳定率预测的区制转移交易策略
金融工夫序列模型 ARIMA 和 GARCH 在股票市场预测利用
工夫序列分析模型:ARIMA-ARCH / GARCH 模型剖析股票价格
R 语言危险价值:ARIMA,GARCH,Delta-normal 法滚动预计 VaR(Value at Risk)和回测剖析股票数据
R 语言 GARCH 建模罕用软件包比拟、拟合规范普尔 SP 500 指数稳定率工夫序列和预测可视化
Python 金融工夫序列模型 ARIMA 和 GARCH 在股票市场预测利用
MATLAB 用 GARCH 模型对股票市场收益率工夫序列稳定的拟合与预测 R 语言 GARCH-DCC 模型和 DCC(MVT)建模预计
Python 用 ARIMA、GARCH 模型预测剖析股票市场收益率工夫序列
R 语言中的工夫序列分析模型:ARIMA-ARCH / GARCH 模型剖析股票价格
R 语言 ARIMA-GARCH 稳定率模型预测股票市场苹果公司日收益率工夫序列
Python 应用 GARCH,EGARCH,GJR-GARCH 模型和蒙特卡洛模仿进行股价预测
R 语言工夫序列 GARCH 模型剖析股市稳定率
R 语言 ARMA-EGARCH 模型、集成预测算法对 SPX 理论稳定率进行预测
matlab 实现 MCMC 的马尔可夫转换 ARMA – GARCH 模型预计
Python 应用 GARCH,EGARCH,GJR-GARCH 模型和蒙特卡洛模仿进行股价预测
应用 R 语言对 S&P500 股票指数进行 ARIMA + GARCH 交易策略
R 语言用多元 ARMA,GARCH ,EWMA, ETS, 随机稳定率 SV 模型对金融工夫序列数据建模
R 语言股票市场指数:ARMA-GARCH 模型和对数收益率数据探索性剖析
R 语言多元 Copula GARCH 模型工夫序列预测
R 语言应用多元 AR-GARCH 模型掂量市场危险
R 语言中的工夫序列分析模型:ARIMA-ARCH / GARCH 模型剖析股票价格
R 语言用 Garch 模型和回归模型对股票价格剖析
GARCH(1,1),MA 以及历史模拟法的 VaR 比拟
matlab 预计 arma garch 条件均值和方差模型 R 语言 POT 超阈值模型和极值实践 EVT 剖析