深度学习RNN实现股票预测实战(附数据、代码)

2017 年 12 月 24 日 凡人机器学习

点击蓝字关注这个神奇的公众号~


背景知识

最近再看一些量化交易相关的材料,偶然在网上看到了一个关于用RNN实现股票预测的文章,出于好奇心把文章中介绍的代码在本地跑了一遍,发现可以work。于是就花了两个晚上的时间学习了下代码,顺便把核心的内容翻译成中文分享给大家。

 

首先讲讲对于股票预测的理解,股票是一种可以轻易用数字表现律动的交易形式。因为大数定理的存在,定义了世间所有的行为都可以通过数字表示,并且存在一定的客观规律。股票也不例外,量化交易要做的就是通过数学模型发现股票的走势趋势。“趋势”要这样理解:对于股票的预测,不是说我知道这个股票昨天指数是多少,然后预测今天他的指数能涨到多少。而是,我们通过过去一段时间股票的跌或者涨,总结出当出现某种波动的时候股票会有相应的涨或者跌的趋势。于是就引出了RNN的概念。


RNN是一种深度学习的网络结构,RNN的优势是它在训练的过程中会考虑数据的上下文联系,非常适合股票的场景,因为某一时刻的波动往往跟之前的走势蕴含某种联系。RNN是由一个个神经元cell组成,然而传统的RNN当网络过于复杂的时候,后方节点对于前方的感知力会下降,LSTMLong-short Term Memory)是一种变型,从名字就可以看出来,LSTM可以增加记忆力,解决上面提到的问题。对于股票这个场景,我们就可以通过LSTM来实现股票的走势的预测。


在股票这个场景下,通过上面这个图可以看出来,输入的是时间tt+1t+2的股票信息,可以返回t+1t+2t+3的股票信息,而且上下节点前后依赖,通过LSTM模型对于这样的股票序列进行预测,所以股票预测的关键就是首先构建股票序列化数据,然后训练LSTM模型,最终通过这个模型对于股票进行预测,以上就是大体的一些思路。

数据说明

本次实验使用的是一只叫SP500的股票,可以从雅虎下载这只股从50年到现在每天的走势情况,这里只需要关心每次收盘价格,也就是close字段即可。数据截图:


代码

代码文件有以下四部分:


其中SP500的股票数据需要放在data文件夹下。依赖的库包括,

numpy==1.13.1pandas==0.16.2 scikit-learn==0.16.1 scipy==0.19.1 tensorflow==1.2.1

在项目目录下执行以下shell即可开始训练:

python main.py --stock_symbol=SP500 --train --input_size=1 --lstm_size=128 --max_epoch=50


分别介绍下每个代码:

data_model.py

这个文件是构建训练数据,通过pandas库去读数据SP500.csv文件,然后只取close这个字段,将每天的close数据作为代表当天股票的市值,如下图所示。


这里做了一次归一化,因为股票在50年的市值是每股19块左右,到了2017年涨到了2600多块,分布很不均匀,于是通过把每天股票close值除以历史股票最高值,将所有数据的定义域限定在01之间。接着构建预测集,涉及到两个参数input_sizenum_steps,当input_size=3 and num_steps=2时会构建以下数据集。

012天的股票和第345天的股票为训练集,第678天的股票是目标列,就构成了监督学习数据。以此类推,将所有数据构成训练数据集。


model_rnn.py

构建模型的文件,通过build_graph函数去构建整个的LSTM网络,同时定义最优化求法的optimizer。通过train函数定义数据如何在graph中训练,包括model参数的存储。plot_samples会在训练过程中将测试集数据和训练数据的比较打印成图片输出。

 

main.py

入口代码,定义运行参数,包括epoch的轮数、learning_rate等等。

 

结果评估

其实,在测试的时候,整个工程就将生成的预测数据和真实数据进行比较并且在images文件夹下生成图片。我们通过图片直观的可以看下随着训练的进行,是否真正可以模拟出股票曲线,首先是epoch=5的时候,也就是训练第5轮的时候,我们看到绿色的predict曲线和蓝色的truth曲线拟合的并不好。

 

