银行股价预测——基于pytorch框架RNN神经网络
银行股价预测——基于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神经网络相关推荐
- Pytorch之CNN:基于Pytorch框架实现经典卷积神经网络的算法(LeNet、AlexNet、VGG、NIN、GoogleNet、ResNet)——从代码认知CNN经典架构
Pytorch之CNN:基于Pytorch框架实现经典卷积神经网络的算法(LeNet.AlexNet.VGG.NIN.GoogleNet.ResNet)--从代码认知CNN经典架构 目录 CNN经典算 ...
- 基于Pytorch框架的轻量级卷积神经网络垃圾分类识别系统
今天在查资料的时候在网上看到一篇文章,博主是基于TensorFlow实现的CNN来完成对垃圾分类识别的,想到最近正好在使用Pytorch就想也做一下,就当是项目开发实践了.先看下动态操作效果: 原文在 ...
- Python基于PyTorch实现BP神经网络ANN分类模型项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...
- 【深度学习】基于Pytorch进行深度神经网络计算(一)
[深度学习]基于Pytorch进行深度神经网络计算(一) 文章目录 1 层和块 2 自定义块 3 顺序块 4 在正向传播函数中执行代码 5 嵌套块 6 参数管理(不重要) 7 参数初始化(重要) 8 ...
- 【深度学习】基于Pytorch进行深度神经网络计算(二)
[深度学习]基于Pytorch进行深度神经网络计算(二) 文章目录 1 延后初始化 2 Pytorch自定义层2.1 不带参数的层2.2 带参数的层 3 基于Pytorch存取文件 4 torch.n ...
- 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(一)
[深度学习]基于Pytorch的卷积神经网络API妙用(一) 文章目录 1 不变性 2 卷积的数学分析 3 通道 4 互相关运算 5 图像中目标的边缘检测 6 基于Pytorch的卷积核 7 特征映射 ...
- 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)
[深度学习]基于Pytorch的卷积神经网络API妙用(二) 文章目录1 Padding和Stride 2 多输入多输出Channel 3 1*1 Conv(笔者在看教程时,理解为降维和升维) 4 池 ...
- DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例
DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例 目录 基于Tensorflow框架对神经网络算法进行初始化的常用函数及其使用案例 1.初始化的常用函数
- Python基于PyTorch实现BP神经网络ANN回归模型项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...
最新文章
- 绝地求生7月5日服务器维护,绝地求生7月5日更新到几点 吃鸡更新维护公告
- java内存堆和栈_java中堆,栈主要区别及内存存储
- delphi ini文件的基础读写。
- redux异步action_Redux 异步action的内部实现
- logback springBoot 配置日志
- java中stringBuilder的用法
- PHP超全基础知识点
- 企业为什么要开通微信公众号?
- 拼出爱心图案的c语言,抖音爱心图片拼图9格照片怎么弄 高格调拼图已被霸屏
- ESD防静电门禁系统详解
- 渗透修改服务器权限,利用CMS漏洞渗透并获取某服务器权限
- cnpm 网络不能连接_移动站网络的另一种方式——移动站手机网络模式
- 功率谱密度相关方法的MATLAB实现
- 达梦数据库DCA认证培训总结
- 江湖云RFID门禁系统
- Vue指令超详细演示理解
- 想清楚这3个问题,更好实现公众号引流
- bilibili视频下载工具
- 三角函数 求模 和 求角度算法
- iOS DLNA编程
热门文章
- 利用Python+Cocos2d制作《猫吃老鼠》小游戏
- 一个很酷的API接口管理平台,吊到不行!
- win10双显卡怎么切换amd和英特尔_Win10电脑上如何从双显卡切换为独立显卡呢?...
- 物联网大数据存储利器IoTDB介绍
- 复旦大学桂韬:当NLP邂逅Social Media--构建计算机与网络语言的桥梁
- CS制作office宏病毒钓鱼
- putty窗口标题修改、字体颜色修改等简单配置以及putty多开工具mtputty的使用
- Vue可视化大屏 利用缩放transform:scale实现分辨率自适应
- DaVinci(达芬奇)基本剪辑设置及其工具的应用
- 使用python实现unix2dos和dos2unix命令