时间序列模型学习笔记(二)

时间序列模型学习笔记(二)

3.非平稳时间序列

3.1 非平稳时间序列的差分变换

非平稳时间序列可以建立的模型有ARIMA以及残差自回归模型等等,这里主要讨论ARIMA。

  • 差分运算:相距k期的两个序列之间的减法称为k阶差分运算。

对于非平稳时间序列,我们可以通过相应的变换将其变为平稳序列。差分是一个主要的手段,一个线性趋势的非平稳序列可以使用d阶差分运算,化为平稳时间序列,而一个指数趋势的非平稳序列可以先取对数再差分化为平稳序列。画出原始数据的时序图从时序图可以看出数据的基本趋势:围绕某水平线波动;围绕某直线波动;呈指数上升或下降趋势等等。

当然如果变换后的序列依然非平稳,既可以考虑修改一下变换方法,也可以考虑再作一次差分。

3.2 对平稳序列建立ARMA模型

ARIMA模型实质上就是差分运算和ARMA模型的组合,非平稳序列经过变换后变成了平稳序列,此时我们就可以使用ARMA模型对时间序列建模了,怎么建立平稳序列的ARMA模型之前的笔记中已有详细介绍。

3.3 基本步骤

(1)检验序列的平稳性。

我们可以通过观察时序图的波动,画出序列的自相关图或者进行ADF单位根检测,均可以检验序列的平稳性。

基本实现代码:

# 先将数据读入data
#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式,filePath为数据文件路径
import pandas as pd
data = pd.read_excel(filePath, index_col = u'日期')

import matplotlib.pyplot as plt
data.plot() 
plt.show() # 画出时序图

from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show() # 自相关系数图

from statsmodels.tsa.stattools import adfuller as ADF
print(ADF(data[value_column_name])) # ADF检验
# ADF检验可以得到单位根检验统计量对应的p值,若此值显著大于0.05,则该序列非平稳
(2)对原始序列进行一阶(或者d阶)差分,进行平稳性和白噪声检验。
# 1阶差分,调整periods可以调整差分阶数
D_data = data.diff(periods=1, axis=0).dropna()
D_data.plot() # 时序图
plt.show()

from statsmodels.graphics.tsaplots import plot_acf
plot_acf(D_data).show() # 自相关系数图
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show() # 偏自相关系数图

print(ADF(data[value_column_name])) # ADF检验

# 白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(acorr_ljungbox(D_data, lags=1)) #返回统计量和p值
(3)若差分后的序列不平稳,修改差分阶数重新差分,或者继续对序列进行差分运算,运算后继续进行平稳性和白噪声检验,直至差分后的序列平稳为止。
(4)若差分运算后的序列平稳,则对差分后的平稳序列拟合ARMA模型,并且为模型定阶。
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(data, (p,d,q)).fit()  # 建立ARIMA(p, d, q)模型,d为差分阶数

p和q的值可以通过对自相关系数图和偏自相关系数图人为识别来确定,确定方法是根据自相关系数图和偏自相关系数图的拖尾和截尾的性质来确定的,在上一篇笔记中有详细的说明,同样我们也可以通过BIC矩阵中的最小BIC信息量的位置来决定。下面是ARIMA模型定阶的代码:

#ARIMA模型定阶
from statsmodels.tsa.arima_model import ARIMA
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: 
      tmp.append(ARIMA(data, (p,d,q)).fit().bic)
    except:
      tmp.append(None)
  bic_matrix.append(tmp)

bic_matrix = pd.DataFrame(bic_matrix)  # 从中可以找出最小值
p,q = bic_matrix.stack().idxmin()  # 用idxmin找出最小值位置。

你可能感兴趣的:(数据挖掘,数据挖掘,时间序列预测,学习笔记,python)