Tensorflow实例:利用LSTM预测股票每日最高价(一)

RNN与LSTM

这一部分主要涉及循环神经网络的理论,讲的可能会比较简略。

什么是RNN

RNN全称循环神经网络(Recurrent Neural Networks),是用来处理序列数据的。在传统的神经网络模型中,从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多关于时间序列的问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面时刻的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。 
说了这么多,用一张图表示,就是这个样子。

 
传统的神经网络中,数据从输入层输入,在隐藏层加工,从输出层输出。RNN不同的就是在隐藏层的加工方法不一样,后一个节点不仅受输入层输入的影响,还包受上一个节点的影响。 
展开来就是这个样子: 

图中的xt−1 ,xt , xt+1就是不同时刻的输入,每个x都具有input layer的n维特征,依次进入循环神经网络以后,隐藏层输出st受到上一时刻st−1的隐藏层输出以及此刻输入层输入xt 的两方影响。 
如果要更详细地了解tensorflow对RNN的解释,清戳官方tensorflow.RNN 
另外推荐的学习资料:WildML

什么是LSTM

LSTM全称长短期记忆人工神经网络(Long-Short Term Memory),是对RNN的变种。举个例子,假设我们试着去预测“I grew up in France… 中间隔了好多好多字……I speak fluent __”下划线的词。我们拍脑瓜子想这个词应该是French。对于循环神经网络来说,当前的信息建议下一个词可能是一种语言的名字,但是如果需要弄清楚是什么语言,我们是需要离当前下划线位置很远的“France” 这个词信息。相关信息和当前预测位置之间的间隔变得相当的大,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。 
这个时候就需要LSTM登场了。在LSTM中,我们可以控制丢弃什么信息,存放什么信息。 
具体的理论这里就不多说了,推荐一篇博文Understanding LSTM Networks,里面有对LSTM详细的介绍,有网友作出的翻译请戳[译] 理解 LSTM 网络

股票预测

在对理论有理解的基础上,我们使用LSTM对股票每日最高价进行预测。在本例中,仅使用一维特征。 
数据格式如下: 

本例取每日最高价作为输入特征[x],后一天的最高价最为标签[y] 
获取数据,请戳stock_dataset.csv,密码:md9l

导入数据:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tensorflow
f=open('stock_dataset.csv')
df=pd.read_csv(f)     #读入股票数据
data=np.array(df['最高价'])   #获取最高价序列
data=data[::-1]      #反转,使数据按照日期先后顺序排列
#以折线图展示data
plt.figure()
plt.plot(data)
plt.show()
normalize_data=(data-np.mean(data))/np.std(data)  #标准化
normalize_data=normalize_data[:,np.newaxis]  #增加维度
#———————————————————形成训练集—————————————————————
#设置常量
time_step=20      #时间步
rnn_unit=10       #hidden layer units
batch_size=60     #每一批次训练多少个样例
input_size=1      #输入层维度
output_size=1     #输出层维度
lr=0.0006         #学习率
train_x,train_y=[],[]   #训练集
for i in range(len(normalize_data)-time_step-1):
    x=normalize_data[i:i+time_step]
    y=normalize_data[i+1:i+time_step+1]
    train_x.append(x.tolist())
    train_y.append(y.tolist()) 

 

 

出来的train_x就是像这个样子:

[[[-1.59618],……中间还有18个……, [-1.56340]]
  ……
 [[-1.59202] [-1.58244]]]

 

是一个shape为[-1,time_step,input__size]的矩阵

定义神经网络变量

X=tf.placeholder(tf.float32, [None,time_step,input_size])    #每批次输入网络的tensor
Y=tf.placeholder(tf.float32, [None,time_step,output_size]) #每批次tensor对应的标签

#输入层、输出层权重、偏置
weights={
         'in':tf.Variable(tf.random_normal([input_size,rnn_unit])),
         'out':tf.Variable(tf.random_normal([rnn_unit,1]))
         }
