ARIMA时间序列建模过程——原理及python实现
时间序列分析建模步骤及Python实现

时间序列分析建模步骤及Python实现平稳时间序列的意义根据数理统计学常识,要分析的随机变量获得的样本信息越多,分析的结果就会越可靠,但由于时间序列分析的特殊数据结构,对随机序列{...,X1,X2...,Xt,...}⽽⾔,它在任意时刻 t 的序列值 Xt 都是⼀个随机变量,⽽且由于时间的不可重复性,该变量在任意⼀个时刻都只能获得唯⼀的样本观察值,通常是没有办法分析的。
在平稳序列场合⾥,序列的均值等于常数,意味着原本含有可列多个随机变量的均值序列变成了⼀个常数序列,原本每个随机变量的均值只能依靠唯⼀的⼀个样本观察值去估计,现在每⼀个样本观察值都变成了常数均值的样本观察值,这极⼤的减少了随机变量的个数,并增加了待估参数的样本容量。
平稳性校验⼀种是根据时序图和⾃相关图显⽰的特征做出判断的图检验⽅法(⾃相关图是⼀个平⾯⼆维坐标悬垂线图,⼀个坐标轴便是延迟时期数,另⼀个坐标轴表⽰⾃相关系数,通常以悬垂线表⽰⾃相关系数的⼤⼩。
⾃相关图进⾏平稳性判断的标准:随着延迟期数 k 的增加,平稳序列的⾃相关系数会很快的衰减向零;反之,⾮平稳序列的⾃相关系数衰减向零的速度通常⽐较慢)import numpy as npimport pandas as pdfrom datetime import datetimeimport matplotlib.pylab as pltfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacf#读取原始时间序列数据df=pd.read_csv('wq.csv',encoding='utf-8', index_col='datatime') #从csv⽂件中读取时间序列数据,index_col列定义为索引对象df.index=pd.to_datetime(df.index)ts=df['dataColumn'] #指定时间序列中对应的数据列ts.head()ts.head().indexts=ts.dropna() #去除掉时间序列中的空值,否则⽆法绘制出正常的acf图#输出原始序列f = plt.figure(facecolor='white')ts.plot(color='blue', label='Original')plt.title('TimeSeries Original Data')plt.show()#输出ACF(⾃相关图)、PACF(偏⾃相关图)f = plt.figure(facecolor='white')ax1 = f.add_subplot(211)plot_acf(ts, lags=31, ax=ax1)ax2 = f.add_subplot(212)plot_pacf(ts, lags=31, ax=ax2)plt.show()另⼀种是构造检验统计量进⾏假设检验的⽅法(⽬前最常⽤的平稳性统计校验⽅法是单位根检验,DF检验和ADF检验)DF检验只适合1阶⾃回归过程的平稳性检验,ADF检验是对DF检验做了⼀个修正,得到增⼴DF检验(augrmented Dickey-Fuller)。
用python做时间序列预测九:ARIMA模型简介

