【量化交易笔记】8.基于深度学习(LSTM)预测股票价格

news2024/11/15 15:25:45

前言

前一章节,已作随机森林来预测股票价格,也是一种比较常见的方法,本章基于深度学习算法来处理时间序列,来预测股票未来的价格。LSTM是一种特殊类型的循环神经网络(RNN),在自然语言处理和时间序列数据分析等任务中取得了显著成果。LSTM通过处理序列数据中的长期依赖关系,能够更好地捕捉时间序列数据的特征和模式。这使得它成为预测股票价格这类时间相关数据的有力工具。关于LSTM 在之前的文章中也略作介绍。
我们仍以上一章的数据,采用类似于上一章的处理方式进行处理。

获取数据

本章我们采用 tensorflow框架的keras 来实现LSTM。

# 加载相应的库
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False

from keras.models import Sequential
from keras.layers import Dense ,LSTM, Dropout

from sklearn.preprocessing import MinMaxScaler

%matplotlib inline

这部分内容,仍以sh.60000为例,从2019年1月1日 到至今天(2023-5-31)。

# 加载数据
df=pd.read_csv("data/sh.600000.csv",parse_dates=["date"],index_col=[0])
df.head()
datecodeopenhighlowclosepreclosevolumeamountadjustflagturntradestatuspctChgisST
2019-01-02sh.6000008.0793118.1207857.9465918.0461318.12908023762822229625669.020.0845541-1.0204120
2019-01-03sh.6000008.0461318.1456708.0129518.1373758.04613118654262181975985.020.06637611.1340270
2019-01-04sh.6000008.0710168.2949808.0461318.2618008.13737527172844268964563.020.09668811.5290480
2019-01-07sh.6000008.3696358.3696358.2286208.2783908.26180023597376235440197.020.08396510.2007980
2019-01-08sh.6000008.3198658.3198658.2203258.2618008.27839015104933150501650.020.0537471-0.2003960

分离数据

由于是时间序列,特征选 'open','high','low','close','volume','turn',考虑到volume得范围比较大,而股票价格,换手率比较小,采用MinMaxScaler对数据进行归一化处理,进行统一缩放到相同大小。

cols=['open','high','low','close','volume','turn']
df=df[cols]

scaler = MinMaxScaler(feature_range=(0,1))
df_scaled = scaler.fit_transform(df)

数据集处理

我们想用前30天数据预测第二天收盘价,这里的30天,即所有数据,由于LSTM 模型的特殊性,采用createXY函数生成数据。
具体这个函数

def createXY(dataset,n_past):
    j=0
    dataX = []
    dataY = []
    for i in range(n_past, len(dataset)):       
        x=dataset[i - n_past:i, 0:dataset.shape[1]]
        if (i+n_past>=len(dataset)):
            y=0
        else:
            y=dataset[i-1+n_past,3]
        dataX.append(x) 
        dataY.append(y)    
    return np.array(dataX),np.array(dataY) 
dataX,dataY=createXY(df_scaled,30)

让我们看看上面的代码中做了什么:
n_past是我们在预测下一个目标值时将在过去查看的步骤数。
这里使用30,意味着将使用过去的30个值(包括目标列在内的所有特性)来预测第31个目标值。
因此,在trainX中我们会有所有的特征值,而在trainY中我们只有目标值。
让我们分解for循环的每一部分
对于训练,dataset = df_for_training_scaled, n_past=30
当i= 30:
data_X.addend (df_for_training_scaled[i - n_past:i, 0:df_for_training.shape[1]])
从n_past开始的范围是30,所以第一次数据范围将是-[30 - 30,30,0:6] 相当于 [0:30,0:6]
因此在dataX列表中,df_for_training_scaled[0:30,0:6]数组将第一次出现。
现在, dataY.append(df_for_training_scaled[i,3])

i = 30,所以它将只取第30行开始的close(因为在预测中,我们只需要close列,所以列范围仅为3,表示close列)。
第一次在dataY列表中存储df_for_training_scaled[30,3]值。
所以包含5列的前30行存储在dataX中,只有close列的第31行存储在dataY中。然后我们将dataX和dataY列表转换为数组,它们以数组格式在LSTM中进行训练。

将数据集拆分为训练集、验证集和测试集。由于这个数据集是时间序列,以2023年前的数据作为训练集,之后数据为验证集。

