arma模型c语言代码(ARMA模型)

本篇文章给大家谈谈arma模型c语言代码,以及ARMA模型对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、如何用Matlab求ARMA模型的残差?(急,谢谢)2、ARIMA参数模型表怎么写表达式?每个值的含义是什么?3、均值模型4、r语言arma-garch怎样预测

如何用Matlab求ARMA模型的残差?(急,谢谢)

用Matlab求ARMA模型的残差

数组Y X,方程y=f(x)

则残差c=Y-y

[b, bint,r,rint,stats]=regress(Y,X,alpha)

rcoplot(r,rint)做残差图

从残差图可以看出数据的残差离零点的远近,当残差的置信区间均包含零点,这说明回归模型 能较好的符合原始数据,否则可视为异常点。

MATLAB[1] 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB是matrixlaboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。

ARIMA参数模型表怎么写表达式?每个值的含义是什么?

y_t=0.3658*y_(t-1)+e_t-e_(t-1) 。每个值的含义是参数的配对。

利用ARIMA模型进行卷烟销售预测时值年末,各卷烟企业在布置来年卷烟销售任务时,对卷烟销售进行预测是十分有必要的。利用ARIMA模型进行卷烟销售预测是一个十分有用的方法。ARIMA方法是时间序列预测中的一种有效的方法。

平稳性差别:

ARMA模型的平稳性要求y的均值、方差和自协方差都是与时间无关的、有限的常数。 可以证明,ARMA(p, q)模型的平稳性条件是方程()0Lφ=的解的模都大于1,可逆性条件是方程()0Lθ=的解的模都大于1。

ARMA模型只能处理平稳序列,因此对于平稳序列,可以直接建立AR、MA或者ARMA模型。但是,常见的时间序列一般都是非平稳的。必须通过差分后转化为平稳序列,才可以使用ARMA模型。  

ARIMA模型 (autoregressive integrated moving average) 定义:如果非平稳时间序列yt经过k次差分后的平稳序列zt=△kyt服从ARMA(p, q)模型。

arma模型c语言代码(ARMA模型)

均值模型

原文链接:

本文将说明单变量和多变量金融时间序列的不同模型,特别是条件均值和条件协方差矩阵、波动率的模型。

均值模型

本节探讨条件均值模型。

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

r语言arma-garch怎样预测

原文链接:

本文将说明单变量和多变量金融时间序列的不同模型,特别是条件均值和条件协方差矩阵、波动率的模型。

均值模型

本节探讨条件均值模型。

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

关于arma模型c语言代码和ARMA模型的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 18:49:26
下一篇 2024年4月1日 18:56:51

