RNN实战:股市预测

完整的工作代码可在github.com/lilianweng/stock-rnn找到。如果你不知道什么是循环神经网络(RNN)长短期记忆网络(LSTM)单元,可以翻阅作者之前的文章,或者查看云栖翻译小组其他文章

互联网上也有很多类似教程,比如:

·     
使用Tensorflow实现RNN-LSTM的noob指南

·     
TensorFlow RNN教程

·     
LSTM通过使用Tensorflow的示例

·     
如何在TensorFlow中构建RNN

·     
Tensorflow中的RNN,实用指南和未记载的特征

·     
使用循环神经网络(LSTM)和TensorFlow进行序列预测

·     
任何人都可以学习在Python中编写LSTM-RNN

·     
如何使用RNN,TensorFlow和Cloud ML Engine进行时间序列预测

但是作者仍然坚持写出这篇文章主要有三个原因:

1.
技术在发展,早期的教程不能应付新版本。

2.
大多数教程使用的事例是合成数据,而作者在这该文中所用事例数据皆来源于现实生活。

3.
有些教程如果你事先了解关于Tensorflow API的一些信息,这将使得在理解它们时存在困难。

文中,作者以宾夕法尼亚大学(Penn Tree
Bank,PTB)数据集上的官方例子为起点。虽然PTB示例以漂亮的模块化设计模式展示RNN模型,但在理解模型结构中会有些难度,为此,作者建立了易于理解的图表。

数据准备:

股票价格是长度为N的时间序列,定义为p0,p1,... ,pN- 1,其中pi是指在第i日的收盘价,0≤i<N。试想一下,我们有一个固定大小的滑动窗口w(下文将其称为input_size),为了保障所有的滑动窗口中的数据之间不重叠,我们需要每次将窗口向右移动w个单位。

上图为标准普尔500价格。我们在一个滑动窗口中使用内容来预测下一个,而在两个连续的窗口之间没有重叠。

将建立的RNN模型中LSTM单元作为基本的隐藏单元。我们使用在时间t内从第一个滑动窗口W0到窗口Wt的值:

W0=(p0,p1,...,pw-1)

W1=(pw,pw+1,...p2w-1)

...

Wt=(ptw,ptw+1,...,p(t+1)w-1)

来预测下一个窗口Wt+1的值:

Wt+1=(p(t+1)w,p(t+1)w+1,...,p(t+2)w-1)

以上类似于在学习一个近似函数f(W0,W1,... ,Wt)≈Wt+1。

考虑到反向传播(BPTT)的工作方式的,我们通常将RNN训练成一个“展开”版本,这样我们就不需要做太多的传播计算,而且可以节省训练的复杂性。

价格的顺序首先被分成不重叠的小窗口。每个都包含input_size数字,每个都被认为是一个独立的输入元素。然后,任何num_steps连续的输入元素被分组到一个训练输入中,形成一个在Tensorfow上进行训练的“非滚动”版本的RNN。相应的标签就是它们后面的输入元素。

例如,如果input_size=3和num_steps=2,前几个训练的示例如下所示:

准备数据的完整代码在这里

数据标准化

以下我们以最新的10%的数据作为测试数据。S&P500指数随着时间的推移而增加,导致测试集中大部分数值超出训练集的范围,也就是说该模型必须预测一些以前从未见过的数字。

图: RNN模型必须预测训练数据的规模之外的数字

为解决这一问题,作者将任务变成预测相对变化率而不是绝对值。在t时刻的标准化滑动窗口W't中,所有的值除以最后一个滑动窗口Wt-1中的未知价格价格:

建立模型:

定义参数:

lstm_size:一个LSTM图层中的单元数量。

num_layers:堆叠的LSTM层的数量。

keep_prob:单元格单元在退出操作中保留的百分比。

init_learning_rate:开始学习的速率。

learning_rate_decay:后期训练时期的衰减率。

init_epoch:使用常量init_learning_rate的时期数。

max_epoch:训练中的时期总数

input_size:滑动窗口的大小/一个训练数据点

batch_size:在一个小批量中使用的数据点的数量。

LSTM模型是具有num_layers堆叠的LSTM层,每层包含lstm_size数量的LSTM单元。然后将保留概率为keep_prob的退出掩码应用于每个LSTM单元的输出。退出的目标是消除潜在的强烈具有依赖性维度,以防止过度拟合。