npreddata_X=dataX[-30:]
npreddata_Y=dataY[-30:]
ddf_X=dataX[:-30]
ddf_Y=dataY[:-30]
test_split=68 #这里是从2023-1-1开始计时
trainX=ddf_X[:-test_split]
trainY=ddf_Y[:-test_split]

testX=ddf_X[-test_split:]
testY=ddf_Y[-test_split:]

看一下数据结构

trainX.shape,trainY.shape,testX.shape,testY.shape

((942, 30, 6), (942,), (68, 30, 6), (68,))

看到这里大家有没有看明白了,如果还不明白,我再给大伙解释一下

如果查看 trainX[1] 值,会发现到它与 trainX[0] 中的数据相同(第一列除外),因为我们将看到前 30 个来预测第 31 列,在第一次预测之后它会自动移动 到第 2 列并取下一个 30 值来预测下一个目标值。

让我们用一种简单的格式来解释这一切——

trainX — — →trainY  
[0 : 30,0:6][30,3]  
[1:31, 0:6][31,3]  
[2:32,0:6][32,3]

这下应该看明白了。

建模

以一般的 LSTM 模式,用Adam优化器,用mse作为损失函数,采用二层结构进行建模。

grid_model = Sequential()
grid_model.add(LSTM(50,return_sequences=True,input_shape=(30,6)))
grid_model.add(LSTM(50))
grid_model.add(Dropout(0.2))
grid_model.add(Dense(1))
grid_model.compile(loss = 'mse',optimizer = 'adam')

grid_model.summary()
Model: "sequential_4"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm_8 (LSTM)               (None, 30, 50)            11400     
                                                                 
 lstm_9 (LSTM)               (None, 50)                20200     
                                                                 
 dropout_4 (Dropout)         (None, 50)                0         
                                                                 
 dense_4 (Dense)             (None, 1)                 51        
                                                                 
=================================================================
Total params: 31,651
Trainable params: 31,651
Non-trainable params: 0
_________________________________________________________________

训练

这里用 batch_size 用16 ,epochs =40来进行训练,在实际情况一下,数据集的数据量大的话,机器内存在或采用GPU等,可以用更大的参数,epoch 也可以有更大的参数。

history=grid_model.fit(
   trainX, trainY,
   batch_size = 16,
   epochs =40,
   validation_data=(testX,testY)
)
_________________________________________________________________
Output exceeds the size limit. Open the full output data in a text editor
Epoch 1/40
59/59 [==============================] - 1s 21ms/step - loss: 0.0088 - val_loss: 0.0030
Epoch 2/40
59/59 [==============================] - 1s 22ms/step - loss: 0.0089 - val_loss: 0.0036
Epoch 3/40
59/59 [==============================] - 2s 26ms/step - loss: 0.0084 - val_loss: 0.0099
Epoch 4/40
59/59 [==============================] - 1s 19ms/step - loss: 0.0082 - val_loss: 0.0129
Epoch 5/40
59/59 [==============================] - 1s 18ms/step - loss: 0.0079 - val_loss: 0.0059
Epoch 6/40
59/59 [==============================] - 1s 19ms/step - loss: 0.0078 - val_loss: 0.0061
Epoch 7/40
59/59 [==============================] - 1s 20ms/step - loss: 0.0078 - val_loss: 0.0051
Epoch 8/40
59/59 [==============================] - 1s 19ms/step - loss: 0.0075 - val_loss: 0.0113
Epoch 9/40
59/59 [==============================] - 1s 19ms/step - loss: 0.0074 - val_loss: 0.0075
Epoch 10/40
59/59 [==============================] - 1s 22ms/step - loss: 0.0070 - val_loss: 0.0045
Epoch 11/40
59/59 [==============================] - 1s 20ms/step - loss: 0.0078 - val_loss: 0.0088
Epoch 12/40
59/59 [==============================] - 1s 20ms/step - loss: 0.0073 - val_loss: 0.0090
Epoch 13/40
...
Epoch 39/40
59/59 [==============================] - 1s 19ms/step - loss: 0.0041 - val_loss: 0.0058
Epoch 40/40
59/59 [==============================] - 1s 19ms/step - loss: 0.0038 - val_loss: 0.0056

由于训练数据和测试数据是经过归一化的,因此要查看结果,需要将数据逆缩放过程。
先看训练集数据。

tprediction=grid_model.predict(trainX)
tprediction_copies_array = np.repeat(tprediction,6, axis=-1)
tpred=scaler.inverse_transform(np.reshape(tprediction_copies_array,(len(tprediction),6)))[:,0]