⽤python做时间序列预测九:ARIMA模型简介本篇介绍时间序列预测常⽤的ARIMA模型,通过了解本篇内容,将可以使⽤ARIMA预测⼀个时间序列。
什么是ARIMA?ARIMA是'Auto Regressive Integrated Moving Average'的简称。
ARIMA是⼀种基于时间序列历史值和历史值上的预测误差来对当前做预测的模型。
ARIMA整合了⾃回归项AR和滑动平均项MA。
ARIMA可以建模任何存在⼀定规律的⾮季节性时间序列。
如果时间序列具有季节性,则需要使⽤SARIMA(Seasonal ARIMA)建模,后续会介绍。
ARIMA模型参数ARIMA模型有三个超参数:p,d,qpAR(⾃回归)项的阶数。
需要事先设定好,表⽰y的当前值和前p个历史值有关。
d使序列平稳的最⼩差分阶数,⼀般是1阶。
⾮平稳序列可以通过差分来得到平稳序列,但是过度的差分,会导致时间序列失去⾃相关性,从⽽失去使⽤AR项的条件。
qMA(滑动平均)项的阶数。
需要事先设定好,表⽰y的当前值和前q个历史值AR预测误差有关。
实际是⽤历史值上的AR项预测误差来建⽴⼀个类似归回的模型。
ARIMA模型表⽰AR项表⽰⼀个p阶的⾃回归模型可以表⽰如下:c是常数项,εt是随机误差项。
对于⼀个AR(1)模型⽽⾔:当ϕ1=0 时,yt 相当于⽩噪声;当ϕ1=1 并且 c=0 时,yt 相当于随机游⾛模型;当ϕ1=1 并且 c≠0 时,yt 相当于带漂移的随机游⾛模型;当ϕ1<0 时,yt 倾向于在正负值之间上下浮动。
MA项表⽰⼀个q阶的预测误差回归模型可以表⽰如下:c是常数项,εt是随机误差项。
yt 可以看成是历史预测误差的加权移动平均值,q指定了历史预测误差的期数。
完整表⽰即: 被预测变量Yt = 常数+Y的p阶滞后的线性组合 + 预测误差的q阶滞后的线性组合ARIMA模型定阶看图定阶差分阶数d如果时间序列本⾝就是平稳的,就不需要差分,所以此时d=0。
ARIMA模型原理以及代码实现案例

ARIMA模型原理以及代码实现案例⼀、时间序列分析北京每年每个⽉旅客的⼈数,上海飞往北京每年的游客⼈数等类似这种顾客数、访问量、股价等都是时间序列数据。
这些数据会随着时间变化⽽变化。
时间序列数据的特点是数据会随时间的变化⽽变化。
随机过程的特征值有均值、⽅差、协⽅差等。
如果随机过程的特征随时间变化⽽变化,那么数据是⾮平稳的,相反,如果随机过程的特征随时间变化⽽不变化,则此过程是平稳的。
如图所⽰:⾮平稳时间序列分析时,若导致⾮平稳的原因是确定的,可以⽤的⽅法主要有趋势拟合模型、季节调整模型、移动平均、指数平滑等。
若导致⾮平稳的原因是随机的,⽅法主要有ARIMA,以及⾃回归条件异⽅差模型等。
⼆、ARIMA1、简介ARIMA通常⽤于需求预测和规划中。
可以⽤来对付随机过程的特征随着时间变化⽽⾮固定。
并且导致时间序列⾮平稳的原因是随机⽽⾮确定的。
不过,如果从⼀个⾮平稳的时间序列开始,⾸先需要做差分,直到得到⼀个平稳的序列。
模型的思想就是从历史的数据中学习到随时间变化的模式,学到了就⽤这个规律去预测未来。
ARIMA(p,d,q)d是差分的步长(差分的阶数指的是进⾏多少次差分。
⽐如步长为n的⼀阶差分diff(x) = f(x) - f(x - n),⽽⼆阶步长为n的差分: diff(x) = f(x) - f(x-n), diff(x-n) = f(x-n) - f(x - n - n), diff⼆阶差分(x - n) = diff(x) - diff(x-n)),⽤来得到平稳序列p为相应的⾃回归项q是移动平均项数2、⾃回归模型AR⾃回归模型描述当前值与历史值之间的关系,⽤变量⾃⾝的历史时间数据对⾃⾝进⾏预测。
⾃回归模型必须满⾜平稳性。
⾃回归模型需要先确定⼀个阶数p,表⽰⽤⼏期的历史值来预测当前值。
p阶⾃回归模型可以表⽰为:y t是当前值,u是常数项,p是阶数,r是⾃相关系数,e是误差AR的限制:⾃回归模型是⾃⾝的数据进⾏预测必须具有平稳性必须具有相关性如果⾃相关系数⼩⾬0.5,则不宜采⽤⾃回归只适⽤于预测与⾃⾝前期相关的现象3、移动平均模型MA移动平均模型关注的⾃回归模型中的误差项的累加,q阶⾃回归过程的公式定义如下:移动平均模型能有效地消除预测中的随机波动4、⾃回归移动平均模型ARMA⾃回归模型AR和移动平均模型MA模型相结合,我们就得到了⾃回归移动平均模型ARMA(p,q),计算公式如下:5、p、q的确定 (1) (2)结合最终的预测误差来确定p、q的阶数,在相同的预测误差情况下,根据奥斯卡姆剃⼑准则,模型越⼩越好。
Python时间序列处理之ARIMA模型的使用讲解

