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

背景知识

最近再看一些量化交易相关的材料,偶然在网上看到了一个关于用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

  • 49
    点赞
  • 423
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
RNN(循环神经网络)可以用于股票预测数据集。根据引用提供的信息,该项目使用了自2000年1月以来的Microsoft股票价格数据,并将时间序列数据转换为分类问题。使用TensorFlow的LSTM模型来预测股票价格,并使用MSE(均方误差)来衡量预测的准确性。 以下是使用RNN进行股票预测的一般步骤: 1. 准备数据集:收集和整理股票价格数据集,包括时间和价格。 2. 数据预处理:对数据进行归一化、平滑处理或其他必要的预处理步骤,以便更好地适应RNN模型。 3. 划分训练集和测试集:将数据集划分为训练集和测试集,通常是按照时间顺序划分,例如将80%的数据用于训练,20%的数据用于测试。 4. 构建RNN模型:使用TensorFlow或其他深度学习框架构建RNN模型,例如LSTM(长短期记忆网络)模型。 5. 训练模型:使用训练集对RNN模型进行训练,通过迭代优化模型参数来提高预测准确性。 6. 预测股票价格:使用训练好的模型对测试集中的股票价格进行预测。 7. 评估模型:使用MSE等指标评估模型的预测准确性。 8. 可视化结果:将预测结果可视化,与实际股票价格进行比较,以便更好地理解模型的性能。 请注意,RNN在长期预测方面可能存在一些缺点,如引用所述。因此,在使用RNN进行股票预测时,需要注意时间跨度较大时预测结果可能会变得不准确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值