biases={
        'in':tf.Variable(tf.constant(0.1,shape=[rnn_unit,])),
        'out':tf.Variable(tf.constant(0.1,shape=[1,]))
        }

 

定义lstm网络

def lstm(batch):  #参数:输入网络批次数目
    w_in=weights['in']
    b_in=biases['in']
    input=tf.reshape(X,[-1,input_size])  #需要将tensor转成2维进行计算,计算后的结果作为隐藏层的输入
    input_rnn=tf.matmul(input,w_in)+b_in
    input_rnn=tf.reshape(input_rnn,[-1,time_step,rnn_unit])  #将tensor转成3维,作为lstm cell的输入
    cell=tf.nn.rnn_cell.BasicLSTMCell(rnn_unit)
    init_state=cell.zero_state(batch,dtype=tf.float32)
    output_rnn,final_states=tf.nn.dynamic_rnn(cell, input_rnn,initial_state=init_state, dtype=tf.float32)  #output_rnn是记录lstm每个输出节点的结果,final_states是最后一个cell的结果
    output=tf.reshape(output_rnn,[-1,rnn_unit]) #作为输出层的输入
    w_out=weights['out']
    b_out=biases['out']
    pred=tf.matmul(output,w_out)+b_out
    return pred,final_states

 

训练模型

def train_lstm():
    global batch_size
    pred,_=rnn(batch_size)
    #损失函数
    loss=tf.reduce_mean(tf.square(tf.reshape(pred,[-1])-tf.reshape(Y, [-1])))
 train_op=tf.train.AdamOptimizer(lr).minimize(loss)
    saver=tf.train.Saver(tf.global_variables())
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        #重复训练10000次
        for i in range(10000):
            step=0
            start=0
            end=start+batch_size
            while(end<len(train_x)):
                _,loss_=sess.run([train_op,loss],feed_dict={X:train_x[start:end],Y:train_y[start:end]})
                start+=batch_size
                end=start+batch_size
                #每10步保存一次参数
                if step%10==0:
                    print(i,step,loss_)
                    print("保存模型:",saver.save(sess,'stock.model'))
                step+=1

 

预测模型

def prediction():
    pred,_=lstm(1)    #预测时只输入[1,time_step,input_size]的测试数据
    saver=tf.train.Saver(tf.global_variables())
    with tf.Session() as sess:
        #参数恢复
        module_file = tf.train.latest_checkpoint(base_path+'module2/')
        saver.restore(sess, module_file)
        #取训练集最后一行为测试样本。shape=[1,time_step,input_size]
        prev_seq=train_x[-1]
        predict=[]
        #得到之后100个预测结果
        for i in range(100):
            next_seq=sess.run(pred,feed_dict={X:[prev_seq]})
            predict.append(next_seq[-1])
            #每次得到最后一个时间步的预测结果,与之前的数据加在一起,形成新的测试样本
            prev_seq=np.vstack((prev_seq[1:],next_seq[-1]))
        #以折线图表示结果
        plt.figure()
        plt.plot(list(range(len(normalize_data))), normalize_data, color='b')
        plt.plot(list(range(len(normalize_data), len(normalize_data) + len(predict))), predict, color='r')
        plt.show()

 

代码

完整代码

这一讲只有把最高价作为特征,去预测之后的最高价趋势,下一讲会增加输入的特征维度,把最低价、开盘价、收盘价、交易额等作为输入的特征对之后的最高价进行预测。

本文转自博客园知识天地的博客,原文链接:Tensorflow实例:利用LSTM预测股票每日最高价(一),如需转载请自行联系原博主。

时间: 2024-09-19 05:24:59

Tensorflow实例:利用LSTM预测股票每日最高价(一)的相关文章

(转)干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码)

干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码)   该博客来源自:https://mp.weixin.qq.com/s?__biz=MzA4NzE1NzYyMw==&mid=2247492203&idx=5&sn=3020c3a43bd4dd678782d8aa24996745&chksm=903f1c73a74895652ee688d070fd807771e3fe6a8947f77f3a15a44a65557da0313ac5ad59

