新浪博客

AR、MA及ARMA模型联系与区别

2018-01-17 23:44阅读:
ARMAARMA模型都旨在解释事件序列内在的自相关性从而预测未来。在ARMA模型的基础上,还有扩展的ARIMASARIMA模型。
对于金融时间序列,由于其具有volatility clustering的特性,时间序列的波动率(二阶矩)并不是一个不变的常数,ARMAARMA模型是无法刻画这种条件异方差的特性,ARCHGARCH模型可以解决这一问题,关于在量化中大量运用的GARCH簇模型在后面会有较多篇幅去介绍。
如何选择最优的模型
在讲具体模型之前,我们首先需知道什么是最优的模型,有怎样的标准去评价“最优”。通常来讲,akaike information criterionAIC)和bayesian information criterionBIC)是评价模型优良的两个指标。这两种评价指标不仅适用于事件序列模型,还广泛广泛运用于其他数学模型中。
AIC = -2 ln(L) + 2 k
BIC = -2 ln(L) + ln(n)*k
让我们来理解AIC的含义,AIC由两部分组成,一部分是对数极大似然函数,另一部分则是参数的个数。极大似然函数是评价模型拟合优劣性的指标,值越大说明拟合的效果越好。然而使用过多的参数可以拟合的很好却会出现过度拟合的情况,这样的模型泛化能力很差,因此加上参数的个数实际上是对极大似然函数进行”惩罚“。选取AIC值最小的模型作为最优模型,实质上
是平衡了欠拟合和过拟合。
AR 模型
AR模型思想很简单,该模型认为通过时间序列过去时点的线性组合加上白噪声即可预测当前时点,它是随机游走的一个简单扩展。采用R可以去模拟一个简单的AR(1)序列:
x <- w <- rnorm(100)
for (t in 2:100) x[t] <- 0.5*x[t-1] + w[t]
反过来可以采用MLE(极大似然法)估计参数和95%的置信区间:
x.ar <- ar(x, method = 'mle')
x.ar$ar + c(-1.96, 1.96)*sqrt(x.ar$asy.var)
AR模型对偏自相关函数(PACF)截尾,对自相关函数(ACF)拖尾。所谓截尾指的是从某阶开始均为(接近)0的性质,拖尾指的是并不存在某一阶突然跳变到0而是逐渐衰减为0
时间序列自相关与概率论中的相关定义本质是一致的,它衡量的是序列自身在不同时刻随机变量的相关性;偏自相关系数则剔除了两时刻之间其他随机变量的干扰,是更加纯粹的相关。
AR模型在金融模型中主要是对金融序列过去的表现进行建模,如交易中的动量与均值回归。
MA模型
MA模型和AR大同小异,它并非是历史时序值的线性组合而是历史白噪声的线性组合。与AR最大的不同之处在于,AR模型中历史白噪声的影响是间接影响当前预测值的(通过影响历史时序值)。
采用R可以去模拟一个简单的MA(1)序列:
x <- w <- rnorm(100)
for (t in 2:100) x[t] <- w[t] + 0.5*w[t-1]
同样可以去反过来估计MA的参数:
arima(x, order=c(0, 0, 1))
MA模型对偏自相关函数(PACF)拖尾,对自相关函数(ACF)截尾。在金融模型中,MA常用来刻画冲击效应,例如预期之外的事件。
ARMA模型
ARMA模型混合可得到ARMA模型,AR(p)MA(q)共同组成了ARMA(p,q)。下面模拟一个ARMA(1,1)序列:
x <- arima.sim(n=1000, model=list(ar=0.5, ma=-0.5))
arima(x, order=c(1, 0, 1))
那么在建模过程中应该如何选择ARMA模型的最佳参数pq呢?最常用的技术是采用循环在pq各自05(或者更大)的范围内搜索最小AICBIC(p,q)组合。
ARIMA模型
ARIMA模型是在ARMA模型的基础上解决非平稳序列的模型,因此在模型中会对原序列进行差分,下面模拟了一个ARIMA(1,1,1)模型:
x <- arima.sim(list(order = c(1,1,1), ar = 0.6, ma=-0.5), n = 1000
arima(x, order=c(1, 1, 1))
ARIMA模型的基础上可以衍生出SARIMA模型,SRIMA模型能够刻画季节效应,如商品价格的周期性变动,在此不详细叙述。
ARIMA模型完整的建模框架(以R为例)
· 对时间序列进行平稳性检验。
library('TSA')
adf.test(series)
· 若无法通过检验则需要对原序列进行差分,直到差分后的结果能够通过平稳性检验,从而确定d
df1 = diff(series)
adf.test(df1)
· 查看ACFPACF图。
acf(df1)
pacf(df1)
· 模式选择:通过EACFAIC等技术,确定pq的取值。
· 训练模型,得到参数值。
res = arima(series, order = c(p,d,q))
· 检验残差是否是白噪声序列。
Box.test(res$residuals,lag=20, type='Ljung-Box')
· 对时间序列未来的值进行预测。
play_forecast <- predict(res, n.ahead = 21)
plot(res, n.ahead = 21, type = 'o')
下面大家可以按照上述步骤自己练习一下,采用R中的quantmod获取amazon公司的股票收盘价,选取合适的ARIMA模型对其日收益率序列进行建模和预测。
require(quantmod)
getSymbols('AMZN')
ARMA模型模拟与识别

ARMA模型基本理论不再赘述。基本的识别过程如下表:
AR、MA及ARMA模型联系与区别
ARMA模型需要用到和arima相关的一族函数。这里暂时不涉及差分阶数I
下面将模拟几个特殊的ARMA模型。需要用到的函数是:
arima.sim(model, n)
- model :生成的模型。具体看下面的例子。
- n :序列的长度。
注意这个函数不能生成非平稳序列。
1AR(1) : X(t) = 0.8*X(t-1) + E(t)
D = arima.sim ( list( order = c(1, 0, 0), ar=0.8 ), n = 200 )
plot(D) ;
par(mfrow=c(1,2)) ; acf(D) ; pacf(D)
这里,order的三个参数分别对应AR,I,MA的阶数。
如果用Box.test验证纯随机性的话,可以很容易拒绝它不是白噪声序列。
可以明显看出acf的拖尾性,与pacf的一阶截尾性。
2AR(2) : X(t) = 0.8*X(t-1) + 0.1X(t-1) + E(t)
D = arima.sim ( list( order = c(2, 0, 0), ar=c(0.8,0.1) ), n = 200 )

可以明显看出acf的拖尾性,与pacf的二阶截尾性。
2MA(2) : X(t) = E(t) 0.7*E(t-1) 0.2*E(0.2)
##这里符号我还没验证是指正还是指负。
D = arima.sim ( list( order = c(0, 0, 2), ma=c(0.7,0.2) ), n = 200 )
可以明显看出pacf的拖尾性,与acf的二阶截尾性。
2MA(2) : X(t) = E(t) 0.7*E(t-1) 0.2*E(0.2)
D = arima.sim ( list( order = c(2, 0, 2), ar=c(0.3,0.4),ma=c(0.5,0.4) ), n = 200 )
都是拖尾的。但在实际情况中,也经常遇到难以判断的情况。
下面我们尝试生成几组非平稳序列。
七、ARMA模型的估计
对于一个给定的序列,如何用R求出相关的参数呢?
arima( x, order=c(0,0,0), method=c(“CSS-ML”,”ML”,”CSS”),include.mean)
- x :待估计序列。
- order :指定阶数。
- method :估计方法。ML为极大似然估计,CSS为条件最小二乘估计。
- include.mean :是否包含均值项(intercept)
另一个可用的函数是auto.arima(),这个函数在forecast包里,它的估计依据是AIC/BIC标准。尤其对ARMA模型定阶困难时,可以考虑用auto.ARIMA
现在模拟生成一个ARMA(2,2)的时间序列,然后分别运用两个函数进行估计。
D = arima.sim ( list( order = c(2, 0, 2), ar=c(-0.5,0.4),ma=c(0.5,0.4) ), n = 1000 )
ARIMA=arima(D,order=c(2,0,2),method='ML'); summary(ARIMA)
library(forecast); ARIMA.auto=auto.arima(D); summary(ARIMA.auto)
arima()的估计结果:
Coefficients:
ar1 ar2 ma1 ma2 intercept
-0.5038 0.3334 0.5354 0.4566 -0.0358
s.e. 0.0480 0.0476 0.0458 0.0402 0.0566
arima.auto()的估计结果:
Coefficients:
ar1 ar2 ma1 ma2
-0.503 0.3342 0.5350 0.4564
s.e. 0.048 0.0476 0.0458 0.0403
可以看到两者的结果是一样的,也基本接近模拟时设定的参数。
但是还是存在一些困难难以克服。在我们难以定阶时,尤其是ARMA(p,q)模型中,难以确定arima() 函数中的阶数,因为我们并不知道p,q真正是多少。而在试验过程中,我测试了多组时序数据,在样本量200auto.arima()确定的阶数也常常和模拟的参数不一样,这就是说auto.arima的结果(即AIC准则结果)经常不准确。
不过,在评价模型结果时,可以采取这样的标准:只要残差序列为纯随机序列,就可以认为模型已经建立成功。可以这样获取残差序列:
resid=ARIMA$residual
再重复前面的随机性检验即可。不过严格说,对残差序列的随机性检验要扣除一些自由度,要用到前面Box.testdffit,令其等于p+q
八、ARMA模型的预测
建立好ARMA模型后,我们可以进行预测。
predict(model,n.ahead)
- model :这里需要填入估计好的ARIMA模型。
- n.ahead :需要预测几期。
predict() 将会返回两个时间序列数据。一个是$pred,即点预测,另一个是$se即对应的估计误差。
下面给出一个较为完整的例子:
D = arima.sim ( list( order = c(2, 0, 2), ar=c(0.5,-0.2),ma=c(0.5,0.2) ), n = 100 )
plot(D) ;
par(mfrow=c(1,2)) ; acf(D) ; pacf(D)
ARIMA=arima(D,order=c(2,0,2),method='ML',include.mean=FALSE)
summary(ARIMA)
library(forecast)
ARIMA.auto=auto.arima(D)
summary(ARIMA.auto)
resid=ARIMA $residual
Box.test(resid,lag=6)
Box.test(resid,lag=12)
pre=predict(ARIMA,n.ahead=10)
U=pre$pred + 1.96*pre$se
L=pre$pred - 1.96*pre$se
ts.plot(D,pre$pred,col=1:2)
lines(U,col='blue',lty='dashed')
lines(L,col='blue',lty='dashed')
最终可以得到一个这样的图形,最后的红蓝线即预测结果。
另外提供一个forecast.Arima() 函数,具体用法不再详述,不过使用更简便一些。
pre2=forecast.Arima(ARIMA,h=10,level=c(0.95))
pre2
plot.forecast(pre2)

两者的结果是完全一样的。

我的更多文章

下载客户端阅读体验更佳

APP专享