Python时间序列处理之ARIMA模型的使⽤讲解ARIMA模型ARIMA模型的全称是⾃回归移动平均模型,是⽤来预测时间序列的⼀种常⽤的统计模型,⼀般记作ARIMA(p,d,q)。
ARIMA的适应情况ARIMA模型相对来说⽐较简单易⽤。
在应⽤ARIMA模型时,要保证以下⼏点:时间序列数据是相对稳定的,总体基本不存在⼀定的上升或者下降趋势,如果不稳定可以通过差分的⽅式来使其变稳定。
⾮线性关系处理不好,只能处理线性关系判断时序数据稳定基本判断⽅法:稳定的数据,总体上是没有上升和下降的趋势的,是没有周期性的,⽅差趋向于⼀个稳定的值。
ARIMA数学表达ARIMA(p,d,q),其中p是数据本⾝的滞后数,是AR模型即⾃回归模型中的参数。
d是时间序列数据需要⼏次差分才能得到稳定的数据。
q是预测误差的滞后数,是MA模型即滑动平均模型中的参数。
a) p参数与AR模型AR模型描述的是当前值与历史值之间的关系,滞后p阶的AR模型可以表⽰为:其中u是常数,et代表误差。
b) q参数与MA模型MA模型描述的是当前值与⾃回归部分的误差累计的关系,滞后q阶的MA模型可以表⽰为:其中u是常数,et代表误差。
c) d参数与差分⼀阶差分:⼆阶差分:d) ARIMA = AR+MAARIMA模型使⽤步骤获取时间序列数据观测数据是否为平稳的,否则进⾏差分,化为平稳的时序数据,确定d通过观察⾃相关系数ACF与偏⾃相关系数PACF确定q和p得到p,d,q后使⽤ARIMA(p,d,q)进⾏训练预测Python调⽤ARIMA#差分处理diff_series = diff_series.diff(1)#⼀阶diff_series2 = diff_series.diff(1)#⼆阶#ACF与PACF#从scipy导⼊包from scipy import statsimport statsmodels.api as sm#画出acf和pacfsm.graphics.tsa.plot_acf(diff_series)sm.graphics.tsa.plot_pacf(diff_series)#arima模型from statsmodels.tsa.arima_model import ARIMAmodel = ARIMA(train_data,order=(p,d,q),freq='')#freq是频率,根据数据填写arima = model.fit()#训练print(arima)pred = arima.predict(start='',end='')#预测总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
ARIMa--时间序列模型

