1.差分自回归模型的基本思想:将预测对象随时间推移而形成的数据序列视为一个随机序列,用一定的数学模型来近似描述这个序列。这个模型一旦被识别后就可以从时间序列的过去值以及现在值来预测未来值。不能对时间序列直接采取线性回归算法是因为时间序列所对应的值并不是独立的。
2.要对非平稳的序列进行平稳处理,因为非平稳的序列不能进行预测。
3.代码:
#!/usr/bin/python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima_model import ARIMA
def date_parse(date):
return pd.datetime.strptime(date, '%Y-%m')
if __name__ == '__main__':
data = pd.read_csv('AirPassengers.csv', header = 0, parse_dates = ['Month'], date_parser = date_parse, index_col = ['Month'])
p,d,q = 2, 1, 2
data.rename(columns = {'#Passengers':'Passengers'}, inplace = True)
passengersNums = data['Passengers'].astype(np.float)
logNums = np.log(passengersNums)
subtractionNums = logNums - logNums.shift(periods = d)
rollMeanNums = logNums.rolling(window = q).mean()
logMRoll = logNums - rollMeanNums
plt.plot(logNums, 'g-', lw = 2, label = u'log of original')
plt.plot(subtractionNums, 'y-', lw = 2, label = u'subtractionNums')
plt.plot(logMRoll, 'r-', lw = 2, label = u'log of original - log of rollingMean')
plt.legend(loc = 'best')
plt.show()
arima = ARIMA(endog = logNums, order = (p,d,q))
proArima = arima.fit(disp = -1)
fittedArima = proArima.fittedvalues.cumsum() + logNums[0]
fittedNums = np.exp(fittedArima)
plt.plot(passengersNums, 'g-', lw = 2, label = u'orignal')
plt.plot(fittedNums, 'r-', lw = 2, label = u'fitted')
plt.legend(loc = 'best')
plt.show()
解释:
(1)首先对原始时间序列数据进行对数处理,差分处理,滑动平均处理。其中差分处理与滑动平均处理是对非平稳序列进行平稳处理,结果如图:
很明显观察到用差分与原始数据减去滑动平均的结果可以对非平稳序列进行平稳处理。
(2)然后用差分自回归模型拟合原始数据。其中参数p为自回顾函数的参数,d为差分的参数,q为滑动平均的参数。结果如图: