实践

股票预测

原始数据

下载
图片描述

代码(单层LSTM)

# 数据预处理
## 导入数据
df = pd.read_csv('/Users/Nick/Desktop/stock_dataset.csv')
data = np.array(df['最高价'])
data = data[::-1] # 按时间升序
normalize_data=(data-np.mean(data))/np.std(data) #标准化
normalize_data=normalize_data[:,np.newaxis]# (6111, 1)
## 生成训练集
time_step=20    #时间步
rnn_unit=10       #lstm输出维度
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()) # (6090, 20, 1)
    train_y.append(y.tolist()) # (6090, 20, 1)

# 构建图
tf.reset_default_graph()
## 变量
X = tf.placeholder(tf.float32, [batch_size, time_step, input_size])
Y = tf.placeholder(tf.float32, [batch_size, time_step, output_size])
## 模型
cell = tf.nn.rnn_cell.LSTMCell(rnn_unit, num_proj=output_size)
output_rnn, final_states = tf.nn.dynamic_rnn(cell, X,initial_state=init_state, dtype=tf.float32)
pred = output_rnn
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())
    for i in range(100):
        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

参考

单层/多层/双向LSTM参数含义及实践
LSTM中units参数的理解
理解LSTM网络译文
有趣的RNN实践


NickZhang
0 声望0 粉丝