背景知识

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

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

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

在股票这个场景下,通过上面这个图可以看出来,输入的是时间t、t+1、t+2的股票信息,可以返回t+1、t+2、t+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值除以历史股票最高值,将所有数据的定义域限定在0到1之间。接着构建预测集,涉及到两个参数input_size和num_steps,当input_size=3 and num_steps=2时会构建以下数据集。

第0、1、2天的股票和第3、4、5天的股票为训练集,第6、7、8天的股票是目标列,就构成了监督学习数据。以此类推,将所有数据构成训练数据集。

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

深度学习RNN实现股票预测实战(附数据、代码)的更多相关文章

  1. 盘它!!一步到位,Tensorflow 2的实战 !!LSTM下的股票预测(附详尽代码及数据集)

    关键词:tensorflow2.LSTM.时间序列.股票预测 Tensorflow 2.0发布已经有一段时间了,各种新API的确简单易用,除了官方文档以外能够找到的学习资料也很多,但是大都没有给出实战 ...

  2. 深度学习中正则化技术概述(附Python代码)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 磐石 介绍 数据科学研究者们最常遇见的问题之一就是怎样避免过拟合. ...

  3. 时间序列深度学习:seq2seq 模型预测太阳黑子

    目录 时间序列深度学习:seq2seq 模型预测太阳黑子 学习路线 商业中的时间序列深度学习 商业中应用时间序列深度学习 深度学习时间序列预测:使用 keras 预测太阳黑子 递归神经网络 设置.预处 ...

  4. 深度学习Anchor Boxes原理与实战技术

    深度学习Anchor Boxes原理与实战技术 目标检测算法通常对输入图像中的大量区域进行采样,判断这些区域是否包含感兴趣的目标,并调整这些区域的边缘,以便更准确地预测目标的地面真实边界框.不同的模型 ...

  5. 蛋白质组DIA深度学习之谱图预测

    目录 1. 简介 2. 近几年发表的主要工具 1.DeepRT 2.Prosit 3. DIANN 4.DeepDIA 1. 简介 基于串联质谱的蛋白质组学大部分是依赖于数据库(database se ...

  6. 基于深度学习的建筑能耗预测01——Anaconda3-4.4.0+Tensorflow1.7+Python3.6+Pycharm安装

    基于深度学习的建筑能耗预测-2021WS-02W 一,安装python及其环境的设置 (写python代码前,在电脑上安装相关必备的软件的过程称为环境搭建) · 完全可以先安装anaconda(会自带 ...

  7. 基于python深度学习的apk风险预测脚本

    基于python深度学习的apk风险预测脚本 为了有效判断安卓apk有无恶意操作,利用python脚本,通过解包apk文件,对其中xml文件进行特征提取,通过机器学习构建模型,预测位置的apk包是否有 ...

  8. TensorFlow深度学习!构建神经网络预测股票价格!⛵

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 TensorFlow 实战系列:https://www.showmeai ...

  9. Predicting effects of noncoding variants with deep learning–based sequence model | 基于深度学习的序列模型预测非编码区变异的影响

    Predicting effects of noncoding variants with deep learning–based sequence model PDF Interpreting no ...

随机推荐

  1. 50个必备常用的jQuery代码段

    1. 如何修改jQuery默认编码(例如默认UTF-8改成改GB2312): $.ajaxSetup({ ajaxSettings:{ contentType:"application/x- ...

  2. 【codeforces】Bear and Three Balls(排序,去重)

    Bear and Three Balls Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  3. HTTP、TCP、UDP以及SOCKET

    HTTP.TCP.UDP以及SOCKET 一.TCP/IP代表传输控制协议/网际协议,指的是一系列协组. 可分为四个层次:数据链路层.网络层.传输层和应用层. 在网络层:有IP协议.ICMP协议.AR ...

  4. (1)变量、常量、程序交互、数据类型、bool、基本运算符

    什么是变量 变量由变量名和变量值组成 name = 'Alex Li'  这个算式就是将一个值赋予给变量,也就是声明变量的意思 name 就是一个变量,也是一个变量的名字 'Alex Li' 就是一个 ...

  5. IP相关的方法

    1.验证是否为IP地址 def isIP(ip, with_netmask=True): """ 判断IP的格式是否正确 :param ip: IP字符串 :param ...

  6. 阿里云流计算专场-GitHub上相关文档

    阿里云流计算专场-GitHub路径:https://github.com/Alibaba-Technology/hangzhouYunQi2017ppt

  7. 监控分析——Web中间件

    发现 中间件监控看是否有性能瓶颈 核心:主要看中间件的线性池进程池有没有排队情况,请求是否处理及时就OK Apache 以前php都是用apache,现在基本用nginx了. 首先自己启动apache ...

  8. c++中的流

    streambuf类为缓冲区提供内存,并提供了用于填充缓冲区,访问缓冲区,刷新新缓冲区和管理缓冲区内存的类方法. ios_base类表示流的一般特征,如是否可读,是二进制还是文本流等. ios类基于i ...

  9. graphEdit

    目的 实现支持算法流程图 参考代码 c# DSGraphEdit - CodeProject NetworkView: A WPF custom control for visualizing and ...

  10. 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型 ...