1.tensorflow中的seq2seq

在tensorflow中有两套seq2seq的接口。一套是tensorflow1.0版本之前的旧接口,在tf.contrib.legacy_seq2seq下;另一套为tensorflow1.0版本之后推出的新接口,在tf.contrib.seq2seq下。本文使用的是seq2seq的旧接口,旧接口的功能相对简单,是静态的展开模式,新接口功能更加强大,使用的是动态展开网络模型。想要了解新接口的使用情况,推荐这个网址https://blog.csdn.net/thriving_fcl/article/details/74165062

2.实力描述

使用seq2seq模式对某个股票前段时间的数据训练学习,拟合特征,从而达到第二天预测股票价格的效果。

3.导入股票数据

首先得准备一个股票数据,本人使用的是参考书中所提供的数据,想要数据集的可以在私信我。

添加股票载入函数loadstock,实例中将收盘价格载入内存做样本生成。

import random
import mathimport tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt  import pandas as pd
pd.options.mode.chained_assignment = None  # default='warn'
def loadstock(window_size):names = ['date','code','name','Close','top_price','low_price','opening_price','bef_price','floor_price','floor','exchange','Volume','amount','总市值','流通市值']data = pd.read_csv('600000.csv', names=names, header=None,encoding = "gbk")#predictor_names = ["Close",'top_price',"low_price","opening_price"]predictor_names = ["Close"]training_features = np.asarray(data[predictor_names], dtype = "float32")kept_values = training_features[1000:]X = []Y = []for i in range(len(kept_values) - window_size * 2):#  x ;前window_size,y后window_sizeX.append(kept_values[i:i + window_size])Y.append(kept_values[i + window_size:i + window_size * 2])X = np.reshape(X,[-1,window_size,len(predictor_names)])Y = np.reshape(Y,[-1,window_size,len(predictor_names)])print(np.shape(X))return X, Y

3.生成样本

X_train = []
Y_train = []
X_test = []
Y_test = []def generate_data(isTrain, batch_size):        # 用前40个样本预测后40个样本.seq_length = 40   seq_length_test = 80global Y_trainglobal X_trainglobal X_testglobal Y_test# First load, with memoization:if len(Y_train) == 0:       X, Y= loadstock( window_size=seq_length)#X, Y = normalizestock(X, Y)# Split 80-20:X_train = X[:int(len(X) * 0.8)]Y_train = Y[:int(len(Y) * 0.8)]if len(Y_test) == 0:X, Y  = loadstock( window_size=seq_length_test)#X, Y = normalizestock(X, Y)# Split 80-20:X_test = X[int(len(X) * 0.8):]Y_test = Y[int(len(Y) * 0.8):]if isTrain:return do_generate_x_y(X_train, Y_train, batch_size)else:return do_generate_x_y(X_test,  Y_test,  batch_size)def do_generate_x_y(X, Y, batch_size):assert X.shape == Y.shape, (X.shape, Y.shape)idxes = np.random.randint(X.shape[0], size=batch_size)X_out = np.array(X[idxes]).transpose((1, 0, 2))Y_out = np.array(Y[idxes]).transpose((1, 0, 2))return X_out, Y_out

4.设置参数及网络结构

网络模型定义为2层循环网络,每层12个GRUcell,使用MultiRNNcell将多个RNN连到一块,一起传入basic_rnn_seq2seq中。生成结果每时刻有12个grucell输出,所以还需要通过循环在每个时刻下加一个全连接层,将其转为输出维度为1的节点。

sample_now, sample_f = generate_data(isTrain=True, batch_size=3)
print("training examples : ")
print(sample_now.shape)
print("(seq_length, batch_size, output_dim)")seq_length = sample_now.shape[0]
batch_size = 100output_dim = input_dim = sample_now.shape[-1]
hidden_dim = 12 #12个grucell
layers_num = 2#两层循环网络# Optmizer:
learning_rate =0.04#学习率设为0.04
#nb_iters = 100
nb_iters = 100000
lambda_l2_reg = 0.003  # L2调节因子设为0.003tf.reset_default_graph()encoder_input = []
expected_output = []
decode_input =[]
for i in range(seq_length):encoder_input.append( tf.placeholder(tf.float32, shape=( None, input_dim)) )expected_output.append( tf.placeholder(tf.float32, shape=( None, output_dim)) )decode_input.append( tf.placeholder(tf.float32, shape=( None, input_dim)) )tcells = []
for i in range(layers_num):tcells.append(tf.contrib.rnn.GRUCell(hidden_dim))
Mcell = tf.contrib.rnn.MultiRNNCell(tcells)dec_outputs, dec_memory = tf.contrib.legacy_seq2seq.basic_rnn_seq2seq(encoder_input,decode_input,Mcell)reshaped_outputs = []
for ii in dec_outputs :reshaped_outputs.append( tf.contrib.layers.fully_connected(ii,output_dim,activation_fn=None))# 计算l2的loss值
output_loss = 0
for _y, _Y in zip(reshaped_outputs, expected_output):output_loss += tf.reduce_mean( tf.pow(_y - _Y, 2) )# 求正则化损失
reg_loss = 0
for tf_var in tf.trainable_variables():if not ("fully_connected" in tf_var.name ):#print(tf_var.name)reg_loss += tf.reduce_mean(tf.nn.l2_loss(tf_var))loss = output_loss + lambda_l2_reg * reg_loss
train_op = tf.train.AdamOptimizer(learning_rate).minimize(loss)   

