RLHF 的启示:微调 LSTM 能更好预测股票?

ops/2024/10/21 1:19:05/

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:
       
在财务预测领域,准确预测股票价格是一项具有挑战性但至关重要的任务。传统方法通常难以应对股票市场固有的波动性和复杂性。这篇文章介绍了一种创新方法,该方法将长短期记忆 (LSTM) 网络与基于评分的微调机制相结合,以增强股票价格预测。我们将以 Reliance Industries Limited 的股票作为我们的案例研究,展示这种方法如何潜在地提高预测准确性。

一、核心理念

       受 RLHF 的启发,我们尝试在时间序列预测中应用相同的概念,RLHF的概念因为ChatGPT的出现,可能第一次出现在大多数人的眼里,RLHF 是 "Reinforcement Learning from Human Feedback" 的缩写,这是一种结合了强化学习和人类反馈的机器学习方法。在这种方法中,人工智能(AI)系统通过执行任务并接收人类评估者对其行为的反馈来学习。这种方法特别适用于那些难以用传统奖励函数明确定义任务成功与否的情况。回到正题,我们的方法围绕三个关键组成部分:

1. 用于初始股票价格预测的LSTM模型
2.评估这些预测质量的评分模型
3.使用评分模型的输出来优化 LSTM 性能的微调过程

       通过集成这些组件,我们的目标是创建一个更具适应性和准确性的预测系统,从而更好地捕捉股价变动的细微差别。

二、架构概述

1. LSTM 模型:
       我们系统的核心是 LSTM 神经网络。LSTM 特别适合于股票价格等时间序列数据,因为它们能够捕获数据中的长期依赖关系。我们的 LSTM 模型将一系列历史股票价格作为输入,并预测序列中的下一个价格。

2. 评分模型:
       评分模型是一个单独的神经网络,旨在评估 LSTM 预测的质量。它采用原始价格序列和 LSTM 的预测作为输入,输出一个表示 LSTM 预测预测准确性的分数。

3. 微调机制:
       该组件使用评分模型生成的分数来调整 LSTM 的训练过程。在微调过程中,从评分模型获得较高分数的预测会得到更大的权重,从而鼓励 LSTM 学习模式,从而获得更准确的预测。

三、工作流程

1. 数据准备:
       我们首先使用 yfinance 库获取 Reliance Industries Limited 的历史股票价格数据。然后,这些数据被预处理并拆分为适合 LSTM 训练的序列。

2. 初始 LSTM 训练:
       LSTM 模型在部分历史数据上进行训练。这为我们提供了一个能够做出合理股票价格预测的基准模型。

3. 评分模型训练:
       我们使用另一部分数据来训练评分模型。该模型通过将 LSTM 的预测与实际股票价格进行比较来学习评估 LSTM 预测的质量。

4. 微调过程:
       使用数据的第三部分,我们对 LSTM 模型进行微调。在此过程中,我们使用评分模型来评估每个预测。LSTM 的学习率会根据这些分数进行调整,使其能够更专注于改进评分模型认为不太准确的预测。

5. 评估:
       最后,我们在测试集上评估原始 LSTM 和微调后的 LSTM 的性能,比较它们的预测以评估微调方法的有效性。

四、代码实现

       让我们将代码分解为多个部分并详细解释每个部分。

1. 导入库并设置环境

import yfinance as yf
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import torch.nn
import torch.nn import
torch.optim
as optim from torch.utils.data import TensorDataset, DataLoader
import matplotlib.pyplot as plt
device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
print(f“Using device:{device}”)

       此部分导入所有必要的库。我们使用 yfinance 来获取股票数据,使用 numpy 和 pandas 进行数据操作,使用 sklearn 进行数据预处理,使用 torch 构建和训练神经网络,使用 matplotlib 进行可视化。我们还设置了 PyTorch 将用于计算的设备(CPU 或 GPU)。

2. 数据获取和预处理

reliance = yf.Ticker(“RELIANCE.NS”)
data = reliance.history(period=”max”)[‘Close’].values.reshape(-1, 1)scaler = MinMaxScaler(feature_range=(0, 1))
data_normalized = scaler.fit_transform(data)def create_sequences(data, seq_length):
sequences = []
targets = []
for i in range(len(data) — seq_length):
seq = data[i:i+seq_length]
target = data[i+seq_length]
sequences.append(seq)
targets.append(target)
return np.array(sequences), np.array(targets)seq_length = 60 # 60 days of historical data
X, y = create_sequences(data_normalized, seq_length)

       在这里,我们获取 Reliance Industries Limited 股票的历史收盘价。我们使用 MinMaxScaler 对数据进行归一化,以确保所有值都在 0 到 1 之间,这有助于训练神经网络。

       “create_sequences”功能至关重要。它将我们的时间序列数据转换为适合 LSTM 训练的格式。对于每个数据点,它会创建一个前 60 天 (seq_length) 的序列作为输入,并以第二天的价格为目标。