再来看下又过了40多轮训练生成的图片:



我们看到股票的曲线拟合程度已经进步非常多,相信随着数据和训练轮次的增加,预测值会越来越精确。


 PS:总结完了,建议大家想学习的自己跟一遍代码,我自己看了2个晚上,加起来4个小时左右。我整理的代码和数据下载链接在下面已经给出。另外谁认识北京的做量化交易相关的同学,请帮忙引荐,最近在工作之余自学量化交易相关的内容,希望可以有业内同学当面交流一下,多谢。

参考

项目地址:https://github.com/lilianweng/stock-rnn

作者写的介绍博文,很详细,学到很多:

https://lilianweng.github.io/lil-log/2017/07/08/predict-stock-prices-using-RNN-part-1.html

 另外我基于lilianweng的工作,精简了一部分代码,并且修改了部分版本不兼容的第三方库函数,并且在工程中提供了从雅虎股票下载好的数据,可以直接运行,项目地址:https://github.com/jimenbian/stock-rnn

 End 

为了方便大家学习与交流,凡人云近日已开通机器学习社群!

分享公众号名片到40人以上的大群并截图给小助手,小助手就会拉你入群

在这里你可以得到:

1.各种学术讨论

2.最新的资料分享

3.不定期的征文以及联谊活动!

小助手微信号:meiwznn


给我一分钟

送你一个学习的世界

微信号:凡人机器学习

长按二维码关注

登录查看更多
5

相关内容

【ICML2020-华为港科大】RNN和LSTM有长期记忆吗?
专知会员服务
74+阅读 · 2020年6月25日
《深度学习》圣经花书的数学推导、原理与Python代码实现
【MIT深度学习课程】深度序列建模,Deep Sequence Modeling
专知会员服务
77+阅读 · 2020年2月3日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
119+阅读 · 2019年12月31日
金融时序预测中的深度学习方法:2005到2019
专知会员服务
166+阅读 · 2019年12月4日
【年度系列】使用LSTM预测股票市场基于Tensorflow
量化投资与机器学习
19+阅读 · 2018年10月16日
LSTM模型预测效果惊人的好,深度学习做股票预测靠谱吗?
数据挖掘入门与实战
6+阅读 · 2018年1月3日
用深度学习预测比特币价格
Python程序员
11+阅读 · 2017年12月23日
深度学习基础之LSTM
全球人工智能
28+阅读 · 2017年12月18日
阿里流行音乐趋势预测-深度学习LSTM网络实现代码分享
机器学习研究会
11+阅读 · 2017年12月5日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
自创数据集,用TensorFlow预测股票教程 !(附代码)
十分钟掌握Keras实现RNN的seq2seq学习
机器学习研究会
10+阅读 · 2017年10月13日
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Arxiv
19+阅读 · 2018年10月25日
Arxiv
14+阅读 · 2018年5月15日
Arxiv
4+阅读 · 2015年8月25日
VIP会员
相关资讯
【年度系列】使用LSTM预测股票市场基于Tensorflow
量化投资与机器学习
19+阅读 · 2018年10月16日
LSTM模型预测效果惊人的好,深度学习做股票预测靠谱吗?
数据挖掘入门与实战
6+阅读 · 2018年1月3日
用深度学习预测比特币价格
Python程序员
11+阅读 · 2017年12月23日
深度学习基础之LSTM
全球人工智能
28+阅读 · 2017年12月18日
阿里流行音乐趋势预测-深度学习LSTM网络实现代码分享
机器学习研究会
11+阅读 · 2017年12月5日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
自创数据集,用TensorFlow预测股票教程 !(附代码)
十分钟掌握Keras实现RNN的seq2seq学习
机器学习研究会
10+阅读 · 2017年10月13日
相关论文
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Arxiv
19+阅读 · 2018年10月25日
Arxiv
14+阅读 · 2018年5月15日
Arxiv
4+阅读 · 2015年8月25日
Top
微信扫码咨询专知VIP会员