机器学习实战33-LSTM+随机森林模型在股票价格走势预测与买卖点分类中的应用

大家好,我是微学AI,今天给大家介绍一下机器学习实战33-LSTM+随机森林模型在股票价格走势预测与买卖点分类中的应用。对于LSTM+随机森林模型的融合应用,我们选择股票价格走势预测与买卖点分类作为应用场景。股票市场数据丰富且对投资者具有实际价值,同时该场景包含了时间序列预测(预测未来股票价格)和分类(判断股票涨跌)两个子任务,可以充分展示LSTM(长短期记忆网络)在时间序列预测方面的优势以及随机森林在分类任务中的强大性能。
在这里插入图片描述

文章目录

  • 一、应用场景选择
  • 二、研究过程
    • 1. 数据收集与预处理
      • 数据来源
      • 数据预处理
    • 2. LSTM模型构建与训练
      • 模型结构
      • 超参数选择
      • 模型训练
    • 3. 随机森林模型构建与训练
      • 模型构建
      • 特征选择
      • 模型训练
    • 4. 模型融合与评估
      • 模型融合
      • 模型评估
      • 模型融合的有效性验证
  • 三、代码实现
    • 1. 导入必要的库
    • 2. 数据加载与预处理代码
    • 3. LSTM模型构建与训练代码
    • 4. 随机森林模型构建与训练代码
    • 5. 模型融合与预测代码
  • 四、样例数据
    • 样例数据展示
    • 数据解释
  • 五、结论
    • 模型性能总结
    • 模型优点与不足

一、应用场景选择

股票市场在现代经济体系中占据着极为重要的地位,它是企业融资的重要渠道,也是投资者获取财富增值的场所。对于投资者而言,准确预测股票价格走势并判断买卖点是其在股票市场中获取收益、规避风险的关键需求。我们选择股票价格走势预测与买卖点分类作为应用场景。股票市场数据丰富且对投资者具有实际价值,同时该场景包含了时间序列预测(预测未来股票价格)和分类(判断股票涨跌)两个子任务,可以充分展示LSTM(长短期记忆网络)在时间序列预测方面的优势以及随机森林在分类任务中的强大性能。通过结合这两个模型,我们期望能够更准确地预测股票价格走势,并为投资者提供有价值的买卖点建议。例如,某投资公司通过类似的模型对特定股票进行分析,发现该模型能够提前预测出股票价格的波动趋势,从而在股价上涨前买入,在股价即将下跌前卖出,实现了较高的投资回报率。

二、研究过程

1. 数据收集与预处理

数据来源

我们从雅虎财经等金融数据提供商获取历史股票价格数据,包括开盘价、收盘价、最高价、最低价、成交量等指标。这些数据将用于训练LSTM模型和随机森林模型。

数据预处理

数据清洗:去除缺失值和异常值,确保数据的准确性和完整性。我们采用直接删除包含缺失值的行的方式来去除缺失值,对于异常值,我们通过设定合理的上下限(例如,根据历史数据的均值和标准差确定合理范围)来识别并删除异常值。
数据归一化:使用MinMaxScaler将不同范围的价格数据归一到[0, 1]的范围,具体是通过MinMaxScaler().fit_transform(data[features])来实现,以提高模型的训练效率和预测准确性。
数据集划分:按照7:2:1的比例划分训练集、验证集和测试集,用于模型的训练、验证和评估。
完成数据预处理后,我们开始构建LSTM模型。

2. LSTM模型构建与训练

模型结构

LSTM模型包括输入层、隐藏层和输出层。输入层接收时间序列数据(如过去一段时间的股票价格数据),隐藏层设置一定数量的神经元以捕捉时间序列中的长期依赖关系,输出层输出对未来股票价格的预测结果。
在这里插入图片描述

超参数选择

学习率:根据经验设置为0.001,以控制模型的学习速度。
迭代次数:设置为100次,以确保模型充分训练。
隐藏层神经元数量:根据数据规模和复杂度设置为128个。

模型训练

使用训练集对LSTM模型进行训练,并在训练过程中监测模型在验证集上的损失和准确率。采用早停法防止过拟合,具体是通过设置tf.keras.callbacks.EarlyStopping(monitor=‘val_loss’, patience = 5),即当验证集上的损失不再下降时(连续5次没有改善)停止训练。

构建并训练好LSTM模型后,我们接着构建随机森林模型。

3. 随机森林模型构建与训练

模型构建

构建随机森林模型,用于对LSTM模型预测的股票价格走势进行分类。确定决策树的数量为100棵,树的深度为10层,以平衡模型的复杂度和泛化能力。
在这里插入图片描述

特征选择

将LSTM模型的预测结果作为随机森林模型的主要输入特征,同时结合其他可能的特征(如历史涨跌情况、交易量等),以提高分类的准确性。

