本文简单谈谈如何用Python构建AR模型,并进行数据预测。
本文承接前文:
金融时间序列分析:3. First Demo By Python
这篇文章介绍了用Python获取数据、数据预处理、稳定性分析、以及定阶。在此,本文就不再介绍这些内容,直接进入AR模型部分。
在之前的文章简单介绍了定阶这个过程,这里在详细介绍下。
在前一篇文章中,我说:
简单的理解就是找到时间序列的周期,比如说气温这一项,就有明显的年度周期性,前几年的同期数据对预测当年的气温有极大的参考意义。
从统计学上讲就是寻找是得ACF(样本自相关系数)最大的时间间隔。
在学习完AR模型后,我们进一步理解就是要采用多少阶的模型比如AR(1), AR(2)….
看下ACF和PACF:
从图中可以看出:1, 2, 4, 8, 20都可以采用。
但是有一点,从AR模型公式看,当阶越大,数据处理难度越高。
Python也提供一个定阶的函数adfuller:
def adf_test(ts):
adftest = adfuller(ts, autolag='AIC')
adf_res = pd.Series(adftest[0:4], index=['Test Statistic','p-value','Lags Used','Number of Observations Used'])
for key, value in adftest[4].items():
adf_res['Critical Value (%s)' % key] = value
return adf_res
通过int(adf_res[‘Lags Used’])获取响应的阶数。
Python statsmodels.tsa.arima_model包中提供ARMA,ARIMA等模型。
具体使用方法如下:
from statsmodels.tsa.arima_model import ARMA, ARIMA
def draw_ar(ts, w):
arma = ARMA(ts, order=(w,0)).fit(disp=-1)
ts_predict = arma.predict()
plt.clf()
plt.plot(ts_predict, label="PDT")
plt.plot(ts, label = "ORG")
plt.legend(loc="best")
plt.title("AR Test %s" % w)
plt.savefig("./PDF/test_ar_"+ str(w) +".pdf", format='pdf')
其中w是传入的阶数。
输出如下:
预测的结果差强人意……