背景知识

最近再看一些量化交易相关的材料,偶然在网上看到了一个关于用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. 【深度学习】一文详解RNN及股票预测实战(Python)!

    循环神经网络(RNN)是基于序列数据(如语言.语音.时间序列)的递归性质而设计的,是一种反馈类型的神经网络,其结构包含环和自重复,因此被称为"循环".它专门用于处理序列数据,如逐字 ...

  2. 一文详解 RNN 及股票预测实战(Python)!

    作者 | 泳鱼 来源 | 算法进阶 循环神经网络(RNN)是基于序列数据(如语言.语音.时间序列)的递归性质而设计的,是一种反馈类型的神经网络,其结构包含环和自重复,因此被称为"循环&quo ...

  3. 一文详解RNN及股票预测实战(Python)

    循环神经网络(RNN)是基于序列数据(如语言.语音.时间序列)的递归性质而设计的,是一种反馈类型的神经网络,其结构包含环和自重复,因此被称为"循环".它专门用于处理序列数据,如逐字 ...

  4. 基于深度学习的YOLO目标检测研究-附Matlab代码

    目录 ✳️ 一.引言 ✳️ 二.YOLO的基本思想 ✳️ 三.实验验证 ✳️ 四.参考文献 ✳️ 五.Matlab代码获取 ✳️ 一.引言 目标检测是计算机视觉中的一个研究热点,在很多领域都有应用需求 ...

  5. 【信号识别】基于深度学习CNN实现信号调制分类附matlab代码

    1 简介 大容量.高速率的信息传输需求极大地推动了认知无线电领域的技术发展,其中,复杂电磁环境中信道均衡及通信调制类型识别技术,是该领域重要组成之一.传统的均衡处理主要是利用梯度下降法逼近信道特征,在 ...

  6. MATLAB算法实战应用案例精讲-【深度学习】扩散模型(DM)(附python代码实现)

    目录 前言 广播模型 扩散模型 几个高频面试题目 GAN.VAE和基于流的生成模型之间的区别

  7. 深度学习根据文字生成图片教程(附python代码)

    向AI转型的程序员都关注了这个号

  8. 告别RNN,迎来TCN!将深度学习应用于股市预测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|计算机视觉联盟 本文介绍了 TCN 在股市趋势预测任务中 ...

  9. 深度学习12大常见问题解答(附答案)

    阿尔法狗让深度学习登上了数据科学世界的巅峰.深度学习成为了当今最热门的话题之一,但对于大多数人来说,这是一个陌生而又神秘的学科.很多人认为,深度学习就是包括了大量的数学和统计知识. 本文列举了常见的1 ...

最新文章

  1. 写给程序员的 HR 面试指南,助你踢好面试的临门一脚!
  2. 【JOURNAL】911的虚惊
  3. 简述C/S和B/S模式的区别
  4. Hibernate中常见的异常
  5. [python学习] 模仿浏览器下载CSDN源文并实现PDF格式备份
  6. ubuntu16.04中安装tensflow教程
  7. java判断一个整数是不是素数(质数)
  8. linux uniq 命令详解
  9. PHP判断浏览器类型和浏览器语言(附各国语言简写代码)
  10. 第三部分 虚拟机执行子系统
  11. 某人说自己是佛菩萨转世,什么情况下才可信
  12. 稳定版本php源包下载,PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)20170501更新...
  13. 绿联USB3.0扩展坞网卡:显示未连接;及Mac共享wifi
  14. 迈高图手机版_迈高图地图数据下载器
  15. 阿里云大学云学院 “人工智能” 专业重磅预售
  16. VS2017好用的插件推荐
  17. 最大流问题与Ford-Fulkerson算法介绍
  18. 南大计算机学硕复试,2017年南京大学计算机科学与技术系考研复试名单
  19. wps小写金额转大写快捷键,wps表格怎么把金额变为大写
  20. 1946年产生的第一台电子计算机6,1946年第一台计算机在美国诞生——青夏教育精英家教网——...

热门文章

  1. 算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs
  2. echarts 刻度 双y轴_ECharts 解决双Y轴刻度不一致问题
  3. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和
  4. 违反了primarykey约束怎么解决_前期物业服务合同对主业有约束力吗?
  5. php获取citypicker的值,城市选择city-picker
  6. 大学计算机组装与维修考试题,【校选修】计算机组装与维修 考试题
  7. es mysql延迟_ES 近实时搜索 更新延迟问题
  8. 非此即彼的逻辑错误_辩证思维与逻辑思维相对立
  9. android accessibility 模拟键盘事件_H5 键盘兼容性小结
  10. php读取html中元素属性,读写HTML元素的css 属性