时间序列:ARMA

前言

ARMA:auto regressive moving average model,自回归移动平均模型,简称arma模型。
该模型是研究时间序列的重要方法。
时间序列最大的用处就是用来预测未来的事情,各种手段也都是为了提高预测的精度。
该模型由2部分构成:ar(auto regressive自回归模型)和ma(moving average移动平均模型)

做时间序列,主要时间都消耗在把不平稳的时间序列,转成平稳的时间序列,也就是ARIMA中的I的参数,接着当然就是AR和MA的参数p和q。
复制代码

AR自回归模型

ar:auto regressive自回归
ar模型的思想很简单,任务当前时间的结果xt和之前各个时间的结果相关。
简单来说就是当前的结果等于历史数据的加权平均,然后再加上当前时间t的一个扰动εt,
我们只需要计算出各个时刻的权重参数ϕ即可,公式如下:
xt=ϕ0+ϕ1xt−1+ϕ2xt−2+......ϕpxt−p+εt
公式中的xt-1,xt-2,....xt-p,都是之前时间的值,p参数是我们需要确定的值。
复制代码

MA移动平均模型

MA模型的思想也非常的朴素,认为当前的结果xt与之前的扰动相关,简单的来说就是认为xt主要受过去q期的误差项影响,
即当前的结果等于历史扰动的加权平均,然后再加上历史结果的均值μ,
我们也是只需要算出各个参数ϕ就可以了。
这个也非常好理解,如果咱们的数据是在均值附近不断波动的,是什么让数据波动的呢?就是扰动项,扰动使得数据不断的变化,最终变成当前的数据。
xt=μ+εt−θ1εt−1−θ2εt−2−......θpεt−q
q参数是我们需要确定的值。
复制代码

ARMA模型

ARMA模型是最常用的`平稳序列拟合模型`,xt不仅与以前p期的序列值有关,还与前q期的随机扰动有关。
也就是说ARMA模型的公式是把AR模型的公式和MA模型的公式组合起来。
在这个公式中,我们需要计算
xt=ϕ0+ϕ1xt−1+ϕ2xt−2+......ϕpxt−p+εt−θ1εt−1−θ2εt−2−......θpεt−q
复制代码

ARIMA模型定阶

我们需要计算以上的几个参数,这几个参数使得我们的模型的预测误差越小,我们的模型就越好。
复制代码

衡量时间序列预测模型优劣的指标

AIC
BIC
通常来讲,akaike information criterion(AIC)和bayesian information criterion(BIC)是评价模型优良的两个指标。这两种评价指标不仅适用于事件序列模型,还广泛广泛运用于其他数学模型中。
AIC=−2ln(L)+2k
BIC=−2ln(L)+ln(n)∗k 

让我们来理解AIC的含义,AIC由两部分组成,一部分是对数极大似然函数,另一部分则是参数的个数。
极大似然函数是评价模型拟合优劣性的指标,值越大说明拟合的效果越好。
然而使用过多的参数可以拟合的很好却会出现过度拟合的情况,这样的模型泛化能力很差,因此加上参数的个数实际上是对极大似然函数进行”惩罚“。
选取AIC值最小的模型作为最优模型,实质上是平衡了欠拟合和过拟合。
复制代码
# 创建训练数据
train_start = datetime(2019,10,1)
train_end = datetime(2020,10,1)
train_data = df[train_start:train_end]

#定阶
warnings.filterwarnings("ignore") # specify to ignore warning messages

pmax,qmax,dmax,smax = 8 ,8 ,2 ,7
# p是AR阶数,q是MA阶数, d是差分次数, s是周期
pdq = itertools.product(range(1,pmax+1),range(1,dmax+1),range(1,qmax+1),[smax])
aic_matrix = {} #aic矩阵

for p,d,q,s in pdq:
    try:
        model = SARIMAX(endog=train_data['cnt'],order=(p,d,q,s))
        results = model.fit(disp=True)
        aic_matrix['{},{},{}'.format(p,d,q)] = results.aic
        print('ARIMA p:{} d:{} q:{} - AIC:{}'.format(p, d, q, results.aic))
    except:
        continue
p,d,q = sorted(aic_matrix.items(), key=lambda x: x[1])[0][0].split(',')
print('AIC最小的p : {}, d : {}, q : {}'.format(p,d,q),end='\r')

#ARIMA p:8 d:1 q:8 - AIC:9138.284284512645
#ARIMA p:8 d:2 q:1 - AIC:9165.776270275972
#ARIMA p:8 d:2 q:2 - AIC:9166.238801899044
#ARIMA p:8 d:2 q:3 - AIC:9166.731346671577
#ARIMA p:8 d:2 q:4 - AIC:9169.846039297874
#ARIMA p:8 d:2 q:5 - AIC:9167.21095209448
#ARIMA p:8 d:2 q:6 - AIC:9145.26033882199
#ARIMA p:8 d:2 q:7 - AIC:9129.24423753544
#ARIMA p:8 d:2 q:8 - AIC:9132.197927380188
#AIC最小的p : 6, d : 2, q : 7

复制代码

ARMA和ARIMA的区别

<1>运用对象不同

AR,MA,ARMA都是运用于原始数据是平稳的时间序列。
ARIMA运用于原始数据差分后是平稳的时间序列。
复制代码

<2>时间序列不同

AR(自回归模型),AR ( p) ,p阶的自回归模型。
MA(移动平均模型),MA(q),q阶的移动平均模型。
ARIMA(差分自回归移动平均模型)。
复制代码

<3>平稳性差别

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)模型,
     那么称原始序列yt服从ARIMA(p, k, q)模型。
也就是说,原始序列是I(k)序列,k次差分后是平稳序列I(0)。平稳序列I(0)服从ARMA模型,而非平稳序列I(k)服从ARIMA模型。
复制代码

平稳时间序列和非平稳时间序列

当时间序列的每期数据都具有相同的`概率分布`时,我们称这个时间序列是平稳的。
如果时间序列的概率分布是随着时间变化而变化的,那么这个时间序列就是不平稳的。

在AR模型中,只要自回归系数的绝对值都是小于1的,那么序列就是平稳的。
所以如果一个序列,自回归系数等于1,就是不平稳的序列了。
复制代码

什么是差分

差分是非平稳序列转平稳序列的方法。
非平稳序列往往一次到两次差分之后,就会变成平稳序列。
什么是差分呢?就是后一时间点的值减去当前时间点的值,也就是yt - yt-1。
复制代码

如何判定序列是否为平稳的

猜你喜欢

转载自juejin.im/post/7053691622063603749
今日推荐