python时间序列ARIMA的实现及原理(预测茅台股票数据)

编程入门 行业动态 更新时间:2024-10-11 19:20:09

python时间序列ARIMA的实现及原理(预测<a href=https://www.elefans.com/category/jswz/34/1759040.html style=茅台股票数据)"/>

python时间序列ARIMA的实现及原理(预测茅台股票数据)

ARIMA模型由    (AR模型    I差分    MA模型)三部分组合而成。这里我使用scipy库的方法来简单实现,其中的底层代码就不再累述。

当然也可以使用ARMA模型,由于ARMA模型需要平稳的时间序列,或者转化为弱平稳时间序列。所以ARMA模型中引入I差分,构成了ARIMA模型。ARIMA模型需要引入三个变量参数p、d、q

ARIMA模型(可以估计时间的走向的模型):

一:AR模型:(AutoRegressive自回归,描述当前值和历史值之间的关系)

    AR(p) p表示滞后p阶的AR模型,当前时间点与前p个时间点的关系。p=1,当前时间和前1个时间点的关系

    这里通过PACF图,观察判断p参数的选取(以进入置信区为参考)

二:I差分:(将不平稳的时间序列转化为平稳的时间序列,或弱平稳时间序列。)

    怎么数据判断是否平稳呢?这里使用简单点的根据数据的 均值 和 方差 来做判断。如果两者都处于平稳那么,就处于弱平稳了。差分的方法就是做差:一个数据序列r2、r3、r4、r5、rn减去r1、r2、r3、r4、rn-1的来获取差值序列。这是一阶差分,利用获得的差序再做差分,就是二阶差分。

    I(d)    d表示做多少阶的差分

三:MA模型:(Moving average滑动平均,描述误差之间的关系)描述自回归部分的误差累计

       MA(q) q表示前q个时间点的时间差

        这里同过ACF图,观察判断q参数的选取(以进入置信区为参考)

 

所以两个结合为 ARMA模型(ARMA模型要求时间序列是平稳的)

ARMA(p,q)

所以三个结合为 ARIMA模型(不是平稳序列需要I差分)

ARIMA(p,d,q):p阶自回归滞后项,q阶滑动平均滞后项,d阶差分

 

实现原理及代码(这里我们将对茅台股票数据进行分析):

导入ARIMA、pacf、acf包:

from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

导入股票API库:

import tushare as ts

导入时间转换库dateutil,将DataFrame的index object类型转换为datetime类型(前面有文章将dateutil的使用,特别好用、强大的一个库)

from dateutil.parser import parse

导入seaborn库,并设置(解决中文显示和格式问题):

import seaborn as sns
sns.set_style("whitegrid",{"font.sans-serif":['KaiTi', 'Arial']})

导入其他基本数据分析库:

import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt

完整源码如下:

import tushare as ts
import pandas as pd
import numpy as np
import datetime
from dateutil.parser import parse
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacfsns.set_style("whitegrid",{"font.sans-serif":['KaiTi', 'Arial']})def run_main():k  = ts.get_hist_data('600519') #600519茅台股票  这里可以设置获取的时间段# k  = ts.get_hist_data('600519',start='2015-05-04',end='2018-05-02')lit = ['open', 'high', 'close', 'low']  #这里我们只获取其中四列data = k[lit]d_one = data.index      #以下9行将object的index转换为datetime类型d_two = []d_three = []date2 = []for i in d_one:d_two.append(i)for i in range(len(d_two)):d_three.append(parse(d_two[i]))data2 = pd.DataFrame(data,index=d_three,dtype=np.float64)   #构建新的DataFrame赋予index为转换的d_three。当然你也可以使用date_range()来生成时间indexplt.plot(data2['close'])    #一看数据就不稳定,所以我们需要做差分plt.title('股市每日收盘价')plt.show()data2_w = data2['close'].resample('W-MON').mean()   #由于原始数据太多,按照每一周来采样,更好预测,并取每一周的均值data2_train = data2_w['2015':'2017']    #我们只取2015到2017的数据来训练plt.plot(data2_train)plt.title('周重采样数据')plt.show()#一阶差分,分析ACFacf = plot_acf(data2_train,lags=20)     #通过plot_acf来查看训练数据,以便我们判断q的取值plt.title("股票指数的 ACF")acf.show()#一阶差分,分析PACFpacf = plot_pacf(data2_train,lags=20)   #通过plot_pacf来查看训练数据,以便我们判断p的取值plt.title("股票指数的 PACF")pacf.show()#处理数据,平稳化处理data2_diff = data2_train.diff(1)    #差分很简单使用pandas的diff()函数可以进行一阶差分diff = data2_diff.dropna()for i in range(4):          #五阶差分,一般一到二阶就行了,我有点过分diff = diff.diff(1)diff = diff.dropna()plt.figure()plt.plot(diff)plt.title('五阶差分')plt.show()# 五阶差分的ACFacf_diff = plot_acf(diff,lags=20)plt.title("五阶差分的ACF")         #根据ACF图,观察来判断qacf_diff.show()# 五阶差分的PACFpacf_diff = plot_pacf(diff,lags=20)   #根据PACF图,观察来判断pplt.title("五阶差分的PACF")pacf_diff.show()#根据ACF和PACF以及差分 定阶并建模model = ARIMA(data2_train,order=(6,1,5),freq='W-MON')   #pdq    频率按周#拟合模型arima_result = model.fit()#预测pred_vals = arima_result.predict('2017-01-02',dynamic=True,typ='levels')    #输入预测参数,这里我们预测2017-01-02以后的数据#可视化预测stock_forcast = pd.concat([data2_w,pred_vals],axis=1,keys=['original', 'predicted'])   #将原始数据和预测数据相结合,使用keys来分层#构图plt.figure()plt.plot(stock_forcast)plt.title('真实值vs预测值')plt.show()if __name__=="__main__":run_main()

显示图片如下(包括用以分析的ACF、PACF图):

由上个图我们可以看出,预测还是有出入的,ARIMA时序模型只是基础的分析工具。

对于做差分我们还可以采用其他的方式,例如先做log对数,再差分。

ARIMA还可以做其他的数据预测,例如 访问流量的预测 等等。

------------------------------------------------------------------------------------------------------------------

一段时间后回顾本文章发现一些问题,由于初学所以很多地方没有注意,例如差分一般做1、2阶便可以了,原因在于差分其实是对信息提取加工的过程,每次差分都会带来信息损失,过度差分会导致有效信息损失而降低精度。一般情况下,线性变化通过 1 次差分即可平稳,非线性趋势 2,3 次差分也能变得平稳,一般差分次数不超过 2 次。而且数据处理也比较粗糙,只是一个浅显的思路,仅作基础的入门参考,后续将会做更完善的文章介绍。

更多推荐

python时间序列ARIMA的实现及原理(预测茅台股票数据)

本文发布于:2024-02-06 16:21:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1750465.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:茅台   序列   原理   时间   股票

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!