相关推荐

  • 从烧鹅的故事,谈负债赚钱的基本模型

    买的烧鹅是能长久保存的,在第2天早上不会坏掉,价格上涨幅度需要大于银行利率,能从银行贷款,房子建成后不会坏,现在国内经济发展很快 美元通货膨胀百年 小明生活在一个有通货膨胀的地方,价格每天都上涨100%,烧鹅第0天早上的价格是100,第1天早上是200,第2天早上是400。 小明在第0天早上买了1只烧鹅,花了100,小明并没有吃掉,保留到第2天早上…

    2024年4月21日
    4000
  • 如何利用SWOT模型来找到赚钱方向?

    S代表优势;W代表的是劣势;O代表的是机会;T代表的是威胁;第一:SO,优势 机会;第二:WO,劣势 机会;第三:ST,优势 威胁 如果你是处于迷茫期的普通年轻人,既没有人脉也没有背景,想出头的话就看下面这篇文章,能让你脱离困境,准、快、狠地在职场稳住脚跟。 我做个人ip,会用到这个工具,来快速帮自己分析下一步怎么打得漂亮,超级无敌有用!!! 这四个字母,每…

    2024年4月19日
    3800
  • 推荐一个简单的投资方法:股债均配模型和动态再平衡

    股票部分:就是股票指数,你可以选择沪深300和创业板指数,一个代表价值,一个代表成长。把你资金的50 ,均配到这两个指数上就行,各买25 #股票##股市分析##股市点评#2022年初A股大盘指数下跌超过20%,叠加乌俄事件,更是上下波动的厉害,很多投资者损失惨重,甚至怀疑人生。其实你把时间拉长来看,并没有什么大碍,每一年都要有20%-30…

    2024年4月17日
    4600
  • 开一个在线语言辅导平台,比开辅导班还赚钱

    您好!您是谁,您在从事什么业务;您的背景故事是什么?您是如何想到这个想法的;描述一下,你创办该业务的过程;您在业务中使用了什么平台/工具 品牌:Lingoci 地点:新加坡 创始人:1人 创办时间:2017年1月 雇员:0人 每月收入:60000美元 简介:一个可将语言学习者与经验丰富的本地语言导师联系起来的平台(在线语言辅导平台)。 您好!您是谁,您在从事…

    2024年4月15日
    4900
  • 从万利连锁模型,开连锁企业是如何赚钱的

    BP吸引,形成闭环,行业:又肥又大,有市场,公司:专注某领域,历史悠久,匠心精神,创始团队:有梦想,有情怀的团队,团队精神,机会,投资小 既然是赚钱扩张,即一本万利,或者无本万利,首先给大家看看万利连锁模型 现在很多的连锁企业还在经营着重资产的事业,是否有种可能从重资产向轻资产转移?实现用别人的钱,同时还可以收员工的心 举例一家会员企业:1家店投资100万,…

    2024年4月15日
    4300
  • 风投是怎样建立回报模型的?本文是一堂数学课

    比较合理的方式,是先了解自己每年的潜在交易流有多少,以及每年打算投资多少公司,每家公司打算投资多少金额,有多少比例会进行追加投资 想了解风投怎么赚钱,首先要先知道他们的钱怎么来。风投不是用自己的闲钱投资公司,而是跟创业者一模一样,需要到外面找金主募资。而风投募资时,也跟创业者们一样,需要给金主们路演——这个基金要干嘛?要投哪些产业?在什么样的阶段?主力哪些市…

    2024年4月13日
    4300
  • 不会写代码的人,在海外有哪些工作机会

    收到几十封邮件说我说不会写代码,有没有非程序员的海外工作机会 当然有,我从纽约搬到新加坡的时候就是拿content producer的offer Kala的成长随笔 藤校硕士の四国职场|海外B轮科技公司日常|全球行销、自学编程和远程工作 生活过3年的新加坡是个现代又不失 传统的有趣的城市/国家 @Lezlie 接着上篇继续分享时间自由的机会。我自己目前时间比…

    2024年4月13日
    4400
  • 线上抓娃娃能挣钱吗?来看看它的财务模型

    每以每次购币成本 2元、每只公仔抓取概率为 20 次 、每台单日消耗 3 只公仔计算,每月流水在 2 元 × 20 次 × 3 只 × 10 台 × 30 天=36000 元 上述章节我们描述了线上娃娃机狂飙突进的历史以及何至于斯的各项条件,这个时候,更深一层的问题来了,线上的娃娃机到底挣钱嘛? 我们先来看线下娃娃机的财务模型。 抓娃娃本质上是开一个奖品价值…

    2024年4月13日
    4900
  • 使用趋势模型来炒股,克服人性弱点,更易赚钱

    大家还可以用我们刚刚提到的公式,再次验证一下我说过的话。我们强烈建议大家以趋势交易为主。当然,趋势跟踪交易,最难的地方是克服人性 最近有个同学问我一个非常有用的问题,在这里和大家分享一下我的看法。这个同学的问题是:为什么趋势交易容易赚钱? 在谈这个问题之前,我们先聊聊投资交易的类型。我们的投资,按照投资类型大致可以分为两类,一种是趋势交易,另一种是均值回归交…

    2024年4月12日
    3700
  • 黑客代码软件学习网站小学,黑客代码教程软件下载

    适合孩子学习的编程软件有哪些 常用的编程软件有:Visual studio、PhpStorm、Notepad++、WebStrom、Sublime Text、EditPlus 等。达内教育1:Visual studio是一款由美国微软公司开发的开发工具集,简称VS,它包括了整个软件的生命周期所需要的大部分工具。 小学生学编程好的软件有:猿编程和火花编程。猿编…

    2024年4月10日
    3700

发表回复

登录后才能评论



关注微信