从0开始用informer进行股价预测(pytorch版本)

如果大家不知道informer改进了哪些以及创新点可以去看我的博文链接: 从0开始学习informer
环境pyhthon == 3.10 pytorch安装最新的就行了

1.获取数据

工欲善其事必先利其器,这里选取的股价数据,是以沪深500的工商银行19-24年1月的数据进行为例子。
我是在聚宽上面获取的数据。
这里不多简述在data里面
在这里插入图片描述

#获取数据列的参数和画图横纵坐标参数,以及数据集名称

x_columns, y_columns,xt_columns,yt_columns, plt_x_label, plt_y_label, train_size,data_name = Acquire_data_column()

讲一下Acquire_data_column()函数的作用, x_columns是我们需要训练需要用到的列,因为informer创新点是带入的时间维度,我们的数据是按照day进行的,所以xt_columns对应的就是第0维的列和我们需要训练的数据, yt_columns就是label所需要的参数。我们第一列是开盘价,就以预测开盘价为例子,但是一般都是预测收盘价。你可以自行修改。
下面是具体源码

def Acquire_data_column():
    data_name = "gsyh.csv"#随便取,主要是可以区分不同的数据集创建出不同的文件夹,方便我们训练
    plt_x_label = 'time/day'#画图参数
    plt_y_label = 'Open/rmb'#画图参数
    train_size = 0.8
    x_columns = [1,2, 3, 4, 5,6]#训练的时候encoder的输入维度对应的列
    y_columns = 1#训练的时候decoder的输入维度对应的列
    xt_columns= [0, 2, 3, 4, 5, 6]#训练的时候decoder的输出维度对应的列,但是带时间因为informer创新点是带时间的   [0,1]中的0就是时间(date)列
    yt_columns = [0, 1]#训练的时候decoder的输出维度对应的列,但是带时间因为informer创新点是带时间的
    return x_columns, y_columns,xt_columns,yt_columns, plt_x_label, plt_y_label, train_size,data_name
定义模型的名称,方便创建文件夹好辨认

主函数里面还有Acquire_files,这是获取我们数据所在的路径,主要是。

model_name=f'Informer_model_{data_name}'
#获取文件夹路径名称
save_model_dict_path,png_save_path,png_filename,data_path =Acquire_files(model_name=model_name)
def  Acquire_files(model_name):
    save_model_dict_path=f'informer_add/dict/{model_name}'#保存最优权重的路径
    png_save_path = f'informer_add/picture/{model_name}'
    png_filename = f'{model_name}'#图片保存名字
    data_path='informer_add/datas/601398.XSHG(工商银行14-24).csv'#你要训练的数据路径
    return save_model_dict_path,png_save_path,png_filename,data_path

然后接下来是一些模型参数了关于这些可以在我的文章中得到链接: 从0开始的informer代码解读

make_data_config = DataConfig(data_path=data_path,x_columns=x_columns,y_columns=y_columns,xt_columns=xt_columns,yt_columns=yt_columns,train_size=train_size)
model_config = ModelConfig(enc_in=enc_in,dec_in = dec_in,c_out=c_out,model_name=model_name,lr=lr,epochs=epochs,dropout=dropout,device=device,pre_len=pre_len,batch_size=batch_size,s_len=s_len,best_model_path=save_model_dict_path)

2.创建数据集

至于获取数据集里面的内容细节是label可以是一维的,因为我们预测是一个MS多维预测单维度
所以我们在取数据的时候不能把我们要预测的维度取过来,不然会导致数据泄露,打不到预测的目的了。关于我自定义类可以在我分享的源码里面看。这里不过多赘述。

#获取数据集
train_x, test_x, train_y, test_y,x_stand,y_stand= read_data(make_data_config=make_data_config,model_config=model_config)
train_data =  SocketData(train_x, train_y,x_stand,y_stand)
train_data = DataLoader(train_data, shuffle=True, batch_size=batch_size)
test_data =  SocketData(test_x, test_y,x_stand,y_stand)
test_data = DataLoader(test_data, shuffle=True, batch_size=batch_size)