训练总共需要max_epoch 时期(epoch);一个时期(epoch)指所有训练数据点的一个完整通过。在一个时期(epoch)中,训练数据点被分成小批量batch_size的规模。我们发送一小批量的到一个BPTT学习的模型。学习速率在第一个init_epoch时期被设置为init_learning_rate,然后在每个后续时期learning_rate_decay使学习速率衰减。

# Configuration is wrapped in one object for easy tracking and passing.
class RNNConfig():
    input_size=1
    num_steps=30
    lstm_size=128
    num_layers=1
    keep_prob=0.8
    batch_size = 64
    init_learning_rate = 0.001
    learning_rate_decay = 0.99
    init_epoch = 5
max_epoch = 50
config = RNNConfig()

定义图形

tf.Graph没有依附于任何真实的数据。它主要用于处理数据和运行计算流程。如果用tf.session提供的数据,这时计算的数据是真实的。

(1)首先初始化一个新的图表。

import tensorflow as tf
tf.reset_default_graph()
lstm_graph = tf.Graph()

(2)图表的工作原理应在其范围内定义。

with lstm_graph.as_default():

(3)定义计算所需的数据。在这里需要三个输入变量,全部定义为tf.placeholder

1.inputs:训练数据X,形状张量(#数据例子num_steps,input_size); 数据示例的数量是未知的,所以是None。就这个示例而言,在训练中它将是batch_size。如果感到困惑,请查看输入格式示例

2.targets:训练标签y,形状张量(#数据例子input_size)。

3.learning_rate:一个简单的浮点数。

# Dimension = (
  # number of data examples,
  # number of input in one computation step,
  # number of numbers in one input
  # )
  # We don't know the number of examples beforehand, so it is None.
  inputs = tf.placeholder(tf.float32, [None, config.num_steps, config.input_size])
  targets = tf.placeholder(tf.float32, [None, config.input_size])
  learning_rate = tf.placeholder(tf.float32, None)

(4)该函数返回一个LSTMCell有无退出操作。

def _create_one_cell():
    return tf.contrib.rnn.LSTMCell(config.lstm_size,state_is_tuple=True)
        if config.keep_prob < 1.0:
            return tf.contrib.rnn.DropoutWrapper(lstm_cell, output_keep_prob=config.keep_prob)

(5)如果需要的话,我们可以将单元格堆叠成多层。MultiRNNCell有助于依次连接多个简单单元来组成一个单元。

cell = tf.contrib.rnn.MultiRNNCell(
        [_create_one_cell() for _ in range(config.num_layers)],
        state_is_tuple=True
    ) if config.num_layers > 1 else _create_one_cell()

(6)tf.nn.dynamic_rnn是由cell(RNNCell)指定的循环神经网络构建的。状态是指LSTM单元的当前状态,在这里没有消耗。

val, _ = tf.nn.dynamic_rnn(cell, inputs, dtype=tf.float32)

(7)tf.transpose输出的维度从(batch_size,num_steps,lstm_size)转换为(num_steps,batch_size,lstm_size),然后将其输出。

# Before transpose, val.get_shape() = (batch_size, num_steps, lstm_size)
    # After transpose, val.get_shape() = (num_steps, batch_size, lstm_size)
    val = tf.transpose(val, [1, 0, 2])
    # last.get_shape() = (batch_size, lstm_size)
    last = tf.gather(val, int(val.get_shape()[0]) - 1, name="last_lstm_output")

(8)定义隐藏层和输出层之间的权重和偏差。

weight = tf.Variable(tf.truncated_normal([config.lstm_size, config.input_size]))
    bias = tf.Variable(tf.constant(0.1, shape=[targets_width]))
    prediction = tf.matmul(last, weight) + bias

(9)我们使用均方误差作为损失度量和RMSPropOptimizer算法进行梯度下降优化。

 loss = tf.reduce_mean(tf.square(prediction - targets))
    optimizer = tf.train.RMSPropOptimizer(learning_rate)
    minimize = optimizer.minimize(loss)

训练阶段

(1)要开始用真实数据训练图表,我们需要先从一个tf.session开始。

with tf.Session(graph=lstm_graph) as sess:

(2)按照定义初始化变量。

tf.global_variables_initializer().run()

(3)训练时期的学习率应该预先计算好。指数是指epoch指数。

learning_rates_to_use = [
    config.init_learning_rate * (
        config.learning_rate_decay ** max(float(i + 1 - config.init_epoch), 0.0)
    ) for i in range(config.max_epoch)]

(4)下面的每个循环完成一次epoch训练。

for epoch_step in range(config.max_epoch):
        current_lr = learning_rates_to_use[epoch_step]
        # Check https://github.com/lilianweng/stock-rnn/blob/master/data_wrapper.py
        # if you are curious to know what is StockDataSet and how generate_one_epoch()
        # is implemented.
        for batch_X,batch_y in stock_dataset.generate_one_epoch(config.batch_size):
            train_data_feed = {
                inputs: batch_X,
                targets: batch_y,
                learning_rate: current_lr
            }
            train_loss, _ = sess.run([loss, minimize], train_data_feed)

(5)下面的每个循环完成一次epoch训练。

saver = tf.train.Saver()
    saver.save(sess, "your_awesome_model_path_and_name", global_step=max_epoch_step)

使用TensorBoard

在没有可视化的情况下构建图形,非常模糊和容易出错。Tensorboard提供的图形结构和学习过程简单可视,查看这个实践教程

小结

1.用于with [tf.name_scope]

(https://www.tensorflow.org/api_docs/python/tf/name_scope)("your_awesome_module_name"):将包含在类似目标上的元素一起打包。

2.许多tf.*方法接受name=参数。分配一个定制的名字可以让你阅读图表时更容易。

3.类似tf.summary.scalartf.summary.histogram的方法可以帮助跟踪迭代期间图中变量的值。

4.在训练课程中,用tf.summary.FileWriter定义一个日志文件:

with tf.Session(graph=lstm_graph) as sess:
    merged_summary = tf.summary.merge_all()
    writer = tf.summary.FileWriter("location_for_keeping_your_log_files", sess.graph)
    writer.add_graph(sess.graph)

之后,将训练进度和总结结果写入文件。

_summary = sess.run([merged_summary], test_data_feed)writer.add_summary(_summary, global_step=epoch_step)  # epoch_step in range(config.max_epoch)


上图由示例代码构建的RNN图。“训练”模块已经“从主图表中删除”,因为它在预测时间内不是模型的实际部分。


单击“output_layer”模块将其展开并详细检查结构。

完整的工作代码可在github.com/lilianweng/stock-rnn找到

结果

作者在示例中使用了以下配置。

num_layers=1

keep_prob=0.8

batch_size = 64

init_learning_rate
= 0.001

learning_rate_decay
= 0.99

init_epoch = 5

max_epoch = 100

num_steps=30

上图是在测试数据中最近200天的预测结果。使用input_size = 1和lstm_size = 32来训练模型。


上图是在测试数据中最近200天的预测结果。模型使用input_size = 1和lstm_size = 128进行训练。


上图在测试数据中的最近200天的预测结果。使用input_size = 5,lstm_size = 128和max_epoch = 75(替代50)训练模型。

如果您想进一步了解本教程中的示例代码可在github.com/lilianweng/stock-rnn:scripts找到

本文由北邮@爱可可-爱生活 老师推荐,阿里云组织翻译。

文章原标题《Predict Stock Prices Using RNN: Part 1》

作者:Lilian Weng

译者:乌拉乌拉,审校:袁虎。

文章为简译,更为详细的内容,请查看原文

时间: 2024-08-03 22:04:41

RNN实战:股市预测的相关文章

RNN实战:股票预测 2

       完整的工作代码可在github.com/lilianweng/stock-rnn找到.        RNN实战part1:股市预测        在第2部分的教程中,将继续探讨股票预测的话题,在第一部分我增添了一个循环神经网络(RNN),并赋予它应对多个股票价格预测的能力.为了区分与不同价格序列相关联的模式,我用股票符号嵌入向量作为输入的一部分. 数据集        在搜索过程中,我找到了用来查询雅虎!金融API的库.如果雅虎没有关闭获取历史数据的API,那么这个库是有用的.在

深度学习项目实战——“年龄预测”

更多深度文章,请关注:https://yq.aliyun.com/cloud 介绍: 你可以通过阅读或者观看视频/MOOC来学习数据科学,接着你就必须将学到的知识应用到解决问题当中来.你需要完成这两件事才能有效地完成你的学习计划.接下来这篇文章旨在向你介绍深度学习如何应用到一个有趣的问题. 今天我们将用深度学习来解决年龄检测问题. 如果你是刚刚想要进入深度学习领域的new boy.请先阅读下面的文章,它们能帮你了解并且快速进入深度学习领域: https://www.analyticsvidhya

日常新闻能用来精准预测股市动向吗?这篇聚焦开放数据的访谈或能给你答案

本文由北邮@爱可可-爱生活 老师推荐,阿里云组织翻译. 以下为译文: 日常新闻标题能用来精准地预测股市动向吗?这是Jiahao针对本次访谈中提及的数据集所提出的挑战.Jiahao从公开信息源中创建了面向股市预测的日常新闻数据集,用于一门他所教授的关于深度学习与自然语言处理的课程,并在Kaggle社区中分享. 在本次聚焦开放数据栏目中,Jiahao谈论了作为一名教师在Kaggle开放数据分析平台上共享数据集的理由,迄今为止Kaggle用户实现的一些重大的基准预测,以及他对基于新闻标题实现交易算法的

[股市实战秘籍]用新闻联播情绪指标炒股

"跟着新闻联播炒股有肉吃."对于这句话,很多老股民耳熟能详.不过,央视<新闻联播>究竟跟A股盘面有多大的关联度,跟着<新闻联播>究竟如何赚钱,真的有那么灵吗? 看看最近几次神预测吧 每天晚上20时20分,越来越多的投资者开始守着一项新的"炒股神器"--新闻联播情绪指标(以下简称"情绪指标"),因为该指标精准地预测了5月5日的大跌:而在此之前,该指标也一直显示着与市场"神同步"的"看多"

大数据预测:4个特征,11个典型行业

世界杯期间各家科技巨头利用大数据预测比赛结果,再现"章鱼保罗"雄风.世界杯结束了但大数据预测还会继续.从夜观天象到气象预报,从童话里的水晶球到今日的科技预言家,从地震云的传说再到科学家猛攻的地震预测,人类一直希望能够更早突破局限看穿未来.随着信息革命的深入,大数据时代的预测更加容易,人类的生活正在被大数据预测深刻改变. 预测是大数据核心价值 人们在谈论大数据的采集.存储和挖掘时,最常见的应用案例便是"预测股市""预测流感""预测消费者行

大数据预测将会改变哪些行业?

中介交易 SEO诊断 淘宝客 云主机 技术大厅 [i天下网商注]世界杯期间各家科技巨头利用大数据预测比赛结果,再现"章鱼保罗"雄风.世界杯结束了但大数据预测还会继续.随着信息革命的深入,大数据时代的预测更加容易,人类的生活正在被大数据预测深刻改变.大数据预测的逻辑基础是,每一种非常规的变化事前一定有征兆,每一件事情都有迹可循,如果找到了征兆与变化之间的规律,就可以进行预测.大数据预测无法确定某件事情必然会发生,它更多是给出一个概率. 文/ Mr.Jamie 从天气预报看大数据预测的四个

大数据预测4个特征,10个典型行业

世界杯期间,全球各大科技巨头都利用大数据来预测世界杯比赛赛果,着实是让大数据在世界杯彻底火了一把.别以为世界杯结束了,大数据的预测就不会停止.从预测各种现象到夜观星相,从天气预报到飞机失事,从美好童话世界里的水晶球到现在的科技预测未来.随着信息革命不断的深入,大数据时代下的预测也变得更加简单,而人类的生活进入了大数据预测时代. 预测是大数据核心价值 人们在谈论大数据的采集.存储和挖掘时,最常见的应用案例便是"预测股市""预测流感""预测消费者行为"

深度学习必备手册(上)

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 请收下这份关于人工智能的根目录--博客整理系列(一) 关于数据科学的那些事--博客整理系列(二) 机器学习必备手册--博客整理系列(三) 扩展眼界的都在这--博客整理系列(四) 深度学习必备手册--博客整理系列(六) 深度学习的概念源于人工神经网络的研究,如果追溯深度学习的概念还是要回到2006年Hinton那篇论文,基于深信度网(DNB)提出非监督贪心逐层训练算法,未解决深层结构相关的优化难题出现的论文.

机器学习必备手册

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 请收下这份关于人工智能的根目录--博客整理系列(一) 关于数据科学的那些事--博客整理系列(二) 机器学习必备手册--博客整理系列(三) 扩展眼界的都在这--博客整理系列(四) 深度学习必备手册(上)--博客整理系列(五) 深度学习必备手册(下)--博客整理系列(六) 机器学习是计算机科学的一个子领域,在人工智能领域,机器学习逐渐发展成模式识别和计算科学理论的研究.从2016年起,机器学习到达了不合理的火热巅