python下的时间序列模式处理及实现

时序模式

基本概念及流程

  • 时间序列数据的分析流程

    1.对时间序列数据进行平稳性检验
    检查方法:单位根检验,时序图检验,自相关图检验
    2.判断是否为平稳序列如果为平稳序列则进行白噪声检验(纯随机性检验),如果为非平稳序列就进行差分运算将其转换为平稳序列在进行白噪声检验(纯随机性检验)。
    3.不是白噪声序列则计算ACF和PACF,如果为白噪声序列则终止分析。
    4.模型识别(最小信息准则,拖尾和截尾)

    5.参数估计,模型检测

  • 什么是时间序列数据?

    时间序列数据(time series data)是在不同时间上收集到的数据,用于所描述现象随时间变化的情况。这类数据反映了某一事物、现象等随时间的变化状态或程度。

  • 时间序列的预处理

    拿到一个观察值序列后,首先要对它的纯随机性和平稳性进行检测,这两个重要的检验成为序列的预处理。根据检验的结果可以把序列分为不同的类型,对不同类型的序列会采取不同的分析方法。

    纯随机序列又叫做白噪声序列,序列的各项之间没有任何的相关性,序列在进行完全无序的随机波动,这种序列没有分析的价值,白噪声序列是没有信息可提取的平稳序列。

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

    对于非平稳序列,由于它的均值和方差不稳定,处理方法一般是将其转变为平稳序列,这样就可以应用有关平稳时间序列的分析方法,如建立ARMA模型进行分析。如果一个时间序列模型经差分运算后具有平稳性,则称该模型为差分平稳序列,AMIRA模型进行分析。、

  • 怎么查看平稳性检测结果?

    单位跟检验件:不存在单位根即为平稳序列;在python中就是statsmodels中的ADF检验,返回值的结果依次是为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore;第一个是adt检验的结果,简称为T值,表示t统计量。第二个简称为p值,表示t统计量对应的概率值。主要看p值p值大于0.05判断为非平稳序列,小于0.05判断为平稳序列。

    白噪声检验:

    时序图检测:平稳序列的时序图显示该序列值始终在一个常数附近随机波动,而且波动的范围有界;如果表现出明显的趋势线或周期性,通常不为平稳序列。

  • 什么是拖尾和截尾?

    截尾是在置信区间内,ACF或PACF在某阶段后恒等于零(或在0附近随机波动)

    拖尾是在置信区间内,ACF或PACF始终有非零取值,不呈现在某节后就恒等于零(或在0附近随机波动)

python下的时间序列模式处理及实现_第1张图片

出现以下情况,通常视为(偏)自相关系数d阶截尾:
1)在最初的d阶明显大于2倍标准差范围
2)之后几乎95%的(偏)自相关系数都落在2倍标准差范围以内
3)且由非零自相关系数衰减为在零附近小值波动的过程非常突然

出现以下情况,通常视为(偏)自相关系数拖尾:
1)如果有超过5%的样本(偏)自相关系数都落入2倍标准差范围之外
2)或者是由显著非0的(偏)自相关系数衰减为小值波动的过程比较缓慢或非常连续

模型选择

ARMA模型识别原则

统计量 平稳AR§模型 平稳MA(q)模型 平稳ARMA(p,q)模型
均值 常数 常数 常数
方差 常数 常数 常数
自相关系数ACF 拖尾 q阶截尾 p阶拖尾
偏自相关系数PACF p阶截尾 拖尾 q阶拖尾

参数估计(定阶)

通过拖尾和截尾对模型进行定阶的方法,往往具有很强的主观性。回想我们之前在参数预估的时候往往是怎么做的,不就是损失和正则项的加权么?我们这里能不能结合最终的预测误差来确定p,q的阶数呢?在相同的预测误差情况下,根据奥斯卡姆剃刀准则,模型越小是越好的。那么,平衡预测误差和参数个数,我们可以根据信息准则函数法,来确定模型的阶数。预测误差通常用平方误差即残差平方和来表示。

AIC准则
AIC准则全称为全称是最小化信息量准则(Akaike Information Criterion),计算公式如下:
AIC = =2 *(模型参数的个数)-2ln(模型的极大似然函数)

BIC准则
AIC准则存在一定的不足之处。当样本容量很大时,在AIC准则中拟合误差提供的信息就要受到样本容量的放大,而参数个数的惩罚因子却和样本容量没关系(一直是2),因此当样本容量很大时,使用AIC准则选择的模型不收敛与真实模型,它通常比真实模型所含的未知参数个数要多。BIC(Bayesian InformationCriterion)贝叶斯信息准则弥补了AIC的不足,计算公式如下:

BIC = ln(n) * (模型中参数的个数) - 2ln(模型的极大似然函数值),n是样本容量

模型检验

建模前,检验数据是否满足白噪声检验,非白噪声序列才能建模

建模后,检验残差是否满足白噪声检验,通过检验,模型才能成立 (残差应该是白噪声序列)

读取残差resid = model.resid

使用 ljungbox 检验残差是否是白噪声(残差无自相关性)
acorr_ljungbox( resid, lags=1 )

模型预测

del.resid

使用 ljungbox 检验残差是否是白噪声(残差无自相关性)
acorr_ljungbox( resid, lags=1 )

模型预测

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

具体代码实现

import pandas as pd
import numpy as np
data=pd.read_excel('a.xls',index_col = u'日期')
data['销量']=data['销量'].astype(float)
from matplotlib import style
style.use('ggplot')
#时序图
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,lags=35).show()
#平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
print('原始序列的ADF检验结果为:', ADF(data['销量']))
#差分后的结果
D_data = data.diff().dropna()
D_data.columns = [u'销量差分']
D_data.plot() #时序图
plt.show()
plot_acf(D_data).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
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10) #一般阶数不超过length/10
from statsmodels.tsa.arima_model import ARIMA
bic_matrix = [] #bic矩阵
for p in range(pmax+1):
    tmp = []
    for q in range(qmax+1):
        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().astype(float).idxmin() 
#先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值为:%s、%s' %(p,q)) 
model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #给出一份模型报告
model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。
resid = model.resid #残差检验
acorr_ljungbox(resid, lags=1 )

BIC矩阵显示不了问题的解决方法

BIC矩阵显示值全部为空,大部分原因是因为statsmodels的版本过高导致的,可以降低statsmodels的版本来解决该问题,推荐使用0.12.1版本。

你可能感兴趣的:(python,机器学习,算法)