微信公众号:数据皮皮侠
如果你觉得该公众号对你有帮助,欢迎关注、推广和宣传
内容目录:时间序列 Python实现
时间序列——ARIMA模型AR模型、MA模型、 ARIMA模型
时间序列——ARIMA模型
1.时间序列常用模型
1 平滑法:用于趋势分析与预测,削弱短息随机波动对序列的影响,平滑技术有移动平均法和指数平滑法
2 趋势拟合法:把时间作为自变量,观察序列值为因变量,建立回归模型,具体可分为线性和曲线拟合
3 组合模型:时间序列趋势主要收到长期趋势(T)、季节变动(S)、周期波动(C)和不规则波动(
)四个因素影响,可构建
加法模型: 
乘法模型: 
4 AR模型: 
以前p期的序列值
为自变量,
为其线性模型
5 MA模型: 
$x{t}$与以前各期的序列值无关,是前q期的随机扰动项的线性回归模型
6 ARMA模型:
不仅与前各期序列值有关,还与随机扰动项有关
7 ARIMA模型:许多非平稳序列差分后会显示平稳序列的性质,称这个非平稳为差分平稳序列。对查分平稳用ARIMA模型进行拟合
8 ARCH模型:ARCH模型能准确地模拟时间序列变量的波动性的变化,适用于序列具有异方差性质且异方差函数短期自相关
9 GARCH模型及衍生模型:GARCH模型称为广义ARCH模型,是ARCH模型的拓展。相比ARCH模型,GARCH模型及其衍生模型更能反映实际序列中的长期记忆性、信息的非对称性等性质
2. 时间序列预处理
纯随机性和平稳性检验(时间序列预处理)
1 纯随机序列又称白噪声序列,序列的各项没有任何关系。白噪声序列是没有信息可提取的平稳序列
2 对于平稳的非白噪声序列,它的均值和方差是常数,ARMA是最常用的平稳序列拟合模型
3 非平稳序列,均值方差不稳定,一般将其转为平稳序列,这样可以用如ARMA。如果一个序列差分后具有平稳性,则该序列为差分平稳序列,可用ARIMA
2.1 平稳性检验
(1)平稳时间序列定义
如果时间序列
在某一常数附件波动且范围有限,即有常数均值方差,且延迟$k$期的序列变量的子自协方差和自相关系数是相等的,则
是平稳序列。
自协方差和自相关系数衡量同一个事件在两个不同时期时期(t,s)之间的相关程度,形象可以说是度量自己过去行为对自己现在行为的影响。
任取
定义时间序列
的自协方差函数
和自相关系数
)
(2)平稳性检验
1)时序图检验:根据平稳时间序列的均值和方差都为常数的性质,平稳时间序列的时序图显示该序列始终在一个常数值附近随机波动,而且波动有界。
2)自相关检验:;平稳时间序列具有短期相关性,这表明平稳时间序列通常只有近期的序列值对现在的值影响较明显。随着延迟期数$k$的增加,平稳序列的自相关系数会衰减趋向于零,并在零附近随机波动,而非平稳序列的的自相关系数衰减速度较慢。
3)单位根检验:如果存在单位根就是非平稳时间序列了
2.2 纯随机性检验
如果一个序列式是纯随机序列,满足
。实际上纯随机序列的样本自相关系数不会绝对为零,但很接近零并在零附近随机扰动。
纯随机性检验又称白噪声检验,一般是构造检验统计量:Q统计量和LB统计量
3 平稳时间序列分析
3.1 AR模型
:
$
随机干扰项
为均值为零的白噪声序列
均值方差为常数,ACF拖尾,PACF p阶截尾
3.2 MA模型
: 
随机干扰项
为均值为零的白噪声序列,
时序列均值
均值方差为常数,ACF q阶截尾,PACF拖尾
3.3 ARMA模型
: 
随机干扰项
为均值为零的白噪声序列
均值方差为常数,ACF拖尾,PACF拖尾
3.4 平稳时间序列建模
平稳非白噪声序列
计算ACF,PACF
ARMA模型识别【模型定阶,根据ACF,PACF的拖尾与截尾性质】
估计模型中未知参数的值
模型检验(Y进入第六步,N返回第三部)
模型优化
预测将来趋势
4. 非平稳时间序列分析
对非平稳时间的序列的分析方法可以分为确定性因素分解的时间序列分析和随机时间序列分析的两大类
确定性因素分解把时间序列变化归结为4个因素(长期趋势,季节变动,循环变动和随机波动)的综合影响。
随机时序分析可以建立的模型有ARIMA模型、残差自回归模型、季节模型、异方差模型
4.1 差分运算
1) p阶差分运算
相距一期的两个序列值之间的减法运算称为1阶差分运算
2)k步差分
相距k期的两个序列值之间的减法运算称为k步差分运算
4.2 ARIMA模型
许多非平稳序列差分后会显示出平稳序列的性质,这时这个非平稳序列为差分平稳序列。对差分平稳序列用ARIMA模型进行拟合。ARIMA模型的实质就是差分运算和ARMA模型的组合。
步骤:
1. 获取观察值序列
2. 平稳性检验(平稳则跳过第三步)
3. 差分运算
4. 白噪声检验(纯随机性检验,Y退出分析,N进入下一步)
5. ARIMA拟合
案例:2015/1/1~2015/2/6某餐厅销售数据进行建模
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #seaborn画出的图更好看,且代码更简单,缺点是可塑性差
from statsmodels.graphics.tsaplots import plot_acf #自相关图
from statsmodels.tsa.stattools import adfuller as ADF #平稳性检测
from statsmodels.graphics.tsaplots import plot_pacf #偏自相关图
from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
from statsmodels.tsa.arima_model import ARIMA
#seaborn 是建立在matplotlib之上的
%matplotlib inline
%pylab inline
#jupyter中文显示是方框,加入下面两行即可显示中文,若嫌麻烦,也可去网上搜索如何永久显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
pylab.rcParams['figure.figsize'] = (10, 6) #设置输出图片大小
sns.set(color_codes=True) #seaborn设置背景
#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式
data = pd.read_excel('arima_data.xls', index_col = u'日期')
#时序图
data.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1cea2ebceb8>
有明显的递增趋势,可以判断是非平稳的
#自相关图
plot_acf(data).show()
自相关图显示自相关系数长期大于零,说明时间序列有很强的相关性
#平稳性检测
print(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))
#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
原始序列的ADF检验结果为: (1.8137710150945274, 0.9983759421514264, 10, 26, {'1%': -3.7112123008648155, '5%': -2.981246804733728, '10%': -2.6300945562130176}, 299.46989866024177)
单位根统计量对应的p的值显著大于0.05,最终判断该序列是非平稳序列的(非平稳不一定不是白噪声)
#1阶差分后的结果
D_data = data.diff().dropna() #1阶差分,丢弃na值
D_data.columns = [u'销量差分'] #更改列名
D_data.plot() #时序图
<matplotlib.axes._subplots.AxesSubplot at 0x1cea2e92630>
plot_acf(D_data).show() #自相关图
print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测
差分序列的ADF检验结果为: (-3.1560562366723532, 0.02267343544004886, 0, 35, {'1%': -3.6327426647230316, '5%': -2.9485102040816327, '10%': -2.6130173469387756}, 287.5909090780334)
1阶差分后时序图在均值附近平稳的波动、自相关图有较强的短期相关性、单位根检验p值小于0.05,所以1阶差分后的序列是平稳序列
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值
差分序列的白噪声检验结果为: (array([11.30402222]), array([0.00077339]))
输出p值远小于0.05,所以1阶差分之后是平稳非白噪声序列
拟合ARMA模型:一种人为识别,看差分后的ACF\PACF,第二种方法是相对最有模型
plot_pacf(D_data).show()
一阶差分后的自相关图显示出一阶截尾,偏自相关显示拖尾性,所以考虑MA(1)模型进行拟合1阶差分后的序列,即对原序列建立ARIMA(0,1,1)模型
#相对最优模型
data[u'销量'] = data[u'销量'].astype(float) #销量转为float类型
#定阶
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10) #一般阶数不超过length/10
bic_matrix = [] #bic矩阵
for p in range(pmax+1):
tmp = []
for q in range(qmax+1):
try: #存在部分报错,所以用try来跳过报错。
tmp.append(ARIMA(data, (p,1,q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值
p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值为:%s、%s' %(p,q))
BIC最小的p值和q值为:0、1
model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #给出一份模型报告
model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。
(array([4873.9665477 , 4923.92261622, 4973.87868474, 5023.83475326,
5073.79082178]),
array([ 73.08574262, 142.32680643, 187.54283213, 223.80283273,
254.95705912]),
array([[4730.72112437, 5017.21197102],
[4644.96720157, 5202.87803086],
[4606.3014882 , 5341.45588128],
[4585.18926146, 5462.48024505],
[4574.0841683 , 5573.49747526]]))
python主要的时间序列模式算法函数
Time Series analysis 官方文档
acf() 计算自相关系数 statsmodels.tsa.stattols
plt_acf() 画自相关系数 statsmodels.graphics.tsaplots
pacf() 计算片相关系数 statsmodels.tsa.stattols
plot_acf() 画偏相关系数 statsmodels.graphics.tsaplots
adfuller() 对观测值序列进行单位根检验 statsmodels.tsa.stattols//ADF test
diff() 对观测值进行查分计算 pandas对象自带的方法
ARIMA() 创建一个ARIMA序列模型 statsmodels.tsa.arima_model
summary()&summaty2 给出一分ARIMA模型的报告 ARIMA模型对象自带方法
aic/bic/hqic 计算ARIMA模型的AIC/BIC/HQIC指标值 ARIMA模型对象自带方法
froecast() 应用构建的时间序列进行预测 ARIMA模型对象自带方法
acorr_ljungbox() Ljung-Box检验,检验是否为白噪声 statsmodels.stats.diagnostic
参考资料:
《python数据分析与挖掘实战》张良均、王路、谭立云、苏剑林著