模型训练

使用训练集对随机森林模型进行训练,通过调整超参数优化模型性能。

完成随机森林模型的构建与训练后,我们进行模型融合与评估。

4. 模型融合与评估

模型融合

将LSTM模型的预测结果经过一定处理后作为随机森林模型的输入特征,具体是将LSTM的预测结果与其他相关特征组合起来,然后通过随机森林模型对股票价格走势进行分类。这种融合方式可以充分利用LSTM在时间序列预测方面的优势和随机森林在分类任务中的性能。

模型评估

根据您提供的文本内容,您想要了解如何使用测试集对融合后的模型进行评估,并且使用均方误差(MSE)、准确率、召回率和F1-score等指标来评估模型的性能。下面是这些指标的详细解释和计算方法:

1. 均方误差(MSE)
均方误差是评估模型预测准确性的常用指标,特别是在回归问题中。其计算公式为:
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2
其中:

  • y i y_i yi 是真实值。
  • y ^ i \hat{y}_i y^i 是预测值。
  • n n n 是样本数量。

2. 准确率(Accuracy)
准确率是分类问题中常用的评估指标,表示模型正确预测的样本数占总样本数的比例。其计算公式为:
准确率 = 预测正确的样本数 预测出来的样本数 \text{准确率} = \frac{\text{预测正确的样本数}}{\text{预测出来的样本数}} 准确率=预测出来的样本数预测正确的样本数

3. 召回率(Recall)
召回率也是分类问题中常用的评估指标,表示模型正确识别出的正样本数占所有实际正样本数的比例。其计算公式为:
召回率 = 预测正确的样本数 实际正确的样本数 \text{召回率} = \frac{\text{预测正确的样本数}}{\text{实际正确的样本数}} 召回率=实际正确的样本数预测正确的样本数

4. F1-score
F1-score是准确率和召回率的调和平均数,用于综合考虑准确率和召回率。其计算公式为:
F 1 -score = 2 × 准确率 × 召回率 准确率 + 召回率 F1\text{-score} = 2 \times \frac{\text{准确率} \times \text{召回率}}{\text{准确率} + \text{召回率}} F1-score=2×准确率+召回率准确率×召回率

模型融合的有效性验证

通过比较单一模型和融合模型在上述指标上的表现,可以验证模型融合的有效性。通常,融合模型应该在这些指标上表现更好,或者至少在某些关键指标上有所提升。

这些指标的计算和比较可以帮助您评估模型的性能,并决定是否采用模型融合策略。如果您有具体的数据或需要进一步的帮助来计算这些指标,请提供更多的信息。

三、代码实现

1. 导入必要的库

import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.ensemble import RandomForestClassifier 
from sklearn.metrics import mean_squared_error, accuracy_score, recall_score, f1_score
from sklearn.preprocessing import MinMaxScaler

2. 数据加载与预处理代码

# 加载数据
data = pd.read_csv('stock_prices.csv')# 数据清洗
data.dropna(inplace=True)
# 设定合理的上下限来判断异常值(这里仅为示例,实际可能需要更复杂的判断方式)
lower_bound = data['Close'].quantile(0.05)
upper_bound = data['Close'].quantile(0.95)
data = data[(data['Close'] >= lower_bound) & (data['Close'] <= upper_bound)]# 特征选择
features = ['Open', 'High', 'Low', 'Close', 'Volume']
target = 'Close'# 数据归一化
scaler = MinMaxScaler()
data[features] = scaler.fit_transform(data[features])# 数据集划分
train_size = int(len(data) * 0.7)
val_size = int(len(data) * 0.2)
train_data = data[:train_size]
val_data = data[train_size:train_size+val_size]
test_data = data[train_size+val_size:]

3. LSTM模型构建与训练代码

# 构建LSTM模型
model = tf.keras.Sequential([tf.keras.layers.LSTM(128, input_shape=(None, len(features))), tf.keras.layers.Dense(1)
])# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')# 准备数据
X_train = np.array(train_data[features].values).reshape(-1, 10, len(features))
y_train = np.array(train_data[target].values)
X_val = np.array(val_data[features].values).reshape(-1, 10, len(features))
y_val = np.array(val_data[target].values)# 训练模型
callbacks = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience = 5)
model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), callbacks = callbacks)

4. 随机森林模型构建与训练代码

# LSTM模型预测
X_test_lstm = np.array(test_data[features].values).reshape(-1, 10, len(features))
y_pred_lstm = model.predict(X_test_lstm)# 准备随机森林模型的数据
X_train_rf = np.column_stack((y_train[:-1], train_data[features].values[1:]))
y_train_rf = (train_data[target].values[1:] > train_data[target].values[:-1]).astype(int)
X_test_rf = np.column_stack((y_pred_lstm.flatten(), test_data[features].values))# 构建随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, max_depth=10)# 训练随机森林模型
rf_model.fit(X_train_rf, y_train_rf)

