天天看点

RNN实战:股市预测

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

·     

<a href="http://monik.in/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow/">使用Tensorflow实现RNN-LSTM的noob指南</a>

<a href="https://svds.com/tensorflow-rnn-tutorial/">TensorFlow RNN教程</a>

<a href="https://medium.com/towards-data-science/lstm-by-example-using-tensorflow-feb0c1968537">LSTM通过使用Tensorflow的示例</a>

<a href="https://medium.com/@erikhallstrm/hello-world-rnn-83cd7105b767">如何在TensorFlow中构建RNN</a>

<a href="http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/">Tensorflow中的RNN,实用指南和未记载的特征</a>

<a href="http://mourafiq.com/2016/05/15/predicting-sequences-using-rnn-in-tensorflow.html">使用循环神经网络(LSTM)和TensorFlow进行序列预测</a>

<a href="https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/">任何人都可以学习在Python中编写LSTM-RNN</a>

<a href="https://medium.com/google-cloud/how-to-do-time-series-prediction-using-rnns-and-tensorflow-and-cloud-ml-engine-2ad2eeb189e8">如何使用RNN,TensorFlow和Cloud ML Engine进行时间序列预测</a>

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

1.

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

2.

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

3.

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

文中,作者以宾夕法尼亚大学(Penn Tree

<b>数据准备:</b>

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

RNN实战:股市预测

上图为标准普尔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。

RNN实战:股市预测

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

RNN实战:股市预测

<b>数据标准化</b>

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

RNN实战:股市预测

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

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

RNN实战:股市预测

<b>建立模型:</b>

<b>定义参数:</b>

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

num_layers:堆叠的LSTM层的数量。

init_learning_rate:开始学习的速率。

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

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

max_epoch:训练中的时期总数

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

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

<b>定义图形</b>

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

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

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

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

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

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

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

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

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

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

小结

1.用于with [tf.name_scope]

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

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

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

RNN实战:股市预测

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

RNN实战:股市预测

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

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

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

RNN实战:股市预测

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

RNN实战:股市预测

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

RNN实战:股市预测

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

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

作者:Lilian Weng

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

继续阅读