4.训练样本

在session中将训练和测试单独封装成了两个函数,在train_batch函数里先取指定批次数据,通过循环增来将数据添加到encoder_input和expect_output列表中。

sess = tf.InteractiveSession()def train_batch(batch_size):X, Y = generate_data(isTrain=True, batch_size=batch_size)feed_dict = {encoder_input[t]: X[t] for t in range(len(encoder_input))}feed_dict.update({expected_output[t]: Y[t] for t in range(len(expected_output))})c =np.concatenate(( [np.zeros_like(Y[0])],Y[:-1]),axis = 0)feed_dict.update({decode_input[t]: c[t] for t in range(len(c))})_, loss_t = sess.run([train_op, loss], feed_dict)return loss_tdef test_batch(batch_size):X, Y = generate_data(isTrain=True, batch_size=batch_size)feed_dict = {encoder_input[t]: X[t] for t in range(len(encoder_input))}feed_dict.update({expected_output[t]: Y[t] for t in range(len(expected_output))})c =np.concatenate(( [np.zeros_like(Y[0])],Y[:-1]),axis = 0)#来预测最后一个序列feed_dict.update({decode_input[t]: c[t] for t in range(len(c))})    output_lossv,reg_lossv,loss_t = sess.run([output_loss,reg_loss,loss], feed_dict)print("-----------------")    print(output_lossv,reg_lossv)return loss_t# Training
train_losses = []
test_losses = []sess.run(tf.global_variables_initializer())
for t in range(nb_iters + 1):train_loss = train_batch(batch_size)train_losses.append(train_loss)if t % 50 == 0:test_loss = test_batch(batch_size)test_losses.append(test_loss)print("Step {}/{}, train loss: {}, \tTEST loss: {}".format(t,nb_iters, train_loss, test_loss))
print("Fin. train loss: {}, \tTEST loss: {}".format(train_loss, test_loss))        

5.准备可视化数据

在可视化部分,取时间序列2倍样本,前一部分用于输入模型,产生最后一天的预测值,后一部分用于数据显示,对比真实值与预测值之间差距。

# 测试
nb_predictions = 5
print("visualize {} predictions data:".format(nb_predictions))preout =[]
X, Y = generate_data(isTrain=False, batch_size=nb_predictions)
print(np.shape(X),np.shape(Y))
for tt in  range(seq_length):feed_dict = {encoder_input[t]: X[t+tt] for t in range(seq_length)}feed_dict.update({expected_output[t]: Y[t+tt] for t in range(len(expected_output))})c =np.concatenate(( [np.zeros_like(Y[0])],Y[tt:seq_length+tt-1]),axis = 0)  #从前15个的最后一个开始预测  feed_dict.update({decode_input[t]: c[t] for t in range(len(c))})outputs = np.array(sess.run([reshaped_outputs], feed_dict)[0])preout.append(outputs[-1])print(np.shape(preout))#将每个未知预测值收集起来准备显示出来。
preout =np.reshape(preout,[seq_length,nb_predictions,output_dim])

6.图画显示数据

for j in range(nb_predictions):plt.figure(figsize=(12, 3))for k in range(output_dim):past = X[:, j, k]expected = Y[seq_length-1:, j, k]#对应预测值的打印pred = preout[:, j, k]label1 = "past" if k == 0 else "_nolegend_"label2 = "future" if k == 0 else "_nolegend_"label3 = "Pred" if k == 0 else "_nolegend_"plt.plot(range(len(past)), past, "o--b", label=label1)plt.plot(range(len(past), len(expected) + len(past)),expected, "x--b", label=label2)plt.plot(range(len(past), len(pred) + len(past)),pred, "o--y", label=label3)plt.legend(loc='best')plt.title("Predictions vs. future")plt.show()

7.结果显示

loss函数图

股票示例结果图

序列80—120之间的点蓝色的*代表真实值,灰色的点代表预测值,总体预测结果与真实值相差不大

参考书籍:  李金洪老师的 深度学习之tensorflow