ARIMa--时间序列模型⼀、概述 在⽣产和科学研究中,对某⼀个或者⼀组变量 x(t)x(t) 进⾏观察测量,将在⼀系列时刻 t1,t2,⋯,tnt1,t2,⋯,tn 所得到的离散数字组成的序列集合,称之为时间序列。
时间序列分析是根据系统观察得到的时间序列数据,通过曲线拟合和参数估计来建⽴数学模型的理论和⽅法。
时间序列分析常⽤于国民宏观经济控制、市场潜⼒预测、⽓象预测、农作物害⾍灾害预报等各个⽅⾯。
ARIMA模型,全称为⾃回归积分滑动平均模型(Autoregressive Integrated Moving Average Model),是由博克思(Box)和詹⾦斯(Jenkins)于20世纪70年代初提出的⼀种时间序列预测⽅法。
ARIMA模型是指在将⾮平稳时间序列转化为平稳时间序列过程中,将因变量仅对它的滞后值以及随机误差项的现值和滞后值进⾏回归所建⽴的模型。
注意:时间序列模型适⽤于做短期预测,即统计序列过去的变化模式还未发⽣根本性变化。
⼆、原理 ARIMA(p,d,q) 称为差分⾃回归移动平均模型,根据原序列是否平稳以及回归中所含部分的不同,包括移动平均过程(MA)、⾃回归过程(AR)、⾃回归移动平均过程(ARMA)和⾃回归滑动平均混合过程(ARIMA)。
AR是⾃回归,p为⾃回归项;MA为移动平均,q为移动平均项数,d为时间序列变为平稳时间序列时所做的差分次数。
三、时间序列建模步骤 1.数据的准备,准备带观测系统的时间序列数据 2.数据可视化,观测是否为平稳时间序列,若是⾮平稳时间序列,则需要进⾏d阶差分运算,将其化为平稳时间序列 3.得到平稳时间序列后,要对其分别求得⾃相关系数ACF,偏⾃相关系数PACF,通过对⾃相关图和偏⾃相关图的分析,得到最佳的阶层P,阶数q 4.由以上得到d,p,q,得到ARIMA模型,然后对模型进⾏模型检验四、典例解析 1.数据的准备 这⾥我们已经备好了数据,截图如下。
Python数据分析实验 实验十三 ARIMA时间序列分析

