以前都是用SPSS/EVIEWS等来做的,现在用Python来搞搞看,前后弄了一个星期,总算基本走通了。
基础库: pandas,numpy,scipy,matplotlib,statsmodels :
from __future__ import print_functionimport pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
运行的时候会报错:Undefined variable from import:,不过好像不影响结果
1.数据:
dta=[10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422,
6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,
10477,10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,
12136,12812,12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,
13261,13230,15535,16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,
9543,12872,13101,15053,12619,13749,10228,9725,14729,12518,14564,15085,14722,
11999,9390,13481,14795,15845,15271,14686,11054,10395]
dta=np.array(dta,dtype=np.float) //这里要转下数据类型,不然运行会报错
dta.index = pd.Index(sm.tsa.datetools.dates_from_range('2001','2090')) // 应该是2090,不是2100
dta.plot(figsize=(12,8))
plt.show() // 在Scala IDE要输入这个命令才能显示图片
2.时间序列的差分d
ARIMA 模型对时间序列的要求是平稳型。因此,当你得到一个非平稳的时间序列时,首先要做的即是做时间序列的差分,直到得到一个平稳时间序列。如果你对时间序列做d次差分才能得到一个平稳序列,那么可以使用ARIMA(p,d,q)模型,其中d是差分次数。
fig = plt.figure(figsize=(12,8))
ax1= fig.add_subplot(111)
diff1 = dta.diff(1)
diff1.plot(ax=ax1)
已经平稳,二阶效果也差不多,具体见原文
3.合适的p,q
现在我们已经得到一个平稳的时间序列