我的编程空间,编程开发者的网络收藏夹
学习永远不晚

LSTM神经网络实现对股市收盘价格的预测实战(python实现 附源码 超详细)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

LSTM神经网络实现对股市收盘价格的预测实战(python实现 附源码 超详细)

源码或数据集请点赞关注收藏后评论区留言或者私信博主要

由于独特的设计结构 LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。

LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为它可以记忆不定时间长度的数值,区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output

LSTM有很多个版本,其中一个重要的版本是GRU(Gated Recurrent Unit),根据谷歌的测试表明,LSTM中最重要的是Forget gate,其次是Input gate,最次是Output gate。

介绍完LSTM的基本内容 接下来实战通过LSTM来预测股市收盘价格

先上结果 

1:随着训练次数增加损失函数的图像如下 可以看出基本符合肘部方法 但是局部会产生突变

 

 

 2:预测结果如下 红色的是预测值 蓝色的是真实值 可以看出除了某几个极值点正确率较高

 代码如下

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport torchimport torch.nn as nnfrom torch.utils.data import DataLoader, Datasetimport osos.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"def read_dataset(dataset_type):    assert dataset_type == "train" or dataset_type == "test"    df = pd.read_csv(stock_market_price_{}.csv'.format(dataset_type))  # 读入股票数据    data = np.array(df['close'])  # 获取收盘价序列    data = data[::-1]  # 反转,使数据按照日期先后顺序排列    normalize_data = (data - np.mean(data)) / np.std(data)  # 标准化    normalize_data = normalize_data[:, np.newaxis]  # 增加维度    X, y = [], []    for i in range(len(normalize_data) - time_step):        _x = normalize_data[i:i + time_step]        _y = normalize_data[i + time_step]        X.append(_x.tolist())        y.append(_y.tolist())    # plt.figure()    # plt.plot(data)    # plt.show() # 以折线图展示data    return X, y# 实验参数设置time_step = 7    # 用前七天的数据预测第八天hidden_size = 4  # 隐藏层维度lstm_layers = 1  # 网络层数batch_size = 64  # 每一批次训练多少个样例input_size = 1   # 输入层维度output_size = 1  # 输出层维度lr = 0.05        # 学习率class myDataset(Dataset):    def __init__(self, x, y):        self.x = x        self.y = y    def __getitem__(self, index):        return torch.Tensor(self.x[index]), torch.Tensor(self.y[index])    def __len__(self):        return len(self.x)class LSTM(nn.Module):    def __init__(self, input_size, output_size, hidden_size, device):        super(LSTM, self).__init__()        self.input_size=input_size        self.output_size=output_size        self.hidden_size=hidden_size        self.device=device        def _one(a,b):            return nn.Parameter(torch.FloatTensor(a,b).to(self.device))        def _three():            return(_one(input_size,hidden_size),                   _one(hidden_size,hidden_size),                   nn.Parameter(torch.zeros(hidden_size).to(self.device)))        self.W_xi,self.W_hi,self.b_i=_three()        self.W_xf, self.W_hf, self.b_f = _three()        self.W_xo, self.W_ho, self.b_o = _three()        self.W_xc, self.W_hc, self.b_c = _three()        self.W_hq=_one(hidden_size,output_size)        self.b_q=nn.Parameter(torch.zeros(output_size).to(self.device))        self.params=[self.W_xi,self.W_hi,self.b_i,self.W_xf, self.W_hf, self.b_f, self.W_xo, self.W_ho, self.b_o,self.W_xc, self.W_hc, self.b_c,                     self.W_hq,self.b_q]        for param in self.params:            if param.dim()==2:                nn.init.xavier_normal_(param)            def init_lstm_state(self, batch_size):        return (torch.zeros((batch_size, self.hidden_size), device=self.device),                torch.zeros((batch_size, self.hidden_size), device=self.device))        def forward(self, seq):        (H,C)=self.init_lstm_state(seq.shape[0])        for step in range(seq.shape[1]):            X=seq[:,step,:]            I=torch.sigmoid((X@self.W_xi)+(H@self.W_hi)+self.b_i)            F = torch.sigmoid((X @ self.W_xf) + (H @ self.W_hf) + self.b_f)            O = torch.sigmoid((X @ self.W_xo) + (H @ self.W_ho) + self.b_o)            C_tilda=torch.tanh(torch.matmul(X.float(),self.W_xc)+torch.matmul(H.float(),self.W_hc)+self.b_c)            C=F*C+I*C_tilda            H=O*torch.tanh(C)        Y=(H@self.W_hq)+self.b_q        return Y,(H,C)X_train, y_train = read_dataset('train')X_test, y_test = read_dataset('test')train_dataset = myDataset(X_train, y_train)test_dataset = myDataset(X_test, y_test)train_loader = DataLoader(train_dataset, batch_size, shuffle=True)test_loader = DataLoader(test_dataset, 1)# 设定训练轮数num_epochs = 50device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')hist = np.zeros(num_epochs)model = LSTM(input_size, output_size, hidden_size, device)# 定义优化器和损失函数optimiser = torch.optim.Adam(model.parameters(), lr=lr)  # 使用Adam优化算法loss_func = torch.nn.MSELoss(reduction='mean')  # 使用均方差作为损失函数for epoch in range(num_epochs):    epoch_loss = 0    for i, data in enumerate(train_loader):        X, y = data        pred_y, _ = model(X.to(device))        loss = loss_func(pred_y, y.to(device))        optimiser.zero_grad()        loss.backward()        optimiser.step()        epoch_loss += loss.item()    print("Epoch ", epoch, "MSE: ", epoch_loss)    hist[epoch] = epoch_lossplt.plot(hist)plt.show()# 测试model.eval()result = []for i, data in enumerate(test_loader):    X, y = data    pred_y, _ = model(X.to(device))    result.append(pred_y.item())plt.plot(range(len(y_test)), y_test, label="true_y", color="blue")plt.plot(range(len(result)), result, label="pred_y", color="red")plt.legend(loc='best')plt.show()

来源地址:https://blog.csdn.net/jiebaoshayebuhui/article/details/127500988

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

LSTM神经网络实现对股市收盘价格的预测实战(python实现 附源码 超详细)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录