5. 模型融合与预测代码

# 随机森林模型预测
y_pred_rf = rf_model.predict(X_test_rf)# 评估价格预测准确性
mse = mean_squared_error(test_data[target].values, y_pred_lstm.flatten())
print(f'MSE: {mse}')# 评估分类效果
y_test_rf = (test_data[target].values > test_data[target].values.shift(1).fillna(0)).astype(int)
accuracy = accuracy_score(y_test_rf, y_pred_rf)
recall = recall_score(y_test_rf, y_pred_rf)
f1 = f1_score(y_test_rf, y_pred_rf)
print(f'Accuracy: {accuracy}')
print(f'Recall: {recall}')
print(f'F1 - score: {f1}')

四、样例数据

样例数据展示

Open    High    Low     Close   Volume  Target (Next Close)
0.1     0.12    0.08    0.11    0.5     0.115
0.115   0.13    0.1     0.12    0.6     0.125
...

数据解释

Open:开盘价,归一化后的值。
High:最高价,归一化后的值。
Low:最低价,归一化后的值。
Close:收盘价,归一化后的值。
Volume:成交量,归一化后的值。
Target (Next Close):下一个交易日的收盘价,作为预测目标,归一化后的值。

五、结论

模型性能总结

通过评估指标,我们发现LSTM模型在股票价格预测方面表现出了一定的准确性,而随机森林模型则有效地对LSTM的预测结果进行了分类,提高了买卖点判断的准确性。具体来说,融合后的模型在测试集上的MSE较低,表明价格预测较为准确;同时,准确率、召回率和F1 - score也较高,说明分类效果良好。

模型优点与不足

优点:
LSTM模型能够捕捉时间序列中的长期依赖关系,对股票价格走势进行较为准确的预测。它通过特殊的门控机制,可以有效地处理长序列数据中的信息传递,从而在股票价格这种具有时间序列特性的数据预测上具有一定优势。
随机森林模型则利用LSTM的预测结果和其他特征进行分类,提高了买卖点判断的准确性。随机森林通过构建多个决策树并综合其结果,具有较好的抗过拟合能力和对复杂数据的处理能力。
不足:
LSTM模型对长序列数据的处理能力有限,随着序列长度的增加,可能会出现梯度消失或梯度爆炸的问题,影响模型的预测效果。
随机森林模型对高维数据的处理能力有限,当输入特征过多时,可能会导致模型训练时间过长,并且可能会出现过拟合的情况。
模型在处理特定波动模式的股票价格时可能表现不佳,例如突发事件引起的股价大幅波动。在这种情况下,模型可能无法及时捕捉到股价变化的趋势,因为模型是基于历史数据进行训练的,对于未曾出现过的情况可能无法准确应对。模型可能存在一定程度的过拟合或欠拟合情况,我们需要进一步优化超参数和增加更多特征来提高性能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在VS2022中用C++连接MySQL数据库读取数据库乱码问题

1.正确安装mysql 安装之后的配置文件 2.在VS2022中进行相关配置 &#xff08;1&#xff09;右键项目&#xff0c;打开属性 注意是右键项目&#xff0c;不是.cpp文件 &#xff08;2&#xff09;配置属性-> VC目录 -> 包含目录 ->添加头文件路径&#xff08;如图&am…

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…

Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统基础系列(四)

文章目录 概要1 Realsense相机驱动安装Method1: 使用Intel服务器预编译包Method2: 使用ROS服务器预编译包Method3: 使用SDK源代码方法对比总结 2 Realsense-ROS通讯配置与使用2.1 Realsense-ROS包安装2.2 ROS节点启动 小结Reference 概要 本文首先阐述了Realsense相机驱动安装…

初识 Git——《Pro Git》

Why Git&#xff1f; 1. 本地版本控制系统 Why&#xff1a; 许多人习惯用复制整个项目目录的方式来保存不同的版本&#xff0c;或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单&#xff0c;但是特别容易犯错。 有时候会混淆所在的工作目录&#xff0c;一不小心…

Freeswitch使用media_bug能力实现回铃音检测

利用freeswitch的media bug能力来在智能外呼时通过websocket对接智能中心的声音检测接口&#xff0c;来实现回铃音检测&#xff0c;来判断用户当前是否已响应&#xff0c;拒接&#xff0c;关机等。 1.回铃音处理流程 2.模块源码目录结构 首先新建一个freeswitch的源码的src/a…

我的年度总结

这一年的人生起伏&#xff1a;从曙光到低谷再到新的曙光 其实本来没打算做年度总结的&#xff0c;无聊打开了帅帅的视频&#xff0c;结合自己最近经历的&#xff0c;打算简单聊下。因为原本打算做的内容会是一篇比较丧、低能量者的呻吟。 实习生与创业公司的零到一 第一段工…