3.最后创建模型和训练并且打印出我们需要的图片

#创建模型
model = Informer(model_config).to(device)   

#训练和评估模型
losses, predictions, targets=train_and_test(model=model,train_data=train_data,test_data=test_data,y_scaler=y_stand,model_config=model_config)
#保存图片
plot_and_save(losses, predictions[-1], targets[-1],png_save_path=png_save_path,png_filename=png_filename,plt_x_label=plt_x_label,plt_y_label=plt_y_label) 

讲解一下参数
主要就是下面三个,对应的就是获取的x_columns和y_columns的对应列数 enc_in对应x_columns ,dec_in 对应y_columns。比如5列enc_in就是5.

enc_in = 5#编码器输入维度
dec_in = 1#解码器输入维度
c_out = 1 #解码器输出维度

效果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总代码


from torch.utils.data import DataLoader
from sklearn.preprocessing import StandardScaler
from models.Informer_model.model import Informer
from untils.Data import read_data,DataConfig,Acquire_data_column
from untils.ObjectClass import SocketData,ModelConfig
from untils.evaluation_function import train_and_test,plot_and_save
from untils.Creat_file import create_directories,Acquire_files


x_stand = StandardScaler()
y_stand = StandardScaler()
s_len = 64
pre_len = 3
batch_size = 64
device = "cuda"
lr = 0.001
epochs = 50
dropout = 0.05


enc_in = 5#编码器输入维度
dec_in = 1#解码器输入维度
c_out = 1 #解码器输出维度
#获取数据列的参数和画图横纵坐标参数,以及数据集名称
x_columns, y_columns,xt_columns,yt_columns, plt_x_label, plt_y_label, train_size,data_name = Acquire_data_column()

#定义文件夹路径名称
model_name=f'Informer_model_{data_name}'


#获取文件夹路径名称
save_model_dict_path,png_save_path,png_filename,data_path =Acquire_files(model_name=model_name)
# 调用函数创建文件夹
create_directories(save_model_dict_path, png_save_path,clear_dir=True)#clear_dir是否清空文件夹的选择


make_data_config = DataConfig(data_path=data_path,x_columns=x_columns,y_columns=y_columns,xt_columns=xt_columns,yt_columns=yt_columns,train_size=train_size)
model_config = ModelConfig(enc_in=enc_in,dec_in = dec_in,c_out=c_out,model_name=model_name,lr=lr,epochs=epochs,dropout=dropout,device=device,pre_len=pre_len,batch_size=batch_size,s_len=s_len,best_model_path=save_model_dict_path)
#获取数据集
train_x, test_x, train_y, test_y,x_stand,y_stand= read_data(make_data_config=make_data_config,model_config=model_config)
train_data =  SocketData(train_x, train_y,x_stand,y_stand)
train_data = DataLoader(train_data, shuffle=True, batch_size=batch_size)
test_data =  SocketData(test_x, test_y,x_stand,y_stand)
test_data = DataLoader(test_data, shuffle=True, batch_size=batch_size)

#创建模型
model = Informer(model_config).to(device)   

#训练和评估模型
losses, predictions, targets=train_and_test(model=model,train_data=train_data,test_data=test_data,y_scaler=y_stand,model_config=model_config)
#保存图片
plot_and_save(losses, predictions[-1], targets[-1],png_save_path=png_save_path,png_filename=png_filename,plt_x_label=plt_x_label,plt_y_label=plt_y_label) 


全部代码会在群里更新,讲的这么简介的原因是我的博文中有提到一些基本步骤不懂的可以看链接: nlp时序模型股价预测的基本思路(持续更新)

交流群在简介,也是欢迎大佬加入,一起交流。