toriginal_copies_array = np.repeat(trainY,6, axis=-1)
toriginal=scaler.inverse_transform(np.reshape(toriginal_copies_array,(len(trainY),6)))[:,0]
plt.figure(figsize=(10, 8))
plt.plot(toriginal,  label = '真实')
plt.plot(tpred,  label = '预测')
plt.title(' 股票价格预测')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()


采用相同的方法,看验证集数据

prediction=grid_model.predict(testX)
prediction_copies_array = np.repeat(prediction,6, axis=-1)
pred=scaler.inverse_transform(np.reshape(prediction_copies_array,(len(prediction),6)))[:,0]

original_copies_array = np.repeat(testY,6, axis=-1)
# original_copies_array.shape
original=scaler.inverse_transform(np.reshape(original_copies_array,(len(testY),6)))[:,0]
plt.figure(figsize=(10, 8))
plt.plot(original,  label = '真实')
plt.plot(pred,  label = '预测')
plt.title(' 股票价格预测')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()

评估

from sklearn.metrics import make_scorer,mean_squared_error,mean_absolute_error
print('MSE:',mean_squared_error(toriginal,tpred),mean_squared_error(original,pred))
print('MAE:',mean_absolute_error(toriginal,tpred),mean_absolute_error(original,pred))

MSE: 0.05473229063101591 0.12244576326985654
MAE: 0.17944593014201451 0.24734961573477243

从MSE和 MAE来看,值并不大。从数值上看并不大,可从图形上来看预测效果并不理想。

作图

见上图

总结

以上是深度学习中RNN中的LSTM来作股票价格预测,从结果来看效果并不理想,作为一种方法,需要我们掌握的。除了LSTM之外,还有GAN和ANN等方法,处理数据方面大同小异,GAN 是一种比较特殊的方法。
由于在实际应用中效果不理解,很少被采用,因此不作过多的介绍。
总之,我们学习其方法以及原理,决不能作为投资的依据。
以后可以通过机器学习来生成投资策略,那还是比较靠谱的。那是机器学习的另一个应用。

在此警告:文章中的所有内容,不能给你构成投资的理由。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言之函数栈帧】(动态图—巨细)一文带你了解局部变量随机值及栈区上的函数调用

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 局部变量为什么是随机值?函数是如何调用的? ✉️ 该篇将使用该编译器,通过介绍栈帧的创建和销毁来深入了解局…

计算机网络开荒3-传输层

文章目录 一、传输层概述1.1 网络层 vs 传输层 二、多路复用 多路分用三、UDP3.1 RDT3.1.1 Rdt3.1.1.1 Rdt1.03.1.1.2 Rdt2.03.1.1.3 Rdt2.13.1.1.4 Rdt2.23.11.5 Rdt 3.0 四、滑动窗口协议4.1 流水线机制4.1.2 滑动窗口协议GBNSR 五、TCP5.1 可靠数据传输5.1.1 RTT和超时 5.2 …

Vue中如何进行图表绘制

Vue中如何进行图表绘制 数据可视化是Web应用中非常重要的一部分,其中图表绘制是其中的重要环节。Vue作为一款流行的前端框架,提供了很多优秀的图表库,以满足不同业务场景下的需求。本文将介绍如何在Vue中进行图表绘制,包括使用Vu…

MM32F3273G8P火龙果开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置

