参考书目:陈允杰.TensorFlow与Keras——Python深度学习应用实战.北京:中国水利水电出版社,2021

本系列基本不讲数学原理,只从代码角度去让读者们利用最简洁的Python代码实现深度学习方法。


循环神经网络最初是用来处理文本数据的,自然语言都是时序数据,股价也是。循环神经网络可以专门用来预测时间序列数据,虽然股价预测是很难在实际中去应用,预测的也是不太准,因为股市的数据波动超级大,波动因素也不确定(还有一些别的原因下面数据处理时会介绍).....但是对于具有固定规律的时间序列数据预测还是不错的,比如天气,用电量负荷等等,本次采用Google股价数据作为循环神经网络的案例演示,别的时间序列数据也是通用。由于是预测价格,相当于是回归问题。文本数据处理起来有点麻烦,因为涉及到词向量之类,文本要处理成矩阵才能送入神经网络运算,之后会介绍文本的情感分类问题。本次就当时间序列数据的回归问题案例。

循环神经网络最经典的就是RNN,LSTM,GRU三种,三种其实用法一样,下面都会介绍。

一般来说预测效果是LSTM>=GRU>RNN。


使用循环神经网络预测Google股价

Google股价可以在雅虎财经下载,或者去同花顺亿牛网东方财富网等随便下一支A股股价数据都行,一样用。

导入包,读取数据,查看数据长什么样子

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, Dropout,LSTM,SimpleRNN,GRUnp.random.seed(10)  # 指定乱数种子
# 载入Google股价的训练数据集
df_train = pd.read_csv("GOOG_Stock_Price_Train.csv",index_col="Date",parse_dates=True)
df_train

有每天的开盘价,最高价,最低价,收盘价,除权价,成交量,我们一般采用收盘价作为股价,本次使用调整的收盘价,也就是Adj Close

数据标准化,然后分割X和y,训练集和测试集(X是前60天股价,y是第61天股价,然后滑动窗口,得到所有的X和y)

X_train_set = df_train.iloc[:,4:5].values  # Adj Close欄位
#特征标准化 - 正规化
sc = MinMaxScaler()
X_train_set = sc.fit_transform(X_train_set)#取出几天前股价来建立成特征和标签数据集
def create_dataset(ds, look_back=1):X_data, Y_data = [],[]for i in range(len(ds)-look_back):X_data.append(ds[i:(i+look_back), 0])Y_data.append(ds[i+look_back, 0])return np.array(X_data), np.array(Y_data)
look_back = 60
print("回看天数:", look_back)# 分割成特征数据和标签数据
X_train, Y_train = create_dataset(X_train_set, look_back)print(X_train)

可以直接查看一下X和y的形状。由于是循环神经网络,要三维的数据输入,下面把X改为三维张量,查看形状。

# 转换成(样本数, 时步, 特征)张量
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
print("X_train.shape: ", X_train.shape)
print("Y_train.shape: ", Y_train.shape)

1198为样本个数,60是时间步长,1是一个特征,即单变量,只有股价一个特征变量。预测就相当于是前60天股价预测第61天股价。


定义RNN模型

首先使用最普通的循环神经网络——RNN

