银行股价预测——基于pytorch框架RNN神经网络

  • 任务目标
  • 数据来源
  • 完整代码
  • 流程分析
    • 1.导包
    • 2.读入数据并做预处理
    • 3.构建单隐藏层Rnn模型
    • 4.设计超参数,训练模型
    • 5.加载模型,绘图查看模型效果

任务目标

基于csv数据,建立RNN模型,预测股价

数据来源

自己切割的一份股价数据,无需付费直接下载,链接如下:
数据集下载

完整代码

首先贴上完整代码,可自行理解,下文慢慢解读

import pandas as pd
import torch
from torch import nn
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt#数据预处理
def process_data(type):#读入数据if type=='train':data=pd.read_csv('./train.csv')elif type=='val':data=pd.read_csv('./val.csv')# 以闭市价作为股价构成标签price=data.loc[:,'close']#归一化处理,便于后期加速模型收敛price_norm=price/max(price)#定义etract_data函数,能够将数据转换为时间序列def etract_data(data, time_step):X,y = [],[]for i in range(len(data) - time_step):X.append([a for a in data[i:i + time_step]])y.append([data[i + time_step]])X = torch.tensor(X)X = X.reshape(-1, time_step, 1)y = torch.tensor(y)y = y.reshape(-1,1)return X, y#时间序列时间步长为8,通过前8个数据预测第9个time_step = 8batch_size = 1X,y=etract_data(price_norm,time_step)#构造迭代器,返回dataset=TensorDataset(X,y)#训练集数据随机打乱,验证集保持不变if type=='train':shuffle=Trueelse:shuffle=Falsedataloader=DataLoader(dataset,batch_size=batch_size,shuffle=shuffle)return dataloader
dataloader={'train':process_data('train'),'val':process_data('val')}#设计网络(单隐藏层Rnn)
input_size,hidden_size,output_size=1,20,1
#Rnn初始隐藏单元hidden_prev初始化
hidden_prev=torch.zeros(1,1,hidden_size).cuda()
class Net(nn.Module):def __init__(self):super(Net,self).__init__()self.rnn=nn.RNN(input_size=input_size,    #输入特征维度,当前特征为股价,维度为1hidden_size=hidden_size,  #隐藏层神经元个数,或者也叫输出的维度num_layers=1,batch_first=True)self.linear=nn.Linear(hidden_size,output_size)def forward(self,X,hidden_prev):out,ht=self.rnn(X,hidden_prev)# out[batch_size=1,time_step=8,hidden_size=20]# ht[num_layer=1,batch_size=1,hidden_size=20]ht = ht.view(-1, hidden_size)   # ht[1,hidden_size=20]ht=self.linear(ht)              #ht[1,1]return out,ht#设定超参数,训练模型
model=Net()
model=model.cuda()
criterion=nn.MSELoss()
learning_rate,epochs=0.01,500
optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)best_loss=9999
for epoch in range(epochs):for phase in ['train','val']:if phase == 'train':model.train()elif phase == 'val':model.eval()losses = []for X,y in dataloader[phase]:X = X.cuda()y = y.cuda()optimizer.zero_grad()_,yy=model(X,hidden_prev)yy=yy.cuda()loss = criterion(y, yy)model.zero_grad()if phase=='train':loss.backward()optimizer.step()losses.append(loss.item())epoch_loss=sum(losses)/len(losses)if phase=='val' and epoch_loss<best_loss:best_loss=epoch_losstorch.save(model.state_dict(), "model.pth")if epoch%50==0:   #保留验证集损失最小的模型参数print("epoch:{},{} loss:{:.8f}".format(epoch+1,phase,epoch_loss))if phase=='val':print("the best loss of valuation is:{:.8f}".format(best_loss))print('*'*50)#加载模型,绘图查看模型效果
model.load_state_dict(torch.load('model.pth'))
Val_y,Val_predict=[],[]
#将归一化后的数据还原
Val_max_price=max(pd.read_csv('./val.csv').loc[:,'close'])
for X,y in dataloader['val']:with torch.no_grad():X = X.cuda()_,predict=model(X,hidden_prev)y=y.cpu()predict=predict.cpu()Val_y.append(y[0][0]*Val_max_price)Val_predict.append(predict[0][0]*Val_max_price)fig=plt.figure(figsize=(8,5),dpi=80)
# 红色表示真实值,绿色表示预测值
plt.plot(Val_y,linestyle='--',color='r')
plt.plot(Val_predict,color='g')
plt.title('stock price')
plt.xlabel('time')
plt.ylabel('price')
plt.show()

