目录

1.原始RNN的问题

2.LSTM

(1)原理

(2)Tensorflow2描述LSTM层

(3)LSTM股票预测


1.原始RNN的问题

RNN面临的较大问题是无法解决长跨度依赖问题,即后面节点相对于跨度很大的前面时间节点的信息感知能力太弱,如下图中的两句话:左上角的句子中sky可以由较短跨度的词预测出来,而右下角中的French与较长跨度之间的France有关系,即长跨度依赖,比较难预测。

长跨度依赖的根本问题在于,多阶段的反向传播后导致梯度消失、梯度爆炸。可以使用梯度截断去解决梯度爆炸问题,但无法轻易解决梯度消失问题。

下面举一个例子来解释RNN梯度消失和爆炸的问题:

假设时间序列有三段,为给定值,且为了简便假设没有激活函数和偏置,则RNN得前向传播过程如下:

假设在t=3时刻,损失函数为,其余时刻类似。则。梯度下降法训练就是对参数分别求偏导,然后按照梯度反方向调整他们使loss值变小得过程。假设只考虑t=3时刻得 ,这里考虑的偏导:

可以看出,只有三个时间点时,的偏导与的平方成正比。传统循环网络RNN可以通过记忆体实现短期记忆进行连续数据的预测,但是当连续数据的序列变长时会展开时间步长过长。当时间跨度变长时,幂次将变大。所以,如果为一个大于0小于1的数,随着时间跨度的增长,偏导值将会趋于0;同理,当较大时,偏导值将趋于无穷。这就是梯度消失和爆炸的原因。

2.LSTM

LSTM由Hochreiter&Schmidhuber于1997年提出,通过门控单元很好的解决了RNN长期依赖问题。

(1)原理

有兴趣的去看这篇文章吧,讲的很清楚也很明白了

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

(2)Tensorflow2描述LSTM层

tf.keras.layers.LSTM(units,activation='tanh',return_sequences=False
)

其中,units为神经元个数,activation为激活函数,默认为tanh,return_sequences为是否全部时刻返回输出,默认为False。

(3)LSTM股票预测

