LSTM 实践--股票数据分析(1)

1. 前言

本文意在对LSTM有初步的实践操作,

相关代码在tec4tensorflow , 相关数据集在 stock_dataset.csv


2. 简介

LSTM全称长短期记忆人工神经网络(Long-Short Term Memory),是对RNN的变种。可以有效的解决梯度消失和梯度爆炸的问题。

在LSTM中,我们可以控制丢弃什么信息,存放什么信息。具体的理论这里就不多说了,推荐一篇博文Understanding LSTM Networks[2],里面有对LSTM详细的介绍,也可以看网友的翻译版[译] 理解 LSTM 网络。

3. LSTM应用实践--股票预测

在对理论有理解的基础上,我们使用LSTM对股票每日最高价进行预测。在本例中,仅使用一维特征。本例取每日最高价作为输入特征[x],后一天的最高价最为标签[y]。

数据格式如下:


时间,最高价格

3.1 LSTM 实践

了解了所训练的数据以后,我们就可以去动手实践了。

3.1.1 导入数据的操作

添加所需要的工具库:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import tensorflow as tf


读取数据集的数据

f=open('stock_dataset.csv')#指定文件引用

df=pd.read_csv(f)#读入股票数据

data=np.array(df['最高价'])#获取最高价列

data=data[::-1]#反转,使数据按照日期先后顺序排列

显示股票数据

#以折线图展示数据

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 #输入层维度,与数据集合中的x一致

output_size=1 #输出层维度,与label 一致

lr=0.0006 #学习率Learning Rate

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())


3.2 定义神经网络中使用的变量

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,]))
        }

3.3 定义lstm网络


简单的画了一下网络模型。最近刚刚会用OmmiGraffle,这次读的代码有些匆忙。回头把这张图补上。

网络图形

为了实现上图的循环神经网络,有必要先了解一下这些函数:

(1)tf.reshape函数用于对tensor的维度进行修改。示例如下:tf.reshape(<待修改维度的tensor>,[函数的维度])

input_rnn=tf.reshape(input_rnn,[-1,time_step,rnn_unit])

#time_step=20; rnn_unit=10

(2)定义单个基本的LSTM单元,应该使用tf.nn.rnn_cell.BasicLSTMCell(size, forget_bias=0.0, state_is_tuple=True)

在LSTM单元中,有2个状态值,分别是c和h,分别对应于下图中的c和h。其中h在作为当前时间段的输出的同时,也是下一时间段的输入的一部分。当state_is_tuple=True的时候,state是元组形式,state=(c,h)。如果是False,那么state是一个由c和h拼接起来的张量,state=tf.concat(1,[c,h])。在运行时,则返回2值,一个是h,还有一个state。

示例:

cell= tf.nn.rnn_cell.BasicLSTMCell(rnn_unit)#rnn_unit=10

一个BasicLSTMCell

(3)初始化网络的state : cell.zero_state() 示例:

init_state=cell.zero_state(batch,dtype=tf.float32) #batch=60

(4)进行时间展开的方法:tf.nn.dynamic_rnn(cell, inputs, sequence_length=None, initial_state=None,dtype=None,time_major=False)

此函数会通过,inputs中的max_time将网络按时间展开

参数解析

cell:将上面的lstm_cell传入就可以

inputs:[batch_size, max_time, size] , 如果time_major=Flase.  [max_time, batch_size, size] ,如果time_major=True。

sequence_length:是一个list,如果你要输入三句话,且三句话的长度分别是5,10,25,那么sequence_length=[5,10,25]

返回(outputs, states):output,[batch_size, max_time, num_units]。如果time_major=False。 [max_time,batch_size,num_units]如果time_major=True。states:[batch_size, 2*len(cells)]或[batch_size,s]

outputs输出的是最上面一层的输出,states保存的是最后一个时间输出的states

output_rnn,final_states=tf.nn.dynamic_rnn(cell, input_rnn,initial_state=init_state, dtype=tf.float32)

该部分的完整片段:

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


3.4 训练模型

定义损失函数:

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())

...

print("保存模型:",saver.save(sess,'stock.model'))

初始化图中的变量

sess.run(tf.global_variables_initializer())

传递数据:

_,loss_=sess.run([train_op,loss],feed_dict={X:train_x[start:end],Y:train_y[start:end]})


程序片段截图

3.5 预测模型

程序片段截图

4. 安装错误:

matplotlib: RuntimeError: Python is not installed as a framework

RuntimeError: Python is not installed as a framework 错误解决方案

5. 有用的工具命令

编码转变   iconv-f"gbk" -t"utf-8" < infile > outfile

6. 参考文献

[1] tensorflow 官方使用说明recurrent-neural-networks

[2] Understanding LSTM Networks 

[3] The Unreasonable Effectiveness of Recurrent Neural Networks

[4] tensorflow笔记:多层LSTM代码分析    

[5] tensorflow学习笔记(六):LSTM 与 GRU

[6] tf.contrib.rnn.static_rnn与tf.nn.dynamic_rnn区别

[7] tensorflow高阶教程:tf.dynamic_rnn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容