实验十三ARIMA时间序列分析学院:数计学院专业:统计学年级:2017 班:姓名:学号:【实验目的】1. 了解ARIMA相关概念;2. 掌握ARIMA模型的构建与应用;3. 学会在python中构建ARIMA模型【实验内容】一、时间序列的模拟1.平稳时间序列(1)随机游走序列(2)平稳时间序列2.非平稳序列模拟(1)布朗运动序列(2)非平稳时间序列3.时间序列分析模型(1)AR模型(自回归模型)模拟y1序列为AR(1)模拟的数据序列。
(2)MA模型(移动平均模型)模拟y1序列为MA(1)模拟的数据序列。
(3)ARMA模型(4)ARIMA模型ARIMA模型根据原序列是否平稳以及回归中所含部分的不同,包括移动平均过程(MA)、自回归过程(AR)、自回归移动平均过程(ARMA)及差分自回归移动平均过程(ARIMA)。
np.diff实现差分运算。
y4是一非平稳序列,要利用ARIMA模型处理则先转换为平稳系列,一般采用差分法。
dy4为一阶差分结果序列,从图初步可以判断该序列为平稳序列。
对比原序列与差分后的序列,可以看出一阶差分后数据趋于平稳。
4.ARMA模型的构建(1)自相关性检验:MA阶数确定对y2进行自相关性检验:自相关决定MA的阶数,从图可以看出,MA模型为1阶,与y2为MA(1)的模拟一致。
(2)偏自相关性检验:AR阶数确定对y1进行偏自相关性检验:偏自相关图可以看出,AR模型为1阶,与y1是AR(1)模拟一致。
(3)ARMA阶数的确定从上述acf()和pacf()图示中可以看到,MA阶q=4,AR阶p=2,即应该是ARMA模型。
但很多时候往往用图示法得到的p和q不可靠,因此用信息量准则。
根据信息量最小准则,对y1序列应该建立ARMA(1,0).根据信息量最小准则,对y1序列应该建立ARMA(0,1).根据信息量BIC最小,y3序列可选择构建ARMA(1,1),与我们的模拟相一致。
(4)参数的估计与检验序列y1的ARMA模型:y1序列的估计和模拟模型AR(1):y(t)=0.8y(t-1)+u(t)基本吻合,常数项不显著。
arima时间序列预测模型python简单
arima时间序列预测模型python简单ARIMA时间序列预测模型(Python简介)时间序列预测是指根据过去的数据来预测未来一段时间内的数值或趋势。
在实际应用中,时间序列预测模型被广泛应用于财务预测、经济预测、股票市场分析等领域。
ARIMA(自回归移动平均)模型是一种经典的时间序列预测模型,它的强大之处在于可以适应多种非线性趋势和季节性模式。
Python是一种功能强大的编程语言,拥有丰富的数据处理和分析库。
其中,statsmodels包提供了ARIMA模型的实现。
本文将介绍ARIMA时间序列预测模型的基本概念,并结合Python代码实例展示其使用方法。
## 1. ARIMA模型介绍ARIMA模型是由AR(自回归)、I(差分)和MA(移动平均)三个部分构成的。
- 自回归(AR):自回归是指通过观察过去一段时间内的值来预测未来的值。
AR模型将未来的值与过去一段时间内的多个过去值进行线性组合。
- 差分(I):差分是指对时间序列进行一阶或多阶差分操作,目的是消除趋势和季节性。
- 移动平均(MA):移动平均是将未来的值与过去一段时间内的误差项进行线性组合。
ARIMA模型的建立需要确定AR、I和MA的参数。
利用时间序列的自相关图ACF(自相关函数)和偏自相关图PACF(偏自相关函数)可以辅助确定这些参数。
## 2. Python实现ARIMA模型在Python中,利用statsmodels库可以方便地实现ARIMA模型。
下面我们将通过一个例子来演示其使用方法。
首先,我们需要导入必要的库:```pythonimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom statsmodels.tsa.arima.model import ARIMA```然后,我们读取时间序列数据并进行预处理。
假设我们的时间序列数据保存在名为"data.csv"的文件中,其中包含两列数据:日期和数值。
arima predict python代码 -回复
arima predict python代码-回复【ARIMA predict Python代码】,以下将详细介绍ARIMA模型以及使用Python编写ARIMA预测模型的代码。
ARIMA(差分自回归移动平均模型)是一种常用的时间序列预测模型,它结合了自回归模型(AR)和移动平均模型(MA),并具有差分(D)的功能。
在这篇文章中,我们将一步一步介绍ARIMA模型的原理,并用Python编写代码来实现ARIMA模型的预测。
1. 什么是ARIMA模型?ARIMA模型是时间序列预测的一种常用方法,它通过将时间序列分解为自回归项、差分项和移动平均项,并利用这些分解部分的组合来预测未来的值。
ARIMA模型通常可以表示为ARIMA(p, d, q)的形式,其中p表示自回归项(AR的阶数),d表示差分项(差分的次数),q表示移动平均项(MA的阶数)。
2. ARIMA模型的原理ARIMA模型的原理可以分为三个部分:- 自回归项(AR):它表示时间序列当前值与过去若干个值之间的关系。
AR项具有记忆性,即当前值受到过去值的影响。
- 差分项(D):它表示对时间序列进行差分操作,以使其平稳化。
差分操作可以消除时间序列中的趋势或季节性等非平稳性,使得序列更易于建模和预测。
- 移动平均项(MA):它表示时间序列当前值与过去若干个误差的加权和之间的关系。
MA项用于捕捉序列中的随机波动,以及自回归和差分无法解释的部分。
3. 如何使用Python编写ARIMA预测模型的代码?下面是一步一步编写ARIMA预测模型的代码:步骤1: 导入所需的库pythonimport pandas as pdfrom statsmodels.tsa.arima.model import ARIMAimport matplotlib.pyplot as plt步骤2: 加载数据pythondata = pd.read_csv('data.csv', header=0, parse_dates=[0], index_col=0)步骤3: 数据预处理python# 对数据进行差分操作,使其平稳化diff = data.diff().dropna()步骤4: 拟合ARIMA模型pythonmodel = ARIMA(diff, order=(1, 1, 1))model_fit = model.fit()步骤5: 预测未来值python# 预测未来5个时间点的值forecast = model_fit.forecast(steps=5)[0]步骤6: 可视化预测结果python# 绘制原始数据和预测结果的折线图plt.plot(data.values, label='Actual')plt.plot(model_fit.fittedvalues, color='red', label='ARIMA')plt.plot(data.index[-1] + pd.DateOffset(1), forecast, color='green', marker='o', label='Forecast')plt.legend()plt.show()通过以上6个步骤,我们就可以使用Python编写ARIMA预测模型的代码。
时间序列ARIMA模型详解:python实现店铺一周销售量预测
时间序列ARIMA模型详解:python实现店铺⼀周销售量预测顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合。
这些集合被分析⽤来了解长期发展趋势,为了预测未来或者表现分析的其他形式。
但是是什么令时间序列与常见的回归问题的不同?有两个原因:1、时间序列是跟时间有关的。
所以基于线性回归模型的假设:观察结果是独⽴的在这种情况下是不成⽴的。
2、随着上升或者下降的趋势,更多的时间序列出现季节性趋势的形式,如:特定时间框架的具体变化。
即:如果你看到⽺⽑夹克的销售上升,你就⼀定会在冬季做更多销售。
常⽤的时间序列模型有AR模型、MA模型、ARMA模型和ARIMA模型等。
⼀、时间序列的预处理拿到⼀个观察值序列之后,⾸先要对它的平稳性和纯随机性进⾏检验,这两个重要的检验称为序列的预处理。
根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采⽤不同的分析⽅法。
先说下什么是平稳,平稳就是围绕着⼀个常数上下波动且波动范围有限,即有常数均值和常数⽅差。
如果有明显的趋势或周期性,那它通常不是平稳序列。
序列平稳不平稳,⼀般采⽤三种⽅法检验:(1)时序图检验看看上⾯这个图,很明显的增长趋势,不平稳。
(2)⾃相关系数和偏相关系数还以上⾯的序列为例:⽤SPSS得到⾃相关和偏相关图。
分析:左边第⼀个为⾃相关图(Autocorrelation),第⼆个偏相关图(Partial Correlation)。
平稳的序列的⾃相关图和偏相关图要么拖尾,要么是截尾。
截尾就是在某阶之后,系数都为 0 ,怎么理解呢,看上⾯偏相关的图,当阶数为 1 的时候,系数值还是很⼤, 0.914. ⼆阶长的时候突然就变成了 0.050. 后⾯的值都很⼩,认为是趋于 0 ,这种状况就是截尾。
什么是拖尾,拖尾就是有⼀个缓慢衰减的趋势,但是不都为 0 。
⾃相关图既不是拖尾也不是截尾。
以上的图的⾃相关是⼀个三⾓对称的形式,这种趋势是单调趋势的典型图形,说明这个序列不是平稳序列。
ARIMA模型-[SPSSPython]
ARIMA模型-[SPSSPython] 简介: ARIMA模型:(英语:Autoregressive Integrated Moving Average model),差分整合移动平均⾃回归模型,⼜称整合移动平均⾃回归模型(移动也可称作滑动),是时间序列预测分析⽅法之⼀。
AR是“⾃回归”,p为⾃回归项数;MA为“滑动平均”,q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数)。
由于毕业论⽂要涉及到时间序列的数据(商品的销量)进⾏建模与分析,主要是对时间序列的数据进⾏预测,在对数据进⾏简单的散点图观察时,发现数据具有季节性,也就是说:数据波动呈现着周期性,并且前⾯的数据会对后⾯的数据产⽣影响,这也符合商品的销量随时间波动的影响。
于是选择了ARIMA模型,那为什么不选择AR模型、MA模型、ARMA模型 于是,通过这篇博客,你将学到: (1)通过SPSS操作ARIMA模型 (2)运⽤python进⾏⽩噪声数据判断 (3)为什么差分,怎么定阶 PS:在博客结尾,会附录上Python进⾏ARIMA模型求解的代码。
为什么会使⽤SPSS? 由于真⾹定理,在SPSS⾥有ARIMA、AR、MA模型的各种操作;还包括异常值处理,差分,⽩噪声数据判断,以及定阶。
⼀种很⽅便⼜不⽤编程还可以避免改代码是不是很爽… ARIMA模型的步骤 好啦,使⽤ARIMA模型的原因: 在过去的数据对今天的数据具有⼀定的影响,如果过去的数据没有对如今的数据有影响时,不适合运⽤ARIMA模型进⾏时间序列的预测。
使⽤ARIMA进⾏建模的步骤: 简单来说,运⽤ARIMA模型进⾏建模时,主要的步骤可以分成以下三步: (1)获取原始数据,进⾏数据预处理。
(缺失值填补、异常值替换) (2)对预处理后的数据进⾏平稳性判断。
如果不是平稳的数据,则要对数据进⾏差分运算。
(3)将平稳的数据进⾏⽩噪声检验;如果不是⽩噪声数据,则说明数据之间仍然有关联,需要进⾏ARIMA(p,d,q)重新定阶:p、q。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARIMA时间序列建模过程——原理及python实现ARIMA模型的全称叫做自回归查分移动平均模型,全称是(ARIMA, Autoregressive Integrated Moving Average Model),是统计模型(statistic model)中最常见的一种用来进行时间序列预测的模型,AR、MA、ARMA模型都可以看作它的特殊形式。
1. ARIMA的优缺点优点:模型十分简单,只需要内生变量而不需要借助其他外生变量。
缺点:要求时序数据是稳定的(stationary),或者是通过差分化(differencing)后是稳定的;本质上只能捕捉线性关系,而不能捕捉非线性关系。
2. ARIMA的参数与数学形式ARIMA模型有三个参数:p,d,q。
p--代表预测模型中采用的时序数据本身的滞后数(lags) ,也叫做AR/Auto-Regressive项;d--代表时序数据需要进行几阶差分化,才是稳定的,也叫Integrated 项;q--代表预测模型中采用的预测误差的滞后数(lags),也叫做MA/Moving Average项。
差分:假设y表示t时刻的Y的差分。
if d=0, yt=Yt, if d=1, yt=Yt−Yt−1, if d=2, yt=(Yt−Yt−1)−(Yt−1−Y t−2)=Yt−2Yt−1+Yt−2ARIMA的预测模型可以表示为:Y的预测值= 白噪音+1个或多个时刻的加权+一个或多个时刻的预测误差。
假设p,q,d已知,ARIMA用数学形式表示为:ytˆ=μ+ϕ1∗yt−1+...+ϕp∗yt−p+θ1∗et−1+...+θq∗et−q其中,ϕ表示AR的系数,θ表示MA的系数3.Python建模##构建初始序列import numpy as npimport matplotlib.pyplot as pltimport statsmodels.api as smfrom statsmodels.graphics.tsaplots import acf,pacf,plot_acf,plot_pacf from statsmodels.tsa.arima_model import ARMAfrom statsmodels.tsa.arima_model import ARIMA#序列化time_series_ = pd.Series([151.0, 188.46, 199.38, 219.75, 241.55, 262.58, 328.22, 396.26, 442.04, 517.77, 626.52, 717.08, 824.38, 913.38, 1088.39, 1325.83, 1700.92, 2109.38, 2499.77, 2856.47, 3114.02, 3229.29, 3545.39, 3880.53, 4212.82, 4757.45, 5633.24, 6590.19, 7617.47, 9333.4, 11328.92, 12961.1, 15967.61])time_series_.index =pd.Index(sm.tsa.datetools.dates_from_range('1978','2010'))time_series_.plot(figsize=(12,8))plt.show()3.1 异常值及缺失值处理异常值一般采用移动中位数方法:from pandas import rolling_medianthreshold = 3 #指的是判定一个点为异常的阈值df['pandas'] = rolling_median(df['u'], window=3,center=True).fillna(method='bfill').fillna(method='ffill')#df['u']是原始数据,df['pandas'] 是求移动中位数后的结果,window指的是移动平均的窗口宽度difference = np.abs(df['u'] - df['pandas'])outlier_idx = difference > threshold缺失值一般是用均值代替(若连续缺失,且序列不平稳,求查分时可能出现nan)或直接删除。
3.2 判断是时序数据是稳定的方法一般是观察时序图(稳定的数据是没有趋势(trend),没有周期性(seasonality)的; 即它的均值,在时间轴上拥有常量的振幅,并且它的方差,在时间轴上是趋于同一个稳定的值的。
该方式并不严谨)或单位跟检测(ADF是一种常用的单位根检验方法,他的原假设为序列具有单位根,即非平稳,对于一个平稳的时序数据,就需要在给定的置信水平上显著,拒绝原假设。
如果ADF统计量比临界值的值小,则可在该显著性水平下,拒绝原序列存在单位根的原假设,即原序列是平稳的。
反之,则接受原假设,是非平稳序列)确定。
ADF检验:t=sm.tsa.stattools.adfuller(time_series_log, )#ADF检测output=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","CriticalValue(5%)","Critical Value(10%)"],columns=['value'])output['value']['Test Statistic Value'] = t[0]output['value']['p-value'] = t[1]output['value']['Lags Used'] = t[2]output['value']['Number of Observations Used'] = t[3]output['value']['Critical Value(1%)'] = t[4]['1%']output['value']['Critical Value(5%)'] = t[4]['5%']output['value']['Critical Value(10%)'] = t[4]['10%']print(output)###————————————————-——result—————————————————--———#####valueTest Statistic Value0.807369p-value0.991754Lags Used 1Number of Observations Used31Critical Value(1%)-3.66143Critical Value(5%)-2.96053Critical Value(10%)-2.619323.3 不平稳处理1)对数处理。
对数处理可以减小数据的波动;time_series_log = np.log(time_series_)time_series_log.plot(figsize=(8,6))v0 = time_series_log[0]print(np.exp(time_series_log))plt.show()2)差分。
一般来说,非纯随机的时间序列经过一阶差分或二阶差分就会变得平稳。
在保证ADF检验的p<0.01的情况下,阶数越小越好,否则会带来样本减少、还原序列麻烦、预测困难等问题。
time_series = time_series_log.diff(1)time_series = time_series.dropna(how=any)time_series.plot(figsize=(8,6))plt.show()3.4 参数确定 关于pdq的选择一般是通过计算自相关系数(acf)和偏相关系数确定(pacf),观察两个相关系数图确定,平稳的序列的自相关图和偏相关图要么拖尾,要么是截尾。
截尾就是在某阶之后,系数都为0或趋于0,拖尾就是有一个缓慢衰减的趋势,但是不都为0。
同时,还可利用aic、bic统计量自动确定。
plot_acf(time_series)#acf图plot_pacf(time_series)#pacf图plt.show()#bic最小化选择最优参数,aic同理def proper_model(data_ts, maxLag):#init_bic = sys.maxint//python2init_bic = sys.maxsizeinit_p = 0init_q = 0for p in np.arange(maxLag):for q in np.arange(maxLag):model = ARMA(data_ts, order=(p,q))try:results_ARMA = model.fit()except:continuebic = results_ARMA.bicif bic < init_bic:init_p = pinit_q = qinit_bic = bicreturn init_bic, init_p, init_q3.5 模型拟合b,p,q = proper_model(time_series, 10)arima_mod = ARIMA(time_series_,order=(p,0,q))arma_mod = ARMA(time_series_,order=(p,q))result_arma = arma_mod.fit()3.6 模型检测假设检验,判断(诊断)残差序列是否为白噪声序列从而确定模型优劣。
Ljung-Box test是对randomness的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。
对于滞后相关的检验,我们常常采用的方法还包括计算ACF和PCAF并观察其图像,但是无论是ACF还是PACF都仅仅考虑是否存在某一特定滞后阶数的相关。