MM32F3273G8P火龙果开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置 1、Systick寄存器 Systick是ARM内核的一个外设,所以在不同芯片的代码上移植比较方便,他总共有4个寄存器, 从Systick定义中可以看到: typedef struct {__I…

一文看懂Java中的锁

阅读本文你可以获得 Synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock、Condition、Semaphore、CountDownLatch、CyclicBarrier、JMM、Volatile、Happens-Before。 全文共16000字左右(包含示例代码)、欢迎收藏、在看、转发分批食用 一…

基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【MySQL 数据库】11、学习 MySQL 中的【锁】

目录 一、锁的概述与分类二、全局锁(全库数据备份)三、表级锁(1) 表锁(2) 元数据锁(Meta Data Lock)(3) 意向锁 四、行级锁(1) 行锁(2) 间隙锁&临键锁 一、锁的概述与分类 锁是计算机协调多个进程或线程并发访问某一资源的机…

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用 基于Node实现的跨平台抓包调试工具 可以劫持网络请求,并进行请求和响应的修改,来提高我们的开发调试效率 1.一键安装(装包/证书) npm i -g whistle && w2 start --init 证书的问题 安装…

[论文阅读] (31)李沐老师视频学习——4.研究的艺术·理由、论据和担保

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…

5.2 清洗数据

5.2 清洗数据 5.2.1 检测与处理重复值1、记录重复 drop_duplicates()2、特征重复 equals() 5.2.2 检测与处理缺失值 isnull()、notnull()1、 删除法 dropna()2、替换法 fillna()3、 插值法 5.2.3 检测与处理异常值1、3σ原则2、箱线图 5.2.4 任务实现(wei&#xff0…

学习HCIP的day.12

目录 MPLS:多协议标签交换 一、协议的解释和意义 二、工作过程 1、控制层面: 2、数据层面: 三、标签号 四、MPLS的次末跳 五、MPLS的配置 六、使用mpls解决BGP的路由黑洞 七、MPLS VPN 八、配置: 1、ISP部分 MPLS&am…

python+pyqt制作的可最小化到托盘的桌面图形应用代码实例

本篇文章主要讲解使用python、pyqt制作的可以最小化到托盘的桌面图形应用实例。 日期:2023年6月11日 作者:任聪聪 效果演示 说明:实现桌面应用显示窗口,关闭窗口缩小到托盘,点击托盘显示窗口,邮件图标显示退出按钮,点击退出按钮即可关闭应用。 动态演示: 实际情况:…

postgresql 服务的启动操作,不再是DBA的专属

专栏内容:postgresql个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 服务架构概述 服务启动流程 前提 流程 集群创建 集群介绍 数据库服务配置 数据…

202317读书笔记|《心寂犹似远山火:斋藤茂吉短歌300》——茫茫心海里,孤帆与谁同

202317读书笔记|《心寂犹似远山火:斋藤茂吉短歌300》——茫茫心海里,孤帆与谁同 很高兴周五这一天,之前很粉俳句的时候订阅的书都在今天都上架了,可以一饱眼福了。短歌是日本和歌一种诗体,是由三十一音节组…

YOLOv5/v7 添加注意力机制,30多种模块分析③,GCN模块,DAN模块

目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、GCN 模块1、GCN 模块的原理2、实验结果3、应用示例 三、DAN模块1、DAN模块的原理2、实验结果3、应用示例 大家好,我是哪吒。 🏆本文收录于&#xf…

扫雷——C语言实现

扫雷 文章目录 扫雷实现代码什么是扫雷基本功能实现显示选择菜单定义几个二维数组?确定数组大小初始化数组布置地雷打印展示数组排查地雷记录指定区域周围地雷的个数判断排雷成功排查地雷实现代码 基本功能的实现代码和效果展示 拓展功能简化游戏界面改变字体颜色实…

[创业之路-73] :如何判断一个公司或团队是熵减:凝聚力强、上下一心,还是,熵增:一盘散沙、乌合之众?

目录 前言: 一盘散沙、乌合之众: 凝聚力强、上下一心: 一、股权结构与利益分配 一盘散沙、乌合之众 凝聚力强、上下一心 二、组织架构与岗位职责 一盘散沙、乌合之众 凝聚力强、上下一心 三、战略目标 一盘散沙、乌合之众 凝聚力…

碳排放预测模型 | Python实现基于MLP多层感知机的碳排放预测模型(预测未来发展趋势)

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 ![1](https://img-blog.csdnimg.cn/34c113bde2 文章概述 碳排放预测模型 | Python实现基于MLP多层感知机的碳排放预测模型(预测未来发展趋势) 研究内容 这是数据集的链接:https://github.com/…

【伏羲八卦图】(PythonMatlab实现)

目录 1 与达尔文对话 2 与老子对话 2.1 Python实现 2.2 Matlab实现 1 与达尔文对话 140年前,1858年7月1日,达尔文在英伦岛发表了自己有关自然选择的杰出论文。他提出,生物的发展规律是物竞天择。经过物竞,自然界选择并存留最具…

【CAD】【动态块】CAD设置动态块

文章目录 1 CAD的动态块及应用2 块的相关概念2.1 块的相关命令2.1.1 创建块BLOCK2.1.2 插入块INSERT2.1.3 编辑块BEDIT2.1.4 重命名块RENAME 2.2 CAD组(group)和块(block)的区别2.3 “块”(block)和“写块”…