基于LSTM与Transfomer的股票预测模型

基于LSTM与Transfomer的股票预测模型

1 项目介绍

股票行情是引导交易市场变化的一大重要因素,若能够掌握股票行情的走势,则对于个人和企业的投资都有巨大的帮助。然而,股票走势会受到多方因素的影响,因此难以从影响因素入手定量地进行衡量。但如今,借助于机器学习,可以通过搭建网络,学习一定规模的股票数据,通过网络训练,获取一个能够较为准确地预测股票行情的模型,很大程度地帮助我们掌握股票的走势。本项目便搭建了**LSTM(长短期记忆网络)**成功地预测了股票的走势。

首先在数据集方面,我们选择上证000001号,中国平安股票(编号SZ_000001)数据集采用2016.01.01-2019.12.31股票数据,数据内容包括当天日期,开盘价,收盘价,最高价,最低价,交易量,换手率。数据集按照0.1比例分割产生测试集。训练过程以第T-99到T天数据作为训练输入,预测第T+1天该股票开盘价。(此处特别感谢Tushare提供的股票日数据集,欢迎大家多多支持)

训练模型及结果方面,我们首先采用了LSTM(长短期记忆网络),它相比传统的神经网络能够保持上下文信息,更有利于股票预测模型基于原先的行情,预测未来的行情。LSTM网络帮助我们得到了很好的拟合结果,loss很快趋于0。之后,我们又采用比LSTM模型更新提出的Transformer Encoder部分进行测试。但发现,结果并没有LSTM优越,曲线拟合的误差较大,并且loss的下降较慢。因此本项目,重点介绍LSTM模型预测股票行情的实现思路。

2 LSTM模型原理

2.1 时间序列模型

时间序列模型:时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的。

2.1 从RNN到LSTM

RNN:递归神经网络RNN每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关。通过这种方法,RNN的计算结果便具备了记忆之前几次结果的特点。其中,为输入层,o为输出层,s为隐含层,而t指第几次的计算,V,W,U为权重,第t次隐含层状态如下公式所示:
S t = f ( U ∗ X t + W ∗ S t − 1 )   ( 1 ) St = f(U*Xt + W*St-1) (1) St=f(UXt+WSt1) 
在这里插入图片描述

可见,通过RNN模型想要当前隐含层状态与前n次相关,需要增大计算量,复杂度呈指数级增长。然而采用LSTM网络可解决这一问题。

LSTM(长短期记忆网络):

LSTM是一种特殊的RNN,它主要是Eileen解决长序列训练过程中的梯度消失和梯度爆炸问题。相比RNN,LSTM更能够在长的序列中又更好的表现。

在这里插入图片描述

LSTM拥有两个传输状态: c t c^{t} ct在 (cell state), h t h^{t} ht(hidden state),其中 c t c^{t} ct 的改变往往很慢,而 h t h^{t} ht不同的节点下会有很大的区别。

首先,使用LSTM的当前输入 x t x^{t} xt和上一个状态传递下来的 h t − 1 h^{t-1} ht1得到四个状态: z f z^{f} zf, z i z^{i} zi, z o z^{o} zo, z z z,前三者为拼接向量乘以权重矩阵后使用sigmoid函数得到0-1之间的值作为门控状态,后者为通过tanh函数得到 -1~1 之间的值。

在这里插入图片描述

LSTM内部有三个阶段:忘记阶段、选择记忆阶段、输出阶段

  • 忘记阶段:通过计算 z f z^{f} zf来作为门控,控制上一个状态的 c t − 1 c^{t-1} ct1需要遗忘的内容。

  • 选择记忆阶段:对输入 x t x^{t} xt进行选择记忆,门控信号由 z i z^{i} zi进行控制,输入内容由 z z z进行表示。

  • 输出阶段:决定当前状态输出的内容,通过 z o z^{o} zo控制,并且还对上一阶段得到的 c t c^{t} ct进行放缩。
    在这里插入图片描述

3LSTM预测股票模型实现

1、数据集准备

  • 数据集分割:数据集按照0.1比例分割产生测试集。训练过程以第T-99到T天数据作为训练输入,预测第T+1天该股票开盘价。
  • 对数据进行标准化:训练集与测试集都需要按列除以极差。在训练完成后需要进行逆处理来获得结果。

t r a i n ( [ : , i ] ) = ( t r a i n ( [ : , i ] ) ) − m i n ( t r a i n [ : , i ] ) / ( m a x ( t r a i n [ : , i ] ) − m i n ( t r a i n [ : , i ] ) ) ( 2 ) train([:,i])=(train([:,i]))-min(train[:,i])/(max(train[:,i])-min(train[:,i])) (2) train([:,i])=(train([:,i]))min(train[:,i])/(max(train[:,i])min(train[:,i]))2

t e s t ( [ : , i ] ) = ( t e s t ( [ : , i ] ) ) − m i n ( t r a i n [ : , i ] ) / ( m a x ( t r a i n [ : , i ] ) − m i n ( t r a i n [ : , i ] ) ) ( 3 ) test([:,i])=(test([:,i]))-min(train[:,i])/(max(train[:,i])-min(train[:,i])) (3) test([:,i])=(test([:,i]))min(train[:,i])/(max(train[:,i])min(train[:,i]))3

2、模型搭建

使用pytorch框架搭建LSTM模型,torch.nn.LSTM()当中包含的参数设置

  • 输入特征的维数: input_size=dimension(dimension=8)

  • LSTM中隐层的维度: hidden_size=128

  • 循环神经网络的层数:num_layers=3

  • batch_first: TRUE

  • 偏置:bias默认使用

全连接层参数设置:

  • 第一层:in_features=128, out_featrues=16
  • 第二层:in_features=16, out_features=1 (映射到一个值)

3、模型训练

  • 经过调试,确定学习率lr=0.00001

  • 优化函数:批量梯度下降(SGD)

  • 批大小batch_size=4

  • 训练代数epoch=100

  • 损失函数:MSELoss均方损失函数,最终训练模型得到MSELoss下降为0.8左右。

在这里插入图片描述

4、模型预测

测试集使用已训练的模型进行验证,与真实数据不叫得到平均绝对百分比误差(MAPELoss)为0.04,可以得到测试集的准确率为96%。

在这里插入图片描述

5、模型成果

下图是对整体数据集最后一百天的K线展示:当日开盘价低于收盘价则为红色,当日开盘价高于收盘价为绿色。图中还现实了当日交易量以及均线等信息。

在这里插入图片描述

LSTM模型进行预测的测试集结果与真实结果对比图,可见LSTM模型预测的结果和现实股票的走势十分接近,因此具有很大的参考价值。
在这里插入图片描述

LSTM模型训练过程中MSELoss的变化,可以看到随着训练代数的增加,此模型的MSELoss逐渐趋于0。
在这里插入图片描述

4结语

本项目使用机器学习方法解决了股票市场预测的问题。项目采用开源股票数据中心的上证000001号,中国平安股票(编号SZ_000001),使用更加适合进行长时间序列预测的LSTM(长短期记忆神经网络)进行训练,通过对训练集序列的训练,在测试集上预测开盘价,最终得到准确率为96%的LSTM股票预测模型,较为精准地实现解决了股票市场预测的问题。

在项目开展过程当中,也采用过比LSTM更加新提出的Transformer模型,但对测试集的预测效果并不好,后期分析认为可能是由于在一般Transformer模型中由encoder和对应的decoder层,但在本项目的模型中使用了全连接层代替decoder,所以导致效果不佳。在后序的研究中,可以进一步改进,或许可以得到比LSTM更加优化的结果。

源代码github下载链接:https://github.com/MiaoChenglin125/stock_prediction-based-on-lstm-and-transformer

  • 14
    点赞
  • 194
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
基于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分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载交流,互相学习,共同进步!
以下是一个基于LSTM的剩余寿命预测模型的代码示例: ```python import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras.layers import Dense, LSTM # 读取数据 data = pd.read_csv('data.csv') data = data.dropna() # 将数据缩放到0和1之间 scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(data) # 创建训练数据集 train_data = scaled_data[0:800, :] x_train = [] y_train = [] for i in range(60, len(train_data)): x_train.append(train_data[i-60:i, 0]) y_train.append(train_data[i, 0]) # 转换为NumPy数组 x_train, y_train = np.array(x_train), np.array(y_train) # 改变输入数据的形状 x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1)) # 创建和拟合LSTM模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1], 1))) model.add(LSTM(units=50)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2) # 创建测试数据集 test_data = scaled_data[800:, :] x_test = [] y_test = data[800:, :] for i in range(60, len(test_data)): x_test.append(test_data[i-60:i, 0]) # 转换为NumPy数组 x_test = np.array(x_test) # 改变输入数据的形状 x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1)) # 使用训练好的模型进行预测 predictions = model.predict(x_test) predictions = scaler.inverse_transform(predictions) # 计算均方根误差 rmse = np.sqrt(np.mean(((predictions - y_test) ** 2))) print(rmse) ``` 该代码假设您已经有一个名为“ data.csv”的数据文件,其中包含一列数据(剩余寿命)。首先,代码读取并缩放数据,然后将其拆分为训练和测试数据集。接下来,代码使用LSTM模型来对训练数据进行拟合。最后,模型被用来预测测试数据集,并计算预测结果的均方根误差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值