您的位置:首页 > 编程语言 > Python开发

时间序列python

2016-08-18 23:52 176 查看
平稳性检测

平稳性的定义:围绕一个常数上下波动且波动范围有限,即有常数均值和常数方差。如果有明显的趋势或者周期性,那它通常不是平稳序列。检测方法有三种:

(1)时序图检测

(2)自相关系数和偏相关系数>>>>>>通过spss

截尾:就是在某阶之后,系数都为0

拖尾:就是有一个缓慢衰减的趋势,但是不都为0

2.不平稳的处理方法

差分法:一阶差分指的是原序列值相距一期的两个序列之间的减法运算;K阶差分就是相距K期的两个序列值之间相减。

3.纯随机性检验

对于纯随机序列,又称白噪声序列,序列的各项数值之间没有任何相关关系,序列在进行完全无序的随机波动,可以终止对该序列的分析。白噪声序列是没有消息可提取的平稳序列。

对于平稳非白噪声序列,它的均值和方差是常数。通常是建立一个线性模型来你和该序列的发展,借此提取该序列的有用信息。ARMA模型是最常用的平稳序列拟合模型。

二、平稳时间序列建模

某个时间序列经过处理,被盘点为平稳非白噪声序列,就可以进行时间序列建模

建模步骤:

(1)计算出该序列的自相关系数(ACF)和偏相关系数(PACF)

(2)模型识别,也成模型定阶。根据系数情况从AR(p)模型,MA(q)模型、ARMA(p,q)模型、ARIMA(p,d,q)模型中选择合适模型,其中p为自回归项,d为差分阶数,q为移动平均项数。

(3)估计模型中的未知参数的值并对参数进行检验

(4)模型检验;

(5)模型优化

(6)模型应用:进行短期预测

例子

“`

coding:utf-8

arima模型

import pandas as pd

参数初始化

disfile=’e:/data.xls’

读取数据,指定时间列为指标,pandas自动将“日期”列识别为Datetime格式

data=pd.read_excel(disfile,index_col=u’日期’)

时序图

import matplotlib.pyplot as plt

用来正常显示中文标签

plt.rcParams[‘font.sans-serif’]=[SimHei’]

用来正常显示负号

plt.rcParams[‘axes.unicode_minus’] = False

data.plot()

plt.show()

自相关图

from statsmodels.graphics.tsaplots import plot_acf

plot_acf(data).show()

平稳性检测

from statsmodels.tsa.stattools import adfuller as ADF

print(u’原始序列的ADF检验结果为:’, ADF(data[u’销量’]))

返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

原始序列的单位根(adf)检验

adf cValue p值

1.81 1% 5% 10%

-3.7112 -2.9812 -2.6301 0.9984

Pdf值大于三个水平值,p值显著大于0.05,该序列为非平稳序列。

差分后的结果

D_data = data.diff().dropna()

D_data.columns = [u’销量差分’]

时序图

D_data.plot()

plt.show()

自相关图

plot_acf(D_data).show()

plt.show()

from statsmodels.graphics.tsaplots import plot_pacf

偏自相关图

plot_pacf(D_data).show()

平稳性检测

print(u’差分序列的ADF检验结果为:’, ADF(D_data[u’销量差分’]))

白噪声检验

from statsmodels.stats.diagnostic import acorr_ljungbox

返回统计量和p值

print(u’差分序列的白噪声检验结果为:’, acorr_ljungbox(D_data, lags=1))

一阶差分后序列的白噪声检验

stat P值

11.304 0.007734

P值小于0.05,所以一阶差分后的序列为平稳非白噪声序列。

from statsmodels.tsa.arima_model import ARIMA

定阶

一般阶数不超过length/10

pmax = int(len(D_data)/10)

一般阶数不超过length/10

qmax = int(len(D_data)/10)

bic矩阵

bic_matrix = []

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)

先用stack展平,然后用idxmin找出最小值位置。

p,q = bic_matrix.stack().idxmin()

print(u’BIC最小的p值和q值为:%s、%s’ %(p,q))

取BIC信息量达到最小的模型阶数,结果p为0,q为1,定阶完成。

#建立ARIMA(0, 1, 1)模型

model = ARIMA(data, (p,1,q)).fit()

给出一份模型报告

model.summary2()

作为期5天的预测,返回预测结果、标准误差、置信区间。

model.forecast(5)

最终模型预测值如下:

2015/2/7

2015/2/8

2015/2/9

2015/2/10

2015/2/11

4874.0

4923.9

4973.9

5023.8

5073.8

利用模型向前预测的时间越长,预测的误差将会越大,这是时间预测的典型特点。

参数检验如下:

Coef.

Std.Err.

t

P值

const

49.956

20.139

2.4806

0.0182

ma.L1.D.销量

0.671

0.1648

4.0712

0.0003

从检验结果p值来看,建立的模型效果良好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: