AR、MA及ARMA模型联系与区别
(2018-01-17 23:44:55)分类: 基础知识 |
AR、MA和ARMA模型都旨在解释事件序列内在的自相关性从而预测未来。在ARMA模型的基础上,还有扩展的ARIMA和SARIMA模型。
对于金融时间序列,由于其具有volatility clustering的特性,时间序列的波动率(二阶矩)并不是一个不变的常数,AR、MA和ARMA模型是无法刻画这种条件异方差的特性,ARCH和GARCH模型可以解决这一问题,关于在量化中大量运用的GARCH簇模型在后面会有较多篇幅去介绍。
如何选择最优的模型
在讲具体模型之前,我们首先需知道什么是最优的模型,有怎样的标准去评价“最优”。通常来讲,akaike information criterion(AIC)和bayesian information criterion(BIC)是评价模型优良的两个指标。这两种评价指标不仅适用于事件序列模型,还广泛广泛运用于其他数学模型中。
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模型
将AR和MA模型混合可得到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模型的最佳参数p和q呢?最常用的技术是采用循环在p和q各自0到5(或者更大)的范围内搜索最小AIC或BIC的(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)
·
df1 = diff(series)
adf.test(df1)
·
acf(df1)
pacf(df1)
·
·
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模型模拟与识别
-
-
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)
(2)AR(2)
:
D = arima.sim ( list( order = c(2, 0, 0), ar=c(0.8,0.1) ), n = 200 )
##这里符号我还没验证是指正还是指负。
(2)MA(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(2,2)的时间序列,然后分别运用两个函数进行估计。
library(forecast);
s.e.
s.e.
但是还是存在一些困难难以克服。在我们难以定阶时,尤其是ARMA(p,q)模型中,难以确定arima() 函数中的阶数,因为我们并不知道p,q真正是多少。而在试验过程中,我测试了多组时序数据,在样本量200时auto.arima()确定的阶数也常常和模拟的参数不一样,这就是说auto.arima的结果(即AIC准则结果)经常不准确。
不过,在评价模型结果时,可以采取这样的标准:只要残差序列为纯随机序列,就可以认为模型已经建立成功。可以这样获取残差序列:
resid=ARIMA$residual
-
-
下面给出一个较为完整的例子:
plot(D) ;
par(mfrow=c(1,2)) ; acf(D) ; pacf(D)
summary(ARIMA)
ARIMA.auto=auto.arima(D)
summary(ARIMA.auto)
Box.test(resid,lag=6)
Box.test(resid,lag=12)
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")
pre2=forecast.Arima(ARIMA,h=10,level=c(0.95))
pre2
plot.forecast(pre2)