「数据游戏」:使用 ARIMA 算法预测三日后招商银行收盘价

举报
孔皮皮 发表于 2019/09/03 10:34:22 2019/09/03
【摘要】 作者:天琼,「数据游戏」优胜队伍成员介绍本文整理记录了参与的一次小型数据分析竞赛「数据游戏」,竞赛目标是预测2019年5月15日A股闭市时招商银行600036的股价。主要思路是利用ARIMA算法做时间序列预测。使用的数据是公开的数据集 tushare。拿到题目和数据之后,首先结合既往经历,觉得想要预测准股价,本身是一个不可能的事情,尤其是A股。影响股价的因素非常复杂而且不透明,以及金融投资领...

作者:天琼,「数据游戏」优胜队伍成员

介绍

本文整理记录了参与的一次小型数据分析竞赛「数据游戏」,竞赛目标是预测2019年5月15日A股闭市时招商银行600036的股价。

主要思路是利用ARIMA算法做时间序列预测。

使用的数据是公开的数据集 tushare。


拿到题目和数据之后,首先结合既往经历,觉得想要预测准股价,本身是一个不可能的事情,尤其是A股。

影响股价的因素非常复杂而且不透明,以及金融投资领域具有的反身性理论,使得这次预测更多偏向于实验性质,同时对竞争结果不要有过高的期望。

预测得准,是你的运气;预测的烂,也不会影响你从中学到什么。学习第一,比赛第二吧。

鉴于以上,本次预测只使用了close的时间序列。更多的数据其实并没有什么用。

首先了解下本文的 ARIMA 建模过程

  1. 获取时间序列数据 ;

  2. 观察数据是否为平稳时间序列;

  3. 对于非平稳时间序列要先进行d阶差分运算,转化为平稳时间序列;

  4. 对处理得到的平稳时间序列,求它的阶数p,q;

  5. 根据ARIMA算法建模,ARIMA(data, order=(p, d, q))

  6. 模型检验和调优

  7. 预测

初学的小伙伴们可能对这个过程并不熟悉,没关系,先背下来。

对Python不熟悉的小伙伴们, 我给大家总结了几句车轱辘话,大家先强行了解下。

  1. 获取时间序列数据:

1.png

  1. 观察数据是否为平稳时间序列;对于非平稳时间序列要先进行d阶差分运算,转化为平稳时间序列;

2.png

  1. 对处理得到的平稳时间序列,求它的阶数p, q

3.png

  1. 根据ARIMA算法建模

4.png

  1. 模型检验和调优

5.png

  1. 预测

6.png

以上,是本文的核心代码,大家如果一时看不懂,可以跳过。 可以看看下面更详细的步骤。

导入数据并处理

7.png

检验时间序列的稳定性

ARIMA算法要求时间序列稳定,所以在建模之前,要先检验时间序列的稳定性。 adfuller就是用来干这个的。 adfuller 全称 Augmented Dickey–Fuller test, 即扩展迪基-福勒检验,用来测试平稳性。

#先做一个解释器, 让 adfuller 的输出结果更易读易理解:

8.png

adfuller检验是检查时间序列平稳性的统计测试之一。 这里的零假设是:序列 train 是非平稳的。 测试结果包括测试统计和差异置信水平的一些关键值。 如果测试结果中的 P-value 小于临界值,我们可以拒绝原假设并说该序列是平稳的。

9.png

检验结果显示,p-value=0.414, 远远大于5%的临界值,说明零假设是成立的,即序列 train 是非平稳的。

t is: (-1.7325346908056185, 0.4144323576685054, 0, 322, {‘1%’: -3.4508226600665037, ‘5%’: -2.870558121868621, ‘10%’: -2.571574731684734}, 523.9067372199033)


pic_001.png

时间序列平稳化

为了让时间序列平稳,需要对 train 序列做差分运算:

10.png

pic_002.png

关于时间序列稳定性的判断标准,可参考这篇博客:https://blog.csdn.net/u012735708/article/details/82460962

检验差分数据的平稳性

检验差分后数据的平稳性,和第一次验证方法相同

11.png

确定ARIMA的阶数p,q

在这里,先简单解释下自己对 ARIMA 算法的理解。不正确的地方请大家指点。

ARIMA算法认为时间序列上 t 时刻的值由2部分构成,第一部分是由之前p项历史值决定的,比如15日的收盘价是12日,13日,14日的收盘价的线性回归,用AR§表示。

但是这个线性回归的输出值肯定和15日的实际收盘价有一个误差,假设是e。

所以第二部分就是如果表示这个 e 。

这个e 可以认为是之前q项误差的线性回归,用MA(q)表示。

两部分合起来就是ARMA。

然后为了让时间序列平稳,再加个d 阶差分操作功能,就变成了ARIMA算法。

所以在使用 ARIMA 算法之前,需要先确定(p, d, q)的值。

12.png

建立模型并拟合数据

注意ARIMA的参数中,输入数据 应该是原始数据 train,ARIMA 会根据 d 的值,对原始数据做 d 阶差分运算。 d的含义是,输入序列需要先经过一个d阶的差分,变成一个平稳序列后才能进行数据拟合。

13.png

pic_003.png

模型评估和调优

14.png

pic_004.png

15.png

pic_005.png

预测目标

使用 forecast 对样本外的时间序列进行预测。

关于foreast和predict的区别: predict 可以对样本内和样本外的进行预测,结果是一样的。 举例说明:forecast(10),表示对未来10个点进行预测,但是可以用model.fittedvalues查看样本内点的拟合值; 而predict(start,end)里面的参数0表示样本内的第一个数,以此类推。 如果想要预测样本外的数,需要将start设置为len(data)+1,即数据长度+1,才表示预测样本外的第一个数字。 而 forecast函数,是对样本外的数据进行预测。 但是这两个函数的预测结果是一样的。 另外,需要提到的是,ARIMA算法一般只能预测一点点,越长越不准确,即便是简单的正弦函数也不能准确预测。

16.png

5月15日close时的股价为:33.82 元。

顺便安利下这次参与的小竞赛「数据游戏」,是由个人发起、异步社区(邮电出版社)赞助的活动。

总体来说,这个比赛氛围适中,没有太大的心理负担。

所以感觉比较适合打算初入的小伙伴,参与之后,这样的经验对以后的学习进阶和职业发展都有好处。


Ad Time

学习更多数据科学知识请关注微信公众号:read_csv

参与数据科学活动请加 QQ 群:759677734



本文转载自异步社区。

原文链接:https://www.epubit.com/articleDetails?id=N16a9ad22-c563-4098-8a6c-29c90888a1ec

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。