R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模(上)

简介: R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模

原文链接: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预测


为了进行健全性检查,我们现在将比较两个程序包 Forecastrugarch的结果

# 指定具有给定系数和参数的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"

我们看到,现在所有模型都拟合了时间序列。此外,我们在模型之间没有发现任何显着差异。


R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模(下):https://developer.aliyun.com/article/1490540

相关文章
|
6月前
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
|
6月前
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
|
3月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
6月前
|
数据可视化
R语言汇率、股价指数与GARCH模型分析:格兰杰因果检验、脉冲响应与预测可视化
R语言汇率、股价指数与GARCH模型分析:格兰杰因果检验、脉冲响应与预测可视化
|
6月前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言神经网络模型金融应用预测上证指数时间序列可视化
R语言神经网络模型金融应用预测上证指数时间序列可视化
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
15天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
39 3
|
6月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化
|
6月前
|
机器学习/深度学习 数据可视化
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为2
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
下一篇
无影云桌面