使用seq2seq预测当天的股票价格相关推荐

  1. bp神经网络预测_股指期货价格变动趋势往往反映的是股票价格的走势,因此BP神经网络对股指期货价格的准确预测就是对股票价格的准确预测。...

    一只猫の生活态度 对于投资者而言,利用BP神经网络模型对股指期货价格进行准确预测,可以帮助投资者构建较佳的投资组合,从而获取较好的投资收益,规避系统风险:对于国家而言,准确预测股指期货价格走势,有利于 ...

  2. [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)2

    最近有个任务:利用 RNN 进行句子补全,即给定一个不完整的句子,预测其后续的字词. 本文使用了 Seq2Seq 模型,输入为 5 个中文字词,输出为 1 个中文字词. 目录 关于RNN 语料预处理 ...

  3. [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)

    最近有个任务:利用 RNN 进行句子补全,即给定一个不完整的句子,预测其后续的字词. 本文使用了 Seq2Seq 模型,输入为5个中文字词,输出为一个中文字词. 目录 关于RNN 语料预处理 搭建数据 ...

  4. 如何利用开盘半小时预测当天走势

    开盘半小时多空双方的较量,基本决定和影响全天多空双方的价位观点,从而决定一天的走势.其基本原理在于开盘半小时多空双方的较量,基本决定和影响全天多空双方的价位观点,从而决定一天的走势. 研判条件:运用5 ...

  5. 用时序模型预测明天的股票价格

    前言 上次介绍了一个简单的量化交易策略,收到一堆私信询问如何使用深度学习的时序模型,那再抛砖引玉分享一下LSTM模型预测明天价格的方法. LSTM模型 长短期记忆(Long short-term me ...

  6. 神经网络可以用来预测吗,神经网络预测股票价格

    利用BP神经网络预测股票价格走势 20 谷歌人工智能写作项目:神经网络伪原创 如何利用Python预测股票价格 预测股票价格没有意义写作猫.单支股票价格,多股组合,大盘这些都可以使用神经网络来学习,0 ...

  7. 使用TensorFlow进行股票价格预测的简单深度学习模型

    使用TensorFlow进行股票价格预测的简单深度学习模型(翻译) 原文链接:https://medium.com/mlreview/a-simple-deep-learning-model-for- ...

  8. Python中TensorFlow长短期记忆神经网络LSTM、指数移动平均法预测股票市场时间序列和可视化

    最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出. 本文探索Python中的长短期记忆(LSTM)网络,以及如何使用它们来进行股市预测. 相关视频:LSTM神经网络架构和工作原理及 ...

  9. python 预测任意天后股票数据_在Python中使用LSTM进行股票市场预测

    本文概述 在本教程中, 你将看到如何使用称为长短期记忆的时间序列模型. LSTM模型功能强大, 特别是通过设计保留了长期记忆, 这一点将在以后看到.你将在本教程中解决以下主题: 了解为什么你需要能够预 ...

最新文章

  1. Pandas 数据挖掘与分析时的常用方法
  2. python之禅中文-「翻译」Python之禅
  3. HDU5730 FFT+CDQ分治
  4. 随机数生成java代码_Java Bullshifier –生成大量随机代码库
  5. python链表排序_链表排序+末尾各种排序
  6. git设置mergetool可视化工具
  7. C++ 函数参数的默认值和占位参数
  8. 教你使用Vue.js的DevTools来调试你的vue项目
  9. 自适应HTML5宽屏物流运输快递货运类网站源码 pbootcms模板
  10. python 文本处理库_实用又好用,6 款 Python 特殊文本格式处理库推荐
  11. Alpha阶段事后分析报告
  12. 智慧职教云答案在哪里找_智慧职教经济数学答案,智慧职教云答案在哪里找,智慧职教云答案去哪找...
  13. 70 行 Python 代码写春联,行书隶书楷书随你选
  14. 文献解读|DPP-4i治疗诱导的肠道微生物群的改变可改善葡萄糖稳态
  15. php--api发送钉钉消息
  16. 百度地图天气接口api调用
  17. selenium、you-get下载B站视频、监控播放量和弹幕
  18. 【HaaS Python硬件积木】土壤湿度传感器
  19. Spring Boot 实战(3)静态资源配置
  20. Spine制作骨骼动画的视频教程-spine,spine,spine

热门文章

  1. 制作Java告白exe应用程序(跑马灯+MusicPlayer)超简单
  2. 多线程爬取zxcs.me【代码记录】
  3. indicator function指示函数
  4. 微信小程序循环赋值坑(转)
  5. 【python】算法与数据结构例题分析
  6. 编译原理——正规式转DFA算法概述
  7. 新经济业态下的搬家物流服务要完善信用体系建设
  8. linux upper函数,使用XOR按位运算在linux中使用toupper和tolower函数
  9. STM32 Ymodem 协议及代码解析
  10. 论文总结3 对数线性模型 罗盛