Hive SQL必刷练习题:留存率问题

首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总用户数 * 100% 解决思…

ASP.NET Core - 缓存之分布式缓存

ASP.NET Core - 缓存之分布式缓存 1. 分布式缓存的使用2. 分布式缓存的接入2.1 基于内存的分布式缓存2.2 基于 Redis 的分布式缓存 分布式缓存是由多个应用服务器共享的缓存&#xff0c;通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的…

机器学习中的凸函数和梯度下降法

一、凸函数 在机器学习中&#xff0c;凸函数 和 凸优化 是优化问题中的重要概念&#xff0c;许多机器学习算法的目标是优化一个凸函数。这些概念的核心思想围绕着优化问题的简化和求解效率。下面从简单直观的角度来解释。 1. 什么是凸函数&#xff1f; 数学定义 一个函数 f…

flutter R库对图片资源进行自动管理

项目中对资源的使用是开发过程中再常见不过的一环。 一般我们在将资源导入到项目中后,会通过资源名称来访问。 但在很多情况下由于我们疏忽输入错了资源名称,从而导致资源无法访问。 所以,急需解决两个问题: 资源编译期可检查可方便预览资源安装相关插件 在vscode中安装两…

闲谭SpringBoot--ShardingSphere分布式事务探究

文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表&#xff0c;且分库表处于一个库3.3 涉及分库表&#xff0c;且分库表处于多个库3.4 涉及分库表&#xff0c;且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…

【Linux】--- 进程的等待与替换

进程的等待与替换 一、进程等待1、进程等待的必要性2、获取子进程status3、进程等待的方法&#xff08;1&#xff09;wait&#xff08;&#xff09;函数&#xff08;2&#xff09;waitpid函数 4、多进程创建以及等待的代码模型5、非阻塞接口 轮询 二、进程替换1、替换原理2、替…

AI 编程工具—Cursor进阶使用 阅读开源项目

AI 编程工具—Cursor进阶使用 阅读开源项目 首先我们打开一个最近很火的项目browser-use ,直接从github 上克隆即可 索引整个代码库 这里我们使用@Codebase 这个选项会索引这个代码库,然后我们再选上这个项目的README.md 文件开始提问 @Codebase @README.md 这个项目是用…

keepalived双机热备(LVS+keepalived)实验笔记

目录 前提准备&#xff1a; keepalived1&#xff1a; keepalived2&#xff1a; web1&#xff1a; web2&#xff1a; keepalived介绍 功能特点 工作原理 应用场景 前提准备&#xff1a; 准备4台centos&#xff0c;其中两台为keepalived&#xff0c;两台为webkeepalive…

【dockerros2】ROS2节点通信:docker容器之间/docker容器与宿主机之间

&#x1f300; 一个中大型ROS项目常需要各个人员分别完成特定的功能&#xff0c;而后再组合部署&#xff0c;而各人员完成的功能常常依赖于一定的环境&#xff0c;而我们很难确保这些环境之间不会相互冲突&#xff0c;特别是涉及深度学习环境时。这就给团队项目的部署落地带来了…

ASP.NET Core - IStartupFilter 与 IHostingStartup

ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离&#xff0c;但是有些时候我们还会可以根据应用中的功能…

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (五、电影详情页的设计实现)

在上一篇文章中&#xff0c;完成了电影列表页的开发。接下来&#xff0c;将进入电影详情页的设计实现阶段。这个页面将展示电影的详细信息&#xff0c;包括电影海报、评分、简介以及相关影人等。将使用 HarmonyOS 提供的常用组件&#xff0c;并结合第三方库 nutpi/axios 来实现…

【excel】VBA股票数据获取(搜狐股票)

文章目录 一、序二、excel 自动刷新股票数据三、付费获取 一、序 我其实不会 excel 的函数和 visual basic。因为都可以用matlab和python完成。 今天用了下VBA&#xff0c;还挺不错的。分享下。 上传写了个matlab获取股票数据的&#xff0c;是雅虎财经的。这次是搜狐股票的数…

Android 高德地图API(新版)

新版高德地图 前言正文一、创建应用① 获取PackageName② 获取调试版安全码SHA1③ 获取发布版安全码SHA1 二、配置项目① 导入SDK② 配置AndroidManifest.xml 三、获取当前定位信息① ViewBinding使用和导包② 隐私合规设置③ 权限请求④ 初始化定位⑤ 获取定位信息 四、显示地…

springCloudGateway+nacos自定义负载均衡-通过IP隔离开发环境

先说一下想法&#xff0c;小公司开发项目&#xff0c;参考若依框架使用的spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos, 用到了nacos的配置中心和注册中心&#xff0c;有多个模块&#xff08;每个模块都是一个服务&#xff09;。 想本地开发&#xff0c;…