# -*- coding: utf-8 -*-
# @Time : 2022/10/2 15:15
# @Author : 中意灬
# @FileName: 基于LSTM的股票预测.py
# @Software: PyCharm
"""第一步:导入相关的库"""
import math
import os.path
import tensorflow as tf
import tushare as ts
import numpy as np
import tensorflow
import pandas as pd
from tensorflow.keras.layers import Dense,LSTM,Dropout
import matplotlib.pyplot as plt
from tensorflow.keras import Model
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error,mean_absolute_error"""第二步:准备数据"""datapath='/data.csv'
if os.path.exists(datapath):print("==========loading data==========")data=pd.read_csv(datapath)training_set=data.iloc[0:2427-300,2:3]test_set=data.iloc[2427-300:,2:3]
else:ts.set_token('f9e62b42d9f31fbf0267d9ba52204d37c5fef60f3d6091e9820c40a1')  # 这儿的token需要自己去turshare注册申请df = ts.get_k_data('600519', ktype='D', start='2012-01-01', end='2022-01-01')df.to_csv(datapath)data = pd.read_csv('./data.csv')training_set = data.iloc[0:2427 - 300, 2:3].valuestest_set = data.iloc[2427 - 300:, 2:3].values
#归一化
sc=MinMaxScaler(feature_range=(0,1))#初始化对象定义归一化:归一化到(0-1)间
training_set_scaler=sc.fit_transform(training_set)#求得训练集的最大值,最小值这些训练集固有的属性(反归一化所需要这些属性),并在训练集上进行归一化
test_set=sc.transform(test_set)#利用训练集的属性对测试集进行归一化
# print(training_set_scaler)
x_train=[]
x_test=[]
y_train=[]
y_test=[]
#利用for循环,遍历整个训练集,将训练集连续60天的数据作为训练特征x_train,第61天数据作为训练标签y_train
for i in range(60,len(training_set_scaler)):x_train.append(training_set_scaler[i-60:i,0])y_train.append(training_set_scaler[i,0])
#将训练特征和标签转换神经网络的输入格式,使x_train符合LSTM输入要求:[送入样本数,循环核时间展开步骤,每个时间步输入特征个数]
x_train,y_train=np.array(x_train),np.array(y_train)
x_train=np.reshape(x_train,(len(x_train),60,1))
#利用for循环,遍历整个训练集,将训练集连续60天的数据作为测试特征x_test,第61天数据作为测试标签y_test
for i in range(60,len(test_set)):x_test.append(test_set[i-60:i,0])y_test.append(test_set[i,0])
#将测试特征和标签转换神经网络的输入格式,使x_train符合LSTM输入要求:[送入样本数,循环核时间展开步骤,每个时间步输入特征个数]
x_test,y_test=np.array(x_test),np.array(y_test)
x_test=np.reshape(x_test,(len(x_test),60,1))
"""第三步:使用class类搭建LSTM神经网络模型"""
class LSTMModel(Model):def __init__(self):super(LSTMModel, self).__init__()self.l1=LSTM(256,activation='tanh',return_sequences=True)self.d1=Dropout(0.2)self.l2=LSTM(128,activation='tanh',return_sequences=False)self.d2=Dropout(0.2)self.f1=Dense(1)def call(self,x):x=self.l1(x)x=self.d1(x)x=self.l2(x)x=self.d2(x)x=self.f1(x)return x
"""第四步:使用model.compile配置神经网络参数"""
model=LSTMModel()
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),#自己设定adam的学习率,尽量先设置小,大了会收敛过快loss="mean_squared_error")#不必观察metrics值,没必要,只用观察loss值就可以checkpoint_save_path="./checkpoint/LSTN.ckpt"
if os.path.exists(checkpoint_save_path+'.index'):print("==========load the model==========")model.load_weights(checkpoint_save_path)
cp_callback=tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,save_weights_only=True,save_best_only=True,moniter='val_loss')
"""第五步:用model.fit训练神经网络模型"""
history=model.fit(x_train,y_train,batch_size=32,epochs=50,validation_data=(x_test,y_test),validation_freq=1,callbacks=[cp_callback])
#参数提取
file=open('./weights.txt','w')
for v in model.trainable_variables:file.write(str(v.name)+'\n')file.write(str(v.shape)+'\n')file.write(str(v.numpy())+'\n')
"""第六步:使用model.summary打印神经网络结构"""
model.summary()#绘制loss图像
plt.figure()
plt.plot(history.history['loss'],label='loss')
plt.plot(history.history['val_loss'],label='val_loss')
plt.title('Train and Validation loss')
plt.legend()
plt.show()#模型预测
predict_stock_openprice=model.predict(x_test)
#对预测数据反归一化
predict_stock_openprice=sc.inverse_transform(predict_stock_openprice)
#对真实数据反归一化
real_stock_openprice=sc.inverse_transform(test_set[60:])
#可视化
plt.figure()
plt.plot(real_stock_openprice,color='r',label='real')
plt.plot(predict_stock_openprice,color='b',label='predict')
plt.legend()
plt.show()##模型预测效果量化,数值越小,效果越好
#MSE 均方误差-->E[(预测值-真实值)^2]
mse=mean_squared_error(predict_stock_openprice,real_stock_openprice)
#RMSE 均方误差根-->sqrt(mse)
rmse=math.sqrt(mean_squared_error(predict_stock_openprice,real_stock_openprice))
#MAE 平均绝对误差-->E(|预测值-真实值|)
mae=mean_absolute_error(predict_stock_openprice,real_stock_openprice)
print('均方误差:',mse)
print('均方误差根:',rmse)
print('平局绝对误差:',mae)#对未知数据预测
preNum=int(input('输入你要预测后多少个数据:'))
a = test_set[len(test_set) - 60:, 0]
c=[]#存储预测后的数据
for i in range(preNum):b=np.reshape(a,(1,60,1))pre=model.predict(b)a=a.tolist()del a[0]a.extend(pre[0])c.extend(pre)a=np.array(a)
test_set=np.array(test_set)
c=sc.inverse_transform(c)
plt.figure()
plt.plot(sc.inverse_transform(test_set[60:]),color='b',label='real')
x=np.arange(len(test_set[60:]),len(test_set[60:])+preNum)
plt.plot(x,c,color='r')
plt.plot(predict_stock_openprice,color='r',label='predict')
plt.show()

训练集损失

 

