用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)模型的基础形式如下:

用Python和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)

括号中的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:

用Python和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)

注意到返回的序列是从后往前排列,因此需要将它翻转一下,用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和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)

建立模型

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的作用是输出结果:

用Python和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)

从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最低的模型。对这段程序有几点说明:

  1. 首先定义一个5*3*5的矩阵,用ftres.aic获得模型的aic并存入矩阵(更科学地说,是张量);

  2. Python中结合range的for循环是从0开始的,比如range(5)表示从0到4;

  3. 用try: except: pass来强行跳过错误,因此AIC矩阵会有零值,所以在获取最小的大于0值时,先用extract()函数获得大于0的值,取得最小值后用argwhere()获得它在原矩阵中的位置。

返回结果:

用Python和ARIMA模型进行股价时间序列预测(A0001ECON17083101v001)

从这张图中看,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)的主要内容,如果未能解决你的问题,请参考以下文章

Python中的ARIMA模型SARIMA模型和SARIMAX模型对时间序列预测

R语言的ARIMA模型预测

python量化用时间卷积神经网络(TCN)进行股价预测

时间序列模型分析——ARIMA 模型和SARMIA模型

时间序列模式(ARIMA)---Python实现

Python statsmodels ARIMA 预测