用Python和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)
Posted 科学投资人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Python和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)相关的知识,希望对你有一定的参考价值。
01
基础知识
ARIMA(Autoregressive Integrated Moving Average,自回归集成移动均值)模型被称为是计量经济学家的良心,这即是说,如果一个人建立的时间序列模型不能有比它更好的预测能力,那就相当于他没有良心。Python是当下最为流行的开源数据科学编程语言,虽然在计量领域的应用不如R广泛,但仍然可以完成很多基础计量模型的建立。第一步是要安装Python,建立直接下载Anaconda,里面集成了多个数据科学软件包。本次我们用Python建立ARIMA模型来预测股价数据。
ARIMA(p,d,q)模型的基础形式如下:
括号中的d表示差分d次,对于一个长度为N的序列,差分d次后得到一个长度为N-d的序列。可以看出ARIMA模型的思想是很简单的:序列下一期的值就是等于前d期的加权平均加上前几期残差的加权平均。
事实上假如我们取p为1,d为0(不进行差分),q为0,则可以看出这实际上可以视为一个带漂移项的随机游走。在实际的经济序列中,大多数都是单位根非平稳,需要差分一次变成平稳序列。
02
Python的实现
本文用到的jupyter notebook文件可从网盘获得,文件夹对应本文编号0001:
https://pan.baidu.com/s/1jHRV2dS
获取数据
仍然使用tushare包获取股价数据,可以用pip install tushare安装,更新版本可以使用pip install tushare --upgrade命令。tusharer提供了一个get_hist_data()的函数用以获取历史日行情数据。使用以下命令即可获取600848的所有数据。
import tushare as ts
data=ts.get_hist_data('600848')
返回值为一个DataFrame:
注意到返回的序列是从后往前排列,因此需要将它翻转一下,用data=data.iloc[::-1],.iloc[]在Pandas中的作用是按序号访问数据。iloc[::-1]的意思是从后往前每一个位置取一个值,而iloc[::-2]的意思就是从后往前每隔一个值取一个。
然后可以使用matplotlib包中的pyplot绘制相关图像,如果是在jupyter notebook中使用matplotlib,还要添加一行inline的代码好让图像显示出来:
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data.close.values)
plt.plot()接受的参数为numpy.array,而data.close返回的是DataFrame,因此需要用.values获取其中的数值,结果:
建立模型
Python中的statsmodels中提供了多个计量模型的函数,ARIMA模型位于statsmodels.tsa.arima_model,首先需要将其导入。再建立ARIMA(y,orders=(p,d,q))模型,接着用.fit()进行拟合:
from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(data.close.values,order=(1,1,1))
fittedmodel=model.fit()
print(fittedmodel.summary())
print的作用是输出结果:
从P>|z|的结果看,三个变量均不显著,当然,(1,1,1)是随便选择的一个模型,因此效果不太好。为了确定最好的模型,我们可以拟合不同阶数的模型然后对比aic值,选择最小的AIC值。在statsmodels中的ARIMA模型中,d只能为0,1,2,再高的阶数就不支持了。
import numpy as np
aicmatrix=np.zeros([5,3,5])
for p in range(5):
for d in range(3):
for q in range(5):
try:
ftmodel=ARIMA(data.close.values,order=(p,d,q))
ftres=ftmodel.fit()
aicmatrix[p,d,q]=ftres.aic
except:
pass
minaic=np.min(np.extract(aicmatrix>0,aicmatrix))
idx=np.argwhere(aicmatrix==minaic)
idx=tuple([i for i in idx[0]])
print("Order with minimum AIC:",idx)
model=ARIMA(data.close.values,order=idx)
fittedmodel=model.fit()
print(fittedmodel.summary())
以上程序拟合了p和q从0到4,d从0到2的模型,并选择了AIC最低的模型。对这段程序有几点说明:
首先定义一个5*3*5的矩阵,用ftres.aic获得模型的aic并存入矩阵(更科学地说,是张量);
Python中结合range的for循环是从0开始的,比如range(5)表示从0到4;
用try: except: pass来强行跳过错误,因此AIC矩阵会有零值,所以在获取最小的大于0值时,先用extract()函数获得大于0的值,取得最小值后用argwhere()获得它在原矩阵中的位置。
返回结果:
从这张图中看,7个变量中有4个变量都在0.01水平下显著。
预测
预测分样本外预测与样本内预测,样本内预测相当于拟合已知的值,而样本外预测是预测新的值。ARIMA.predict()可以完成样本内预测。在本模型中,由于进行了差分,因此预测的结果也是差分之后的,为了得到原始数据,需要添加参数typ='levels',否则预测会有问题。
y=data.close.values
prey=fittedmodel.predict(typ='levels')
plt.plot(y)
plt.plot(prey)
结果:
样本外预测需要使用forecast()函数:
fittedmodel.forecast()
返回单步向前预测:
24.30是预测值,0.83是预测的标准差,而最后22.67和25.93是95置信区间。
以上是关于用Python和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)的主要内容,如果未能解决你的问题,请参考以下文章