AR、MA及ARMA模型

在上一讲中我们介绍了时间序列中最为重要的三个概念,在本讲里面会介绍几个最为基础的时间序列模型: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)

  • 若无法通过检验则需要对原序列进行差分,直到差分后的结果能够通过平稳性检验,从而确定d。

df1 = diff(series)

adf.test(df1)

  • 查看ACF和PACF图。

acf(df1)

pacf(df1)

  • 模式选择:通过EACF、AIC等技术,确定p、q的取值。

  • 训练模型,得到参数值。

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

Matlab和Python中的ARIMA实现

在Python中推荐采用pyflux这个库进行实现,具体实现过程可以详见:pyflux.com/arima-models

Matlab可利用EconometricsToolbox实现,详见:Estimate ARIMA or ARIMAX model parameters

发布于 2016-08-31 09:17