3. 数据切分

lstm_split = int(0.5 * len(X))
scoring_split = int(0.75 * len(X))X_lstm, y_lstm = X[:lstm_split], y[:lstm_split]
X_scoring, y_scoring = X[lstm_split:scoring_split], y[lstm_split:scoring_split]
X_finetuning, y_finetuning = X[scoring_split:], y[scoring_split:]lstm_train_split = int(0.8 * len(X_lstm))
X_lstm_train, y_lstm_train = X_lstm[:lstm_train_split], y_lstm[:lstm_train_split]
X_lstm_test, y_lstm_test = X_lstm[lstm_train_split:], y_lstm[lstm_train_split:]

       我们将数据分为三个主要部分:

1. LSTM 训练和测试
2.评分模型训练
3.微调

       这确保了我们流程的每个阶段都使用单独的数据,防止数据泄露,并对我们的方法进行公平评估。

4. LSTM 模型定义

class LSTMModel(nn.Module):def __init__(self, input_size=1, hidden_size=50, num_layers=2, output_s

http://www.ppmy.cn/ops/119788.html

相关文章

DRF实操学习——文章和评论的设计

DRF实操学习——文章和评论的设计 1.文章表的设计2.文章表接口演示基础权限创建文章修改文章删除文章浏览所有文章 3.评论表的设计4.评论表接口演示1. 查询指定文章下的所有评论 1.文章表的设计 创建一个community的app 在settings中 完成注册 定义模型 创建文章表 from djan…

【Unity服务】如何使用Unity Version Control

Unity上的线上服务有很多,我们接触到的第一个一般就是Version Control,用于对项目资源的版本管理。 本文介绍如何为项目添加Version Control,并如何使用,以及如何将项目与Version Control断开链接。 其实如果仅仅是对项目资源进…

Clickhouse分布式表初体验

ClickHouse的分布式表是一种特殊类型的表,它允许你跨多个节点进行数据的查询和写入操作。以下是创建分布式表的步骤和案例: 1. 创建本地表: 在集群的每个节点上创建一个本地表,可以使用ReplicatedMergeTree系列引擎来实现数据…

电脑录屏怎么录视频和声音?苹果macOS、windows10都可以用的原神录屏工具来啦

在当今数字化时代,电脑录屏已经成为一项非常实用的技能,无论是制作教学视频、记录游戏精彩瞬间,还是进行线上会议演示,都离不开高质量的录屏。那么,电脑录屏怎么录视频和声音呢?今天就为大家详细介绍一下&a…

【数据库】 MongoDB 查看当前用户的角色和权限

在 MongoDB 中,可以通过一些简单的命令查看当前用户的角色和权限。这对于理解用户的访问能力和管理用户权限至关重要。 1. 使用 MongoDB Shell 查看角色和权限 1.1 查看当前数据库用户 要查看当前数据库中的所有用户及其角色,可以使用以下命令&#x…

带你0到1之QT编程:二十二、QChart类图表及折线图、直方图、饼图的三大可视化图表实战!

此为QT编程的第二十二谈!关注我,带你快速学习QT编程的学习路线! 每一篇的技术点都是很很重要!很重要!很重要!但不冗余! 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!…

达梦8-DTS迁移测试-从Oracle迁移到达梦

1、目的 将Oracle数据库的SCOTT用户下的表迁移到达梦8。 2、数据库信息 2.1 Oracle端 操作系统 Redhat 7.5 数据库架构 单机 数据库版本 Oracle 19c 待迁移数据库名 prodpdb 待迁移的对象 SCOTT IP/端口 192.168.6.121:1521 用户名/密码 scott/tiger 字符集编…

VIIRS 版本1(5000)数据于2024年6月17日停更,请转向VIIRS版本2(5200)

根据官网发布的消息,VIIRS版本1(5000)的多数数据产品于今日停止更新。需要VIIRS数据的朋友需要转向版本2数据了。 可见红外成像辐射计套件 (VIIRS) 第 1 版 (集合 1) 陆地数据产品于 2024 年 6 月 17 日终止生产。唯一的例外是双向反射分布函…