《BI那点儿事》Microsoft 逻辑回归算法——预测股票的涨跌

原文:<BI那点儿事>Microsoft 逻辑回归算法--预测股票的涨跌 数据准备:一组股票历史成交数据(股票代码:601106 中国一重),起止日期:2011-01-04至今,其中变量有"开盘"."最高"."最低"."收盘"."总手"."金额"."涨跌"等 UPDATE FactStock SET [涨跌] = N'涨' WHERE [涨幅] >

Spark 数据挖掘 - 利用决策树预测森林覆盖类型

Spark 数据挖掘-利用决策树预测森林覆盖类型 1 前言 预测问题记住一点:最垃圾的预测就是使用平均值,如果你的预测连比直接给出平均值效果都要差,那就省省吧!统计学诞生一个多世纪之后,随着现在机器学习和数据科学的产生,我们依旧使用回归的思想来进行预测,尽管回归 就是用平均值向后不断回滚来预测.回归的技术和分类的技术紧密相关.通常情况下,当目标变量是连续数值时指的是回归,例如预测 身高和体重.当预测的目标变量是名义或者说是类别变量时,指的就是分类,例如预测邮件是否是垃圾邮件.无论是分类还是回归,

自创数据集,用TensorFlow预测股票教程 !(附代码)

STATWORX 团队近日从 Google Finance API 中精选出了 S&P 500 数据,该数据集包含 S&P 500 的指数和股价信息.有了这些数据,他们就希望能利用深度学习模型和 500 支成分股价预测 S&P 500 指数.STATWORX 团队的数据集十分新颖,但只是利用四个隐藏层的全连接网络实现预测,读者也可以下载该数据尝试更加优秀的循环神经网络 本文非常适合初学者了解如何使用 TensorFlow 构建基本的神经网络,它全面展示了构建一个 TensorFlo

看深度学习框架排名第一的TensorFlow如何进行时序预测——第一篇

更多深度文章,请关注:https://yq.aliyun.com/cloud TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor).它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等.TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构

看深度学习框架排名第一的TensorFlow如何进行时序预测!

更多深度文章,请关注:https://yq.aliyun.com/cloud TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor).它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等.TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构

时间序列预测教程:如何利用 Python 预测波士顿每月持械抢劫案数量?

Jason Brownlee:时间序列预测法是一个过程,而获得良好预测结果的唯一途径是实践这个过程. 在本教程中,您将了解如何利用Python语言来预测波士顿每月持械抢劫案发生的数量. 本教程所述为您提供了一套处理时间序列预测问题的框架,包括方法步骤和工具,通过实践,可以用它来解决自己遇到的相关问题. 本教程结束之后,您将了解: 如何核查Python环境并准确地定义一个时间序列预测问题. 如何构建一套测试工具链,用于评估模型,开发预测原型.以及如何通过时间序列分析工具更好地理解你的问题. 如何开

一步一步带你用TensorFlow玩转LSTM

更多深度文章,请关注:https://yq.aliyun.com/cloud LSTM,全称为长短期记忆网络(Long Short Term Memory networks),是一种特殊的RNN,能够学习到长期依赖关系.LSTM由Hochreiter & Schmidhuber (1997)提出,许多研究者进行了一系列的工作对其改进并使之发扬光大. 了解LSTM请前往--LSTM的"前生今世" LSTM在解决许多问题上效果非常好,现在被广泛使用.它们主要用于处理序列数据.这个博

推特和脸书能否预测股票变动?

导读:股市近期的动荡不安牵动了一波股民的心情的上下翻飞,部分股民的资产更是经历了"奥迪-奥拓---奥妙-奥利奥-奥买噶!"的惨剧.当大部分股民还在关注专家分析.大盘数字时,一些捷足先登的数据分析公司已经开始利用社交媒体上的"社交情绪指数"分析获取股票信息了. 如何利用"Twitter"和"Facebook"上的"情绪指数"分析和预警股票?大数据文摘"金融与商业专栏"今日带您了解金融行业倾