基于LSTM的短期股票预测相关推荐

  1. 基于RNN的短期股票预测

    1.数据集来源 本文数据集是通过python中tushare模块下载的股票日k线数据,本次数据只用来了其中的开盘价格  tushare模块简介 导入tushare import tushare as ...

  2. 基于深度学习的股票预测(完整版,有代码)

    基于深度学习的股票预测 数据获取 数据转换 LSTM模型搭建 训练模型 预测结果 数据获取 采用tushare的数据接口(不知道tushare的筒子们自行百度一下,简而言之其免费提供各类金融数据 , ...

  3. 基于SVM算法的股票预测分析

    基于SVM算法的股票预测分析 1.数据集选取与描述 由于股票数据的混沌性.无序性,不适宜选取太多的数据作为模型训练的数据集.故本文选出的数据是"温氏股份"200个交易日的股票数据, ...

  4. 深度学习(7):基于LSTM算法的股票走势预测

    目标:基于LSTM网络实现对股票走势分析,将股票指数输入LSTM模型训练和推理,最后将判断结果进行输出. 一.原理 先了解RNN,参考博客 ​​​​​​​好好学习第三天:RNN与股票预测_流萤数点的博 ...

  5. 基于LSTM-CNN-CBAM模型的股票预测研究

    1.摘要 为了更好地对股票价格进行预测,进而为股民提供合理化的建议,提出了一种在结合长短期记忆网络 (LSTM)和卷积神经网络(CNN)的基础上引入注意力机制的股票预测混合模型(LSTM-CNN-CB ...

  6. 毕业设计之 --- 基于大数据分析的股票预测系统

    文章目录 0 前言 1 课题意义 1.1 股票预测主流方法 2 什么是LSTM 2.1 循环神经网络 2.1 LSTM诞生 2 如何用LSTM做股票预测 2.1 算法构建流程 2.2 部分代码 3 实 ...

  7. python深度学习之基于LSTM时间序列的股票价格预测

    1.本文是一篇LSTM处理时间序列的案例 我们先来看看数据集,这里包含了一只股票的开盘价,最高价,最低价,收盘价,交易量的信息. 本文基于LSTM对收盘价(close)进行预测 2. 单维对单步的预测 ...

  8. 基于LSTM的光伏发电预测

    本文是博主的<机器学习>课程的作业,很简单,没有涉及到什么十分高深的内容,最终的实现是调用了库. 我也是一个新手,希望大家多多包容~ 数据我会后面上传,我直接上传原数据,处理数据的过程我感 ...

  9. 毕业设计-基于机器学习的短期负荷预测算法

    目录 前言 课题背景和意义 实现技术思路 一.电力负荷预测 二.典型负荷预测算法 实现效果图样例 最后 前言

  10. 【预测模型】基于最小二乘法算法实现股票预测matlab代码

    1 简介 1. 基本知识 偏最小二乘法是一种新型的多元统计数据分析方法,它通过最小化误差的平方找到一组数据的最佳函数匹配.用最简单的办法去求些未知的真值,使他们的误差平方和最小.这种方法近几十年来,在 ...

最新文章

  1. 装饰器 闭包 生成器 迭代器
  2. 宝塔执行sh文件_宝塔面板未授权访问
  3. onlyoffice 收费不_西班牙银行开始泛滥收费,柜面取钱也要手续费
  4. 网易资深Java架构师:jdkjrejvm的区别和联系
  5. mysql和mysqldump出现command not found 问题解决
  6. zabbix自定义SNMP监控项
  7. 创建maven web项目无法创建sec目录
  8. DevOps使用教程 华为云(10)GitHub git Pull Request 合并请求
  9. DNS在什么情况下才能动态更新|活动目录集成的dns区域
  10. Win7开机动画图片下载大全 修改攻略
  11. 五笔输入法的前世今生
  12. 元器件——瞬态抑制二极管TVS的选型应用总结(TVS的应用、TVS常用参数、TVS选型注意点、单向和双向TVS)
  13. 论灾备之重要性:七场无法预见的数据中心灾难
  14. 利用c语言switch函数制作一个简单的计算器 2021年2月7日
  15. 引用作为函数的返回值
  16. APS54083 DC/DC升降压恒流驱动芯片 2.4G调光 —提供DEMO板
  17. 什么是核心文件,它们什么时候有用
  18. 什么是OPC UA?为什么它会继续使用?
  19. mac下重启mysql
  20. 网 络 世 界 的 黑 暗 面

热门文章

  1. 信达生物港交所上市:重点锁定肿瘤领域 募资33亿港元
  2. 30天自制操作系统 学习笔记1
  3. ARC093 F - Dark Horse
  4. 微生物组-扩增子16S分析第10期(线上/线下同时开课,本年最后一期)
  5. json文件是什么?
  6. Errors were encountered while processing
  7. java生成chk文件_java web实现在线编辑word,并将word导出(一)
  8. wx.getUserProfile踩坑填坑大全,is not a function?fail can only be invoked by user TAP gesture?
  9. Android仿射密码破译app
  10. 贪心法 第3关:将真分数用埃及分数之和表示