流程分析

1.导包

import pandas as pd            #读取数据
import torch
from torch import nn           #继承nn.Module构建rnn网络
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader #构建迭代器
import matplotlib.pyplot as plt         #绘图

2.读入数据并做预处理

1. 查看训练集前五行数据样式

data=pd.read_csv('./train.csv')
print(data.head())
         date   open   high    low  close    volume
0  2016-01-04  30.57  30.57  28.63  28.78  70997200
1  2016-01-05  28.41  29.54  28.23  29.23  87498504
2  2016-01-06  29.03  29.39  28.73  29.26  48012112
3  2016-01-07  28.73  29.25  27.73  28.50  23647604
4  2016-01-08  28.73  29.18  27.63  28.67  98239664

2. 提取出数据中的闭市价格作为股价,并进行归一化处理以便于后续模型加速收敛,可视化数据

price=data.loc[:,'close']
#归一化处理
price_norm=price/max(price)
#可视化
fig=plt.figure(figsize=(8,5))
plt.plot(price_norm)
plt.title('stock price')
plt.xlabel('time')
plt.ylabel('price')
plt.show()

3. 构建时间序列数据
通过extract_data()将数据划分为8个一组,用前8个数据预测第9个数据,故时间步长time_step=8

def etract_data(data, time_step):X,y = [],[]for i in range(len(data) - time_step):X.append([a for a in data[i:i + time_step]])y.append([data[i + time_step]])X = torch.tensor(X)X = X.reshape(-1, time_step, 1)y = torch.tensor(y)y = y.reshape(-1,1)return X, y
time_step=8
X,y=etract_data(price_norm, time_step)
print(X.shape,'\n',X[0])
print(y.shape,'\n',y[0])

X,y格式如下:

torch.Size([517, 8, 1]) tensor([[0.3833],[0.3893],[0.3897],[0.3795],[0.3818],[0.3564],[0.3588],[0.3558]])
torch.Size([517, 1]) tensor([0.3558])

X有517组数据,每组数据有8个信息,每个信息为1个数(股价)
y对应有517组数据,每组数据为第9个信息的股价

4.构建迭代器

batch_size=1
dataset=TensorDataset(X,y)
dataloader=DataLoader(dataset,batch_size=batch_size,shuffle=True)

5.关键步骤整合
由于训练集和验证集在数据预处理部分的步骤几乎相同,不妨将上述关键步骤整合,通过构建字典简化代码

def process_data(type):#读入数据if type=='train':data=pd.read_csv('./train.csv')elif type=='val':data=pd.read_csv('./val.csv')# 以闭市价作为股价构成标签price=data.loc[:,'close']#归一化处理,便于后期加速模型收敛price_norm=price/max(price)#定义etract_data函数,能够将数据转换为时间序列def etract_data(data, time_step):X,y = [],[]for i in range(len(data) - time_step):X.append([a for a in data[i:i + time_step]])y.append([data[i + time_step]])X = torch.tensor(X)X = X.reshape(-1, time_step, 1)y = torch.tensor(y)y = y.reshape(-1,1)return X, y#时间序列时间步长为8,通过前8个数据预测第9个time_step = 8batch_size = 1X,y=etract_data(price_norm,time_step)#构造迭代器,返回dataset=TensorDataset(X,y)#训练集数据随机打乱,验证集保持不变if type=='train':shuffle=Trueelse:shuffle=Falsedataloader=DataLoader(dataset,batch_size=batch_size,shuffle=shuffle)return dataloader
dataloader={'train':process_data('train'),'val':process_data('val')}

3.构建单隐藏层Rnn模型