# 定义模型
model = Sequential()
model.add(SimpleRNN(50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(SimpleRNN(50))
model.add(Dropout(0.2))
model.add(Dense(1))
model.summary()   # 显示模型摘要资讯
#编译模型
model.compile(loss="mse", optimizer="adam")#训练模型
model.fit(X_train, Y_train, epochs=100, batch_size=32)

这里堆叠了两层的RNN,每层50个神经元,训练100轮

RNN训练起来特别慢,下面使用LSTM(如果想用GRU,直接把所有的LSTM改成GRU就行,其他的位置不需要任何改动,很方便)

定义LSTM(GRU)模型

# 定义模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(50))
model.add(Dropout(0.2))
model.add(Dense(1))
model.summary()   # 显示模型摘要资讯
#编译模型
model.compile(loss="mse", optimizer="adam")#训练模型
model.fit(X_train, Y_train, epochs=100, batch_size=32)

这里堆叠了3层LSTM层,训练结果如下

只看损失感觉很小,进一步和真实值对比

# 使用模型预测股价 - 2017年1~3月预测 4 月份股价
df_test = pd.read_csv("GOOG_Stock_Price_Test.csv")
X_test_set = df_test.iloc[:,4:5].values# 产生标签数据
_, Y_test = create_dataset(X_test_set, look_back)#特征数据和标准化
X_test_s = sc.transform(X_test_set)
X_test,_ = create_dataset(X_test_s, look_back)# 转换成(样本数, 时步, 特征)张量
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
X_test_pred = model.predict(X_test)#  将预测值转换回股价
X_test_pred_price = sc.inverse_transform(X_test_pred)

画图查看对比

#  绘出股价图表
import matplotlib.pyplot as plt
plt.plot(Y_test, color="red", label="Real Stock Price")
plt.plot(X_test_pred_price, color="blue", label="Predicted Stock Price")
plt.title("2017 Google Stock Price Prediction")
plt.xlabel("Time")
plt.ylabel("Google Time Price")
plt.legend()
plt.show()

看上去还不错.....但其实差的有点远,股价预测840,和真实值的830差的不多,但是真的实盘操作这10块很致命,可能就是赚钱和亏损的区别。

而且最严重的问题是,这是单步预测,即采用前60天的真实数据去预测61天的数据,下一个样本X也是用的真实数据。也就是说如果不知道真实数据的话,只能预测一步,只能预测到明天的价格,不能预测后天的价格。

当然解决办法是把预测出来的y作为下一个X放进去然后再预测,但是预测出出来的值和真实值是有差异的,X有误差了,那么估计的y也会有误差,并且滑动窗口越多,误差会累计得越来越大.....所以做长期的预测不准确的原因在这里。

当然,对于具有明显的周期性或者是趋势性的时间序列数据来说,循环神经网络的效果还是不错的,股价预测也只能是当案例看看了,只靠这种单一的价格模型去预测股价是很困难的。

Python深度学习05——Keras循环神经网络实现股价预测相关推荐

  1. Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)

    Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类) 1.卷积神经网络 1.1卷积神经网络简介 1.2卷积运算 1.3 深度学习与小数据问题的相关性 2.下载数据 2.1下载原始数据 ...

  2. 深度学习 实验七 循环神经网络

    文章目录 深度学习 实验七 循环神经网络 一.问题描述 二.设计简要描述 三.程序清单 深度学习 实验七 循环神经网络 一.问题描述 之前见过的所以神经网络(比如全连接网络和卷积神经网络)都有一个主要 ...

  3. 《Python深度学习》Chapter 2——神经网络的数学基础

    <Deep Learning with Python >由Keras之父.现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和 ...

  4. [学习笔记] python深度学习---第三章 神经网络入门

    一.神经网络剖析 1. 训练神经网络主要围绕以下四个方面: (1) 层,多个层组合成网络(或模型). (2)输入数据和相应的目标. (3)损失函数,即用于学习的反馈信号. (4)优化器,决定学习过程如 ...

  5. 《深度学习》之 循环神经网络 原理 超详解

    循环神经网络 一.研究背景 1933年,西班牙神经生物学家Rafael Lorente de Nó发现大脑皮层(cerebral cortex)的解剖结构允许刺激在神经回路中循环传递,并由此提出反响回 ...

  6. 《Python 深度学习》刷书笔记 Chapter 3 预测房价:回归问题

    文章目录 波士顿房价数据集 3-24 加载波士顿房价数据 3-25 数据标准化 3-26 模型定义 3-27 K折验证 3-28 训练500轮,保存每折的验证结果 3-29 计算所有轮次茨种的K折验证 ...

  7. Python 深度学习库 Keras 发布官方中文文档,这里有你需要了解的一切

    今年1月,Keras作者.谷歌AI研究员François Chollet在推特上发出召唤:讲中文的Keras用户们,是否有人愿意帮忙一起搞个Keras文档的中文版? 一个多月后,官方中文文档来了. K ...

  8. Python 深度学习 Class 2:神经网络的数学基础

    目录 2.1 初始神经网络 1.加载Mnist数据集 2.网络架构 3.编译步骤 4.准备图像数据 5.准备标签 6.训练网络 2.2 数据表示 1.标量 2.向量 3.矩阵 4.高维张量 5.关键属 ...

  9. 使用深度学习中的循环神经网络(LSTM)进行股价预测

    tushare ID:468684 一.开发环境: 操作系统:Windows10 开发工具:PyCharm 2021.1.1 (Professional Edition) Python版本:Pytho ...

  10. 深度学习TensorFlow2,循环神经网络(RNN,LSTM)系列知识

    一:概述 二:时间序列 三:RNN 四:LSTM 一:概述 1.什么叫循环? 循环神经网络是一种不同于ResNet,VGG的网络结构,个人理解最大的特点就是:它通过权值共享,极大的减少了权值的参数量. ...

最新文章

  1. opencv配置(转)
  2. linux定时脚本任务
  3. 欧几里得算法及其扩展
  4. php ajax练习
  5. StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎
  6. STM32工作笔记0096---用sprintf分配内存
  7. 正则表达式 java 截取指定字符中间的字符串
  8. 项目组最重要的三个角色
  9. 微波雷达感应模块技术,应用于老人典型的跌倒场景,为老人安全保驾护航
  10. SCORM的对手——LOM
  11. Python可视化数据学习
  12. Copy On Write机制了解一下
  13. 03.spring framework的AOP
  14. win7中能对窗口的排列方法是_win7系统窗口智能排列的操作方法
  15. win11任务管理器怎么打开?win11任务管理器打开的技巧方法
  16. tomcat启动异常:子容器启动失败(a child container failed during start)
  17. ISP和IAP的一些基本概念
  18. 【项目实战】java实现向日葵远程控制功能
  19. termux使用教程python手机_安装Termux的手机上运行Python
  20. [BUUCTF]第八天训练日记

热门文章

  1. xsh报告-推荐系统
  2. windows系统背景淡绿护眼色设置
  3. 手机端API框架流程(学习笔记)
  4. Java练习题【新】
  5. 公历转农历的程序(代码转载于网络)
  6. html制作古诗网页早发白帝城,《早发白帝城》古诗词
  7. 老徐WEB:js入门学习 - javascript函数和闭包
  8. 设置、取消word英文首字母大写
  9. 燕山八景之居庸叠翠(内含大图)
  10. 无器械健身锻炼全身肌肉的方法