基于LSTM的股票时间序列预测(附数据集和代码)


如果对LSTM原理不懂得小伙伴可以看博主下一篇博客,因为博主水平有限,结合其他文章尽量把原理写的清楚些。

数据集

首先附上数据集
链接:https://pan.baidu.com/s/1AKsz-ohmYHr9mBEEh76P5g
提取码:6owv
这个数据集是关于股票的,里面有日期,开盘价等信息。
在这里插入图片描述
既然是时间序列预测,我们最关心的是预测值在时间维度上的走势如何,那我们只要最后一列volume和第一列date这两列就好了。

实战

先是导入相关包,一些常见的包就不详细说了,我们需要的Sequential,Dense, Activation, Dropout,这些可以在博主上几期关于keras的实战介绍。mean_squared_error是sklearn里面一个评价模型好坏的指标,相对来说越小越好,但也要看数据集值的范围。MinMaxScaler是一个归一化的包,归一化有很多好处,可以让模型算的更快,一些求导呀,梯度下降这些的,归一化后数据小,这些算法自然就运行快。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import math
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from keras import optimizers
import time

这个是创建变量x和y的,因为lstm时间序列不像别的回归一个x,另一个值y,lstm的x和y全是一组数据产生的,也就是它自己和自己比。有一个关键的参数是look_back这个按中文直译就是回看,回溯,理解起来也很容易,假如是这个data是[1,2,3,4,5],look_back为1的话.
x
[[1]
[2]
[3]] y就是[2 3 4],意思就是用前一个数据预测后一个,这是look_back为1的意思。假如是为8,那前8个数据预测第9个数据。小伙伴们可以试试改变这个值,看一下结果是否会更好。
注意维度,维度这样设置一是归一化需要,二是输入网络的要求。
下面这个函数功能就是把data,

def creat_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i: (i+look_back)]
        dataX.append(a)
        dataY.append(dataset[i+look_back])
    return np.array(dataX), np.array(dataY)

读取一下数据,这些参数的意思是,输出series,series的序号就是date,这样方便下面画图,看着也更加直观。因为我们只要首尾2列,那就是0,5.

dataframe = pd.read_csv('zgpa_train.csv',
                        header=0, parse_dates=[0],
                        index_col=0, usecols=[0, 5], squeeze=True)
dataset 
基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip基于LSTM时间序列预测模型python源码+模型+数据集+详细代码注释.zip 【资源介绍】 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载交流,互相学习,共同进步!
### 使用Python LSTM实现股票时间序列预测 #### 准备工作 为了利用LSTM进行股票时间序列预测,需先安装必要的库。通常涉及`pandas`, `numpy`, `matplotlib`, PyTorch等工具包。 ```bash pip install pandas numpy matplotlib torch scikit-learn ``` #### 导入所需库 导入用于处理数据、构建模型可视化结果所需的库[^4]: ```python import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler import matplotlib.pyplot as plt import torch from torch import nn, optim from torch.utils.data import Dataset, DataLoader ``` #### 加载并预处理数据 加载历史股价数据,并对其进行标准化处理以便于训练神经网络模型。这里假设有一个CSV文件包含了日期收盘价两列。 ```python data = pd.read_csv('stock_prices.csv') scaler = MinMaxScaler(feature_range=(-1, 1)) scaled_data = scaler.fit_transform(data[['Close']]) ``` 创建适合输入到LSTM的数据结构——即转换成滑动窗口形式的时间序列片段作为特征向量,对应的下一个时刻的价格变动作为标签[^2]。 ```python def create_sequences(data, seq_length): xs, ys = [], [] for i in range(len(data)-seq_length-1): x = data[i:(i+seq_length)] y = data[i+seq_length] xs.append(x) ys.append(y) return np.array(xs), np.array(ys) sequence_length = 50 # 可调整此参数来改变使用的过去天数长度 X, Y = create_sequences(scaled_data, sequence_length) ``` 划分训练集与测试集以评估模型性能: ```python train_size = int(len(X) * 0.8) test_size = len(X) - train_size X_train, X_test = X[:train_size], X[train_size:] y_train, y_test = Y[:train_size], Y[train_size:] class StockDataset(Dataset): def __init__(self, features, targets): self.features = torch.tensor(features).float() self.targets = torch.tensor(targets).float() def __len__(self): return len(self.features) def __getitem__(self, idx): return self.features[idx], self.targets[idx] batch_size = 64 training_set = StockDataset(X_train, y_train) testing_set = StockDataset(X_test, y_test) train_loader = DataLoader(training_set, batch_size=batch_size, shuffle=True) test_loader = DataLoader(testing_set, batch_size=batch_size, shuffle=False) ``` #### 构建LSTM模型 定义一个简单的LSTM架构来进行回归任务,尝试预测未来某一天的收盘价变化情况[^1]。 ```python class LSTMModel(nn.Module): def __init__(self, input_dim=1, hidden_dim=50, num_layers=2, output_dim=1): super(LSTMModel, self).__init__() self.hidden_dim = hidden_dim self.num_layers = num_layers self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_() c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_() out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach())) out = self.fc(out[:, -1, :]) return out model = LSTMModel().cuda() if torch.cuda.is_available() else LSTMModel() criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters()) ``` #### 训练过程 通过多次迭代整个训练集合上的样本更新权重直到损失函数收敛至较低水平为止[^3]。 ```python num_epochs = 100 for epoch in range(num_epochs): model.train() running_loss = 0. for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs.unsqueeze(-1)) loss = criterion(outputs.squeeze(), labels) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}') ``` 完成上述步骤之后就可以保存训练好的模型供后续使用了;同时也可以基于测试集中未见过的数据检验其泛化能力如何。
评论 95
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值