内容概要:本文详细介绍了基于 PyTorch 构建的时间序列预测模型 Informer。首先是关于数据预处理和标准化的讲解。文中定义了一个标准化类 StandardScaler 对原始数据执行归一化操作,随后介绍了适用于不同类型数据的多个自定义数据集类 (Dataset_ETT_hour, Dataset_Custom, Dataset_Pred) 用以处理不同应用场景的数据,并实现了数据的分片以及标准化操作。对于每个数据集类别都有相应的 __getitem__ 方法来支持索引和获取数据条目以及反向标准化的实现。 文章的核心在于展示了如何使用特定的时间戳、全局和未知事件作为输入以解决编码器和解码器之间的不匹配的问题,这部分涉及到了标量投影、位置嵌入以及层次化和节日的时间戳嵌入,并且提出了 DataEmbedding 实现方法。随后描述了两种独特的注意力机制—— ProbSparseSelf-Attention 和全注意力 FullAttention,分别应用于解码器的不同部分。接下来文章解释了编码器和解码器的设计,其中包括多头自注意层和线性层。最后展示了如何通过超参配置、模型实例化、编译、训练和评价一个完整的 Informer 模型。 适用人群:具备一定的 PythonPyTorch 基础,有机器学习背景的研究员或工程师。特别是那些对时间序列预测和深度学习应用有兴趣的专业人士。 使用场景及目标:本文主要适用于希望理解和实现基于深度学习的时间序列预测的开发者。具体来说,本文能够帮助读者实现对长依赖时间序列预测任务中的 Informer 模型的理解,掌握模型的工作机制(尤其是概率稀疏注意力机制),并且能够在自己的项目中搭建类似的神经网络结构进行预测工作。目标是使开发者可以熟练地应用 Informer 模型于实际的数据集之上。 其他说明:除了对 Informer 模型的详细阐述外,本文档还提供了模型配置项的两种设置方法即使用 dotdict 或命令行解析包 argparse,以适应各种开发环境和个人偏好。此外还有详细的模型训练流程演示以及常见性能评价指标的定义,为模型的效果衡量提供理论支撑。
Informer是一种用于股票预测的模型。该模型使用Transformer结构,它可以处理序列数据。在训练Informer模型时,通常需要提供一对输入和输出序列作为训练数据。例如,在股价预测任务中,输入序列是过去一段时间的股价,输出序列是未来一段时间的股价预测。编码器的输入为过往股价,解码器的输入为预测股价,并且解码器的输出也是预测股价。因此,训练数据集是一对对应的数据,而不是单一类别的数据。 股票市场是金融市场中不可或缺的组成部分。准确预测股票趋势对于投资者和市场参与者具有重要意义,因为它们可以指导投资决策、优化投资组合以及降低金融风险。而且可以提升国家国际地位以及金融风险控制能力,还可以促进股票市场发展以及资源优化利用。股票趋势预测算法作为时间序列预测领域的重要分支,在其他时序预测分支上也具备通用性。 对于Informer股票预测,可以使用模型的predict()方法进行预测。该方法可以直接预测所有数据后面的未知数据。在预测过程中,需要指定预测的长度,例如预测后5天的收盘价走势。预测的结果会保存在指定的路径下的文件中。 在过去的研究中,已经使用了各种传统统计学和机器学习方法来分析过去的股票趋势和预测未来的股票价格。传统统计方法包括差分整合移动自回归平均模型(ARIMA)和简单指数平滑法(SES),而机器学习方法包括支持向量机(SVM)、随机森林(RF)和人工神经网络(ANN)。在这些方法中,机器学习模型通常在预测股票走势应用方面优于ARIMA等统计学模型。 综上所述,Informer是一种用于股票预测的模型,它使用了Transformer结构并处理序列数据。它可以通过训练一对对应的输入和输出序列来进行预测。在预测过程中,可以使用模型的predict()方法来预测未知数据。此外,机器学习模型通常在股票预测中表现优于传统统计学模型。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值