#设计网络(单隐藏层Rnn)
input_size,hidden_size,output_size=1,20,1
#Rnn初始隐藏单元hidden_prev初始化
hidden_prev=torch.zeros(1,1,hidden_size).cuda()
class Net(nn.Module):def __init__(self):super(Net,self).__init__()self.rnn=nn.RNN(input_size=input_size,    #输入特征维度,当前特征为股价,维度为1hidden_size=hidden_size,  #隐藏层神经元个数,或者也叫输出的维度num_layers=1,batch_first=True)self.linear=nn.Linear(hidden_size,output_size)def forward(self,X,hidden_prev):out,ht=self.rnn(X,hidden_prev)  #out[batch_size=1,time_step=8,hidden_size=20]#ht[num_layer=1,batch_size=1,hidden_size=20]ht=ht.view(-1,hidden_size)      #ht[1,hidden_size=20]ht=self.linear(ht)              #ht[1,1]return out,ht

4.设计超参数,训练模型

model=Net()
model=model.cuda()
criterion=nn.MSELoss()
learning_rate,epochs=0.01,500
optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)best_loss=9999
for epoch in range(epochs):for phase in ['train','val']:if phase == 'train':model.train()elif phase == 'val':model.eval()losses = []for X,y in dataloader[phase]:X = X.cuda()y = y.cuda()optimizer.zero_grad()_,yy=model(X,hidden_prev)yy=yy.cuda()loss = criterion(y, yy)model.zero_grad()if phase=='train':loss.backward()optimizer.step()losses.append(loss.item())epoch_loss=sum(losses)/len(losses)if phase=='val' and epoch_loss<best_loss:best_loss=epoch_losstorch.save(model.state_dict(), "model.pth")if epoch%50==0:   #保留验证集损失最小的模型参数print("epoch:{},{} loss:{:.8f}".format(epoch+1,phase,epoch_loss))if phase=='val':print("the best loss of valuation is:{:.8f}".format(best_loss))print('*'*50)

下图为loss变化值:

epoch:1,train loss:0.01066735
epoch:1,val loss:0.00090897
the best loss of valuation is:0.00090897
**************************************************
epoch:51,train loss:0.00064672
epoch:51,val loss:0.00165981
the best loss of valuation is:0.00031547
**************************************************
epoch:101,train loss:0.00102666
epoch:101,val loss:0.00038310
the best loss of valuation is:0.00031547
**************************************************
epoch:151,train loss:0.00086190
epoch:151,val loss:0.00419089
the best loss of valuation is:0.00030221
**************************************************
epoch:201,train loss:0.00153353
epoch:201,val loss:0.00049194
the best loss of valuation is:0.00030221
**************************************************
epoch:251,train loss:0.00159085
epoch:251,val loss:0.00057046
the best loss of valuation is:0.00030221
**************************************************
epoch:301,train loss:0.00191545
epoch:301,val loss:0.00145204
the best loss of valuation is:0.00030221
**************************************************
epoch:351,train loss:0.00159414
epoch:351,val loss:0.00127127
the best loss of valuation is:0.00030221
**************************************************
epoch:401,train loss:0.00166080
epoch:401,val loss:0.00314704
the best loss of valuation is:0.00030221
**************************************************
epoch:451,train loss:0.00135861
epoch:451,val loss:0.00068874
the best loss of valuation is:0.00030221
**************************************************

5.加载模型,绘图查看模型效果

model.load_state_dict(torch.load('model.pth'))
Val_y,Val_predict=[],[]
#将归一化后的数据还原
Val_max_price=max(pd.read_csv('./val.csv').loc[:,'close'])
for X,y in dataloader['val']:with torch.no_grad():X = X.cuda()_,predict=model(X,hidden_prev)y=y.cpu()predict=predict.cpu()Val_y.append(y[0][0]*Val_max_price)Val_predict.append(predict[0][0]*Val_max_price)fig=plt.figure(figsize=(8,5),dpi=80)
# 红色表示真实值,绿色表示预测值
plt.plot(Val_y,linestyle='--',color='r')
plt.plot(Val_predict,color='g')
plt.title('stock price')
plt.xlabel('time')
plt.ylabel('price')
plt.show()

下图为验证集股价预测值(绿线)与真实值(红线)折线图:

银行股价预测——基于pytorch框架RNN神经网络相关推荐

  1. Pytorch之CNN:基于Pytorch框架实现经典卷积神经网络的算法(LeNet、AlexNet、VGG、NIN、GoogleNet、ResNet)——从代码认知CNN经典架构

    Pytorch之CNN:基于Pytorch框架实现经典卷积神经网络的算法(LeNet.AlexNet.VGG.NIN.GoogleNet.ResNet)--从代码认知CNN经典架构 目录 CNN经典算 ...

  2. 基于Pytorch框架的轻量级卷积神经网络垃圾分类识别系统

    今天在查资料的时候在网上看到一篇文章,博主是基于TensorFlow实现的CNN来完成对垃圾分类识别的,想到最近正好在使用Pytorch就想也做一下,就当是项目开发实践了.先看下动态操作效果: 原文在 ...

  3. Python基于PyTorch实现BP神经网络ANN分类模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...

  4. 【深度学习】基于Pytorch进行深度神经网络计算(一)

    [深度学习]基于Pytorch进行深度神经网络计算(一) 文章目录 1 层和块 2 自定义块 3 顺序块 4 在正向传播函数中执行代码 5 嵌套块 6 参数管理(不重要) 7 参数初始化(重要) 8 ...

  5. 【深度学习】基于Pytorch进行深度神经网络计算(二)

    [深度学习]基于Pytorch进行深度神经网络计算(二) 文章目录 1 延后初始化 2 Pytorch自定义层2.1 不带参数的层2.2 带参数的层 3 基于Pytorch存取文件 4 torch.n ...

  6. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(一)

    [深度学习]基于Pytorch的卷积神经网络API妙用(一) 文章目录 1 不变性 2 卷积的数学分析 3 通道 4 互相关运算 5 图像中目标的边缘检测 6 基于Pytorch的卷积核 7 特征映射 ...

  7. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)

    [深度学习]基于Pytorch的卷积神经网络API妙用(二) 文章目录1 Padding和Stride 2 多输入多输出Channel 3 1*1 Conv(笔者在看教程时,理解为降维和升维) 4 池 ...

  8. DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例

    DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例 目录 基于Tensorflow框架对神经网络算法进行初始化的常用函数及其使用案例 1.初始化的常用函数

  9. Python基于PyTorch实现BP神经网络ANN回归模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...

最新文章

  1. 绝地求生7月5日服务器维护,绝地求生7月5日更新到几点 吃鸡更新维护公告
  2. java内存堆和栈_java中堆,栈主要区别及内存存储
  3. delphi ini文件的基础读写。
  4. redux异步action_Redux 异步action的内部实现
  5. logback springBoot 配置日志
  6. java中stringBuilder的用法
  7. PHP超全基础知识点
  8. 企业为什么要开通微信公众号?
  9. 拼出爱心图案的c语言,抖音爱心图片拼图9格照片怎么弄 高格调拼图已被霸屏
  10. ESD防静电门禁系统详解
  11. 渗透修改服务器权限,利用CMS漏洞渗透并获取某服务器权限
  12. cnpm 网络不能连接_移动站网络的另一种方式——移动站手机网络模式
  13. 功率谱密度相关方法的MATLAB实现
  14. 达梦数据库DCA认证培训总结
  15. 江湖云RFID门禁系统
  16. Vue指令超详细演示理解
  17. 想清楚这3个问题,更好实现公众号引流
  18. bilibili视频下载工具
  19. 三角函数 求模 和 求角度算法
  20. iOS DLNA编程

热门文章

  1. 利用Python+Cocos2d制作《猫吃老鼠》小游戏
  2. 一个很酷的API接口管理平台,吊到不行!
  3. win10双显卡怎么切换amd和英特尔_Win10电脑上如何从双显卡切换为独立显卡呢?...
  4. 物联网大数据存储利器IoTDB介绍
  5. 复旦大学桂韬:当NLP邂逅Social Media--构建计算机与网络语言的桥梁
  6. CS制作office宏病毒钓鱼
  7. putty窗口标题修改、字体颜色修改等简单配置以及putty多开工具mtputty的使用
  8. Vue可视化大屏 利用缩放transform:scale实现分辨率自适应
  9. DaVinci(达芬奇)基本剪辑设置及其工具的应用
  10. 使用python实现unix2dos和dos2unix命令