时间序列: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值最小的模型作为最优模型,实质上是平衡了欠拟合和过拟合。
```python
创建训练数据
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。
如何判定序列是否为平稳的
「其他文章」
- 机器学习:sklearn中xgboost模块的XGBRegressor函数(回归)
- 机器学习:xgboost原生库接口(陈天奇) && xgboost的sklearn接口
- Linux进程管理
- go:连接redis
- go:自定义类型,结构体struct
- go:go mod tidy的作用
- python:判定文件、目录是否存在,以及创建(多层)目录
- python:multiprosessing模块的Pool()类的apply()函数和apply_async()函数的区别
- python:ThreadPoolExecutor线程池和ProcessPoolExecutor进程池
- 时间序列:ARMA
- kafka:介绍
- 机器学习:损失函数(loss function)
- 机器学习:adaboost(回归实战)
- pyenv
- pyspark:集群环境实战
- spark:local模式环境-搭建和使用
- spark:standalone(独立集群环境)--搭建和使用
- spark:yarn集群环境-搭建和使用
- AB测试 - 假设检验的两类错误
- python:多进程的几种实现方式