【python量化】将Informer用于股价预测

news2025/2/26 23:13:34

b6a2fc4ca266b59f2259bc1e810728f3.png

写在前面

Informer模型来自发表于AAAI21的一篇best paper《Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting》。Informer模型针对Transformer存在的一系列问题,如二次时间复杂度、高内存使用率以及Encoder-Decoder的结构限制,提出了一种新的思路来用于提高长序列的预测问题。下面的这篇文章主要带大家使用作者开源的Informer代码,并将其用于股票价格预测当中。

1

Informer模型

近年来的研究表明,Transformer具有提高预测能力的潜力。然而,Transformer存在几个严重的问题,使其不能直接适用于长期时序预测问题,例如二次时间复杂度、高内存使用量和编码器-解码器体系结构固有的局限性。为了解决这些问题,这篇文章中设计了一种基于Transformer的长期时序预测模型,即Informer模型,该模型具有三个显著特征

  1. 一种ProbSpare self-attention机制,它可以在时间复杂度和空间复杂度方面达到   。

  2. self-attention机制通过将级联层输入减半来突出主导注意,并有效地处理过长的输入序列。

  3. 生成式解码器虽然概念简单,但对长时间序列序列进行一次正向操作而不是step-by-step的方式进行预测,这大大提高了长序列预测的推理速度。

并且,在4个大规模数据集上的大量实验表明,Informer方法显著优于现有方法,为长期时序建模问题提供了一种新的解决方案。

文中提出的模型的整体框架如下图所示,可以看出提出的Informer模型仍然保存了Encoder-Decoder的架构:

8e6a41d331110d6d41ed72d6ac702d1b.png

Self-attention mechanism

首先,传统的self-attention机制输入形式是   ,然后进行scaled dot-product。第i个Query的attention系数的概率形式是:

d1bd1a4060c6848d81d86a26e0c7a977.png

self-attention机制要求二次时间复杂度的点积运算来计算上面的概率  ,计算需要  的空间复杂度。因此,这是提高预测能力的主要障碍。另外,之前的研究发现,self-attention的概率分布具有潜在的稀疏性,并对所有的  都设计了一些“选择性”的计数策略,而不显著影响性能。因此,作者首先对典型的self-attention的学习模式进行定性评估。“稀疏性” self-attention的分布呈长尾分布,即少数点积对主要注意有贡献,其他点积对可以忽略。那么,下一个问题是如何区分它们?

为了度量query的稀疏性,作者用到了KL散度。其中第i个query的稀疏性的评价公式是:

2f06e47daf2f920916ee380ff04613a4.png

其中第一项是  对于所有的key的Log-Sum-Exp (LSE),第二项是它们的算数平均值。

基于上面的评价方式,就可以得到ProbSparse self-attetion的公式,即:

3c0395a468756ed8e610e90e79f9764c.png

其中,  是和  具有相同尺寸的稀疏矩阵,并且它只包含在稀疏评估  下top-u的queries。其中,u的大小通过一个采样参数来决定。这使得ProbSparse self-attention对于每个query-key只需要计算  点积操作。另外经过文章Lemma 1的证明,其对稀疏评估进行了上边界的计算,从而保证了计算的时间和空间复杂度为  。

Encoder

Encoder的设计目的是提取长序列输入的远期依赖性。作为ProbSpare自注意机制的结果,encoder的特征映射存在值V的冗余组合,因此,这里利用distilling操作对具有主导特征的优势特征进行赋予更高权重,并在下一层生成focus self-attention特征映射。从j到j+1层的distilling操作的过程如下:

b37c68b0c48288bc5161c67f2f82dab2.png

其中,  包含了multi-head probsparse self-attention以及在attention block中的关键操作。Conv1d表示时间序列上的一维卷积操作,并通过ELU作为了激活函数。

Decoder

Decoder部分中使用了一个标准的decoder结构 (Vaswani et al. 2017),它由两个相同的多头注意层组成。另外,生成推理被用来缓解长期预测的速度下降。我们向decoder提供如下输入向量:

30a33212a7a796732d57eac4e5459926.png

其中,将masked multi-head attention应用于probsparse self-attention的计算中。它防止每个位置都注意到下一个位置,以此避免了自回归。最后,一个全连接层获得最终的输出,它的输出维度取决于我们是在进行单变量预测还是多变量预测。

Loss Function

模型选取MSE作为loss function以将decoder的输出与目标序列的误差进行反向传播。

2

环境配置

本地环境:

Python 3.7
IDE:Pycharm

库版本:

numpy 1.18.1
pandas 1.0.3 
sklearn 0.22.2
matplotlib 3.2.1
torch 1.10.1

Informer源码Github链接:https://github.com/zhouhaoyi/Informer2020

3

代码实现

首先将Informer的源码下载到本地,然后将我们的数据集放到某个路径下,这里用到了上证指数14到17年四年的开高低收成交量数据。在将Informer的代码用于我们的股票数据预测任务时,由于我们的任务是基于高低收成交量来预测收盘价,这是一个多变量输入,单变量输出的预测任务。所以主要需要修改下面几个参数的设置。针对其他不同预测任务要求,如增加某些特征,预测多个目标变量等则可通过修改features,target,enc_in,dec_in以及c_out参数进行实现。

  • data:设置为custom,用于调用Dataset_Custom类,从而可以自定义数据集。

  • root_path:指定数据集存放的文件夹。

  • data_path:指定csv数据集的名称。

  • features:设置为MS,这是因为我们是用开高低收成交量来预测收盘价,所以是多变量输出来预测单变量。

  • target:表示预测变量,设置为Close,对应我们csv文件预测变量的列名。

  • freq:表示预测频率,设置为d,因为我们用到的是日线级别的数据。

  • seq_len:表示输入encoder的序列长度,这里设置为20。

  • label_len:表示输入decoder中的token的长度,这里设置为10,即通过前10个真实值来辅助decoder进行预测。

  • pred_len:表示预测序列的长度,这里设置为5,即表示预测后5个时刻的序列值。

  • enc_in:表示encoder的输入维度,这里设置为5,因为我们用到了开高低收以及成交量5个特征。

  • dec_in:表示decoder的输入维度,同enc_in。

  • c_out:表示输出序列的维度,这里设置为1,因为我们的目标变量只有收盘价。

其他参数像模型层数,维度之类的可以根据自己的电脑配置进行修改。下面是进行上证指数预测实验的参数配置:

args = dotdict()


args.model = 'informer' # model of experiment, options: [informer, informerstack, informerlight(TBD)]
args.data = 'custom' # data
args.root_path = './data/stock/' # root path of data file
args.data_path = 'SH000001.csv' # data file
args.features = 'MS' # forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate
args.target = 'Close' # target feature in S or MS task
args.freq = 'd' # freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h
args.checkpoints = './checkpoints' # location of model checkpoints


args.seq_len = 20 # input sequence length of Informer encoder
args.label_len = 10 # start token length of Informer decoder
args.pred_len = 5 # prediction sequence length
# Informer decoder input: concat[start token series(label_len), zero padding series(pred_len)]


args.enc_in = 5 # encoder input size
args.dec_in = 5 # decoder input size
args.c_out = 1 # output size
args.factor = 5 # probsparse attn factor
args.padding = 0  # padding type
args.d_model = 256 # dimension of model
args.n_heads = 4 # num of heads
args.e_layers = 2 # num of encoder layers
args.d_layers = 1 # num of decoder layers
args.d_ff = 256 # dimension of fcn in model
args.dropout = 0.05 # dropout
args.attn = 'prob' # attention used in encoder, options:[prob, full]
args.embed = 'timeF' # time features encoding, options:[timeF, fixed, learned]
args.activation = 'gelu' # activation
args.distil = True # whether to use distilling in encoder
args.output_attention = False # whether to output attention in ecoder


args.batch_size = 32
args.learning_rate = 0.0001
args.loss = 'mse'
args.lradj = 'type1'
args.use_amp = False # whether to use automatic mixed precision training


args.num_workers = 0
args.train_epochs = 20
args.patience = 3
args.des = 'exp'


# args.use_gpu = True if torch.cuda.is_available() else False
args.use_gpu = False
args.gpu = 0


args.use_multi_gpu = False
args.devices = '0,1,2,3'

按照设置的参数,然后对模型进行训练跟测试:

Exp = Exp_Informer
#%%
# setting record of experiments
setting = '{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_at{}_fc{}_eb{}_dt{}_{}'.format(args.model, args.data, args.features,
            args.seq_len, args.label_len, args.pred_len,
            args.d_model, args.n_heads, args.e_layers, args.d_layers, args.d_ff, args.attn, args.factor, args.embed, args.distil, args.des)


# set experiments
exp = Exp(args)


# train
print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
exp.train(setting)


# test
print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
exp.test(setting)

经过训练,可以看出模型的训练集上的loss不断下降,因为加入了early stop机制,所以经过8个epoch模型就停止训练了。经过在测试集上的测试,informer实现了0.021的mse跟0.123的mae(归一化后的结果)。需要注意的是,模型经过训练跟测试之后,会在当前路径的./checkpoints中保存模型参数,在./results/{settings}/下生成pred.npy以及true.npy文件用来分别存放测试集上的预测结果跟ground truth。

>>>>>>>start training : informer_custom_ftMS_sl20_ll10_pl5_dm256_nh4_el2_dl1_df256_atprob_fc5_ebtimeF_dtTrue_exp>>>>>>>>>>>>>>>>>>>>>>>>>>
train 659
val 95
test 191
Epoch: 1 cost time: 1.8236503601074219
Epoch: 1, Steps: 20 | Train Loss: 0.4227553 Vali Loss: 0.0319062 Test Loss: 0.0245216
Validation loss decreased (inf --> 0.031906).  Saving model ...
Updating learning rate to 0.0001
Epoch: 2 cost time: 1.803605556488037
Epoch: 2, Steps: 20 | Train Loss: 0.1243612 Vali Loss: 0.0671695 Test Loss: 0.0823020
EarlyStopping counter: 1 out of 3
Updating learning rate to 5e-05
Epoch: 3 cost time: 1.8560359477996826
Epoch: 3, Steps: 20 | Train Loss: 0.0910275 Vali Loss: 0.0242387 Test Loss: 0.0311569
Validation loss decreased (0.031906 --> 0.024239).  Saving model ...
Updating learning rate to 2.5e-05
Epoch: 4 cost time: 2.1183347702026367
Epoch: 4, Steps: 20 | Train Loss: 0.0757393 Vali Loss: 0.0215489 Test Loss: 0.0264782
Validation loss decreased (0.024239 --> 0.021549).  Saving model ...
Updating learning rate to 1.25e-05
Epoch: 5 cost time: 2.111354351043701
Epoch: 5, Steps: 20 | Train Loss: 0.0707515 Vali Loss: 0.0184724 Test Loss: 0.0211690
Validation loss decreased (0.021549 --> 0.018472).  Saving model ...
Updating learning rate to 6.25e-06
Epoch: 6 cost time: 1.6446027755737305
Epoch: 6, Steps: 20 | Train Loss: 0.0712520 Vali Loss: 0.0198189 Test Loss: 0.0230161
EarlyStopping counter: 1 out of 3
Updating learning rate to 3.125e-06
Epoch: 7 cost time: 1.7283775806427002
Epoch: 7, Steps: 20 | Train Loss: 0.0701941 Vali Loss: 0.0202722 Test Loss: 0.0219292
EarlyStopping counter: 2 out of 3
Updating learning rate to 1.5625e-06
Epoch: 8 cost time: 1.8929383754730225
Epoch: 8, Steps: 20 | Train Loss: 0.0698262 Vali Loss: 0.0195256 Test Loss: 0.0222712
EarlyStopping counter: 3 out of 3
Early stopping
>>>>>>>testing : informer_custom_ftMS_sl20_ll10_pl5_dm256_nh4_el2_dl1_df256_atprob_fc5_ebtimeF_dtTrue_exp<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
test 191
test shape: (5, 32, 5, 1) (5, 32, 5, 1)
test shape: (160, 5, 1) (160, 5, 1)
mse:0.021161550655961037, mae:0.1239549070596695

调用模型的predict()方法可以直接预测所有数据后面的未知数据,因为这里预测长度为5,所以直接调用就相当于预测后5天的收盘价走势了。预测的结果会保存在./results/{settings}/下面的real_prediction.npy文件中。

setting = 'informer_custom_ftMS_sl20_ll10_pl5_dm256_nh4_el2_dl1_df256_atprob_fc5_ebtimeF_dtTrue_exp'


exp = Exp(args)
exp.predict(setting, True)


prediction = np.load('./results/'+setting+'/real_prediction.npy')
plt.figure()
plt.plot(prediction[0,:,-1])
plt.show()

73521cd23358b7cc92066a837662510c.png

从测试集上随机选出几条预测结果以及ground truth进行可视化:

preds = np.load('./results/'+setting+'/pred.npy')
trues = np.load('./results/'+setting+'/true.npy')


plt.figure()
plt.plot(trues[20,:,-1], label='GroundTruth')
plt.plot(preds[20,:,-1], label='Prediction')
plt.legend()
plt.show()

23e75a42ad655414ac0780645f0e9976.png

64212fad4b21063a961e82a23cffdb82.png

最后将完整的测试集上的预测结果进行可视化。

plt.figure()
plt.plot(trues[:,0,-1].reshape(-1), label='GroundTruth')
plt.plot(preds[:,0,-1].reshape(-1), label='Prediction')
plt.legend()
plt.show()

f484c5dbdfdb66a782392abd2da15540.png

4

总结

作为AAAI 2021的best paper,Informer对Transformer在时序预测应用上从三个方面进行了改进,并取得了不错的长期预测效果。基于官网Informer的代码,本文简单介绍了Informer模型的基本原理,以及在股价预测方面的代码实现,并通过上证指数数据进行了实验验证,从实验结果中,可以看出informer大体拟合出了上证指数这段时间的走势,但仍然存在精度上的不足,这也说明了不同于其他天气,电力等周期性强的时序数据,股价数据存在的高噪声跟不确定性使得其预测的难度之大,尤其是进行高精度的多步预测更是难以实现。Informer官方提供了详细完整的代码,大家感兴趣的也可以进一步进行调参或者修改,来用于自己的预测任务。本文内容仅仅是技术探讨和学习,并不构成任何投资建议。

参考文献:

Zhou H, Zhang S, Peng J, et al. Informer: Beyond efficient transformer for long sequence time-series forecasting[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2021, 35(12): 11106-11115.

https://colab.research.google.com/github/patoalejor/Workshop2021/blob/main/Informer.ipynb

获取完整代码以及其他历史文章完整源码可加入《人工智能量化实验室》知识星球。

db49f20e9063b1883b944886db0c66e6.png

《人工智能量化实验室》知识星球

35df68c06759e70fb0c48fe301724aac.png

加入人工智能量化实验室知识星球,您可以获得:(1)定期推送最新人工智能量化应用相关的研究成果,包括高水平期刊论文以及券商优质金融工程研究报告,便于您随时随地了解最新前沿知识;(2)公众号历史文章Python项目完整源码;(3)优质Python、机器学习、量化交易相关电子书PDF;(4)优质量化交易资料、项目代码分享;(5)跟星友一起交流,结交志同道合朋友。(6)向博主发起提问,答疑解惑。

268bcd2047f2d783dfeb6f4d7b7fedc8.png

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

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

相关文章

后台管理不可忽视,华为云会议最新支持管理员分权分域

如今&#xff0c;跨地域&#xff0c; 跨组织&#xff0c;需要随时随地接入的远程沟通协作变得愈加频繁&#xff0c;众多企业开始纷纷建设符合自身需求的智能会议室。在会议系统的众多能力中&#xff0c;后台管理&#xff0c;这项常常被C端用户忽略的能力&#xff0c;B端的企业却…

真的够可以的,基于Netty实现了RPC框架

RPC全称Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;对于调用者无感知这是一个远程调用功能。目前流行的开源RPC 框架有阿里的Dubbo、Google 的 gRPC、Twitter 的Finagle 等。本次RPC框架的设计主要参考的是阿里的Dubbo&#xff0c;这里Netty 基本上是作为架构…

1. Spring Boot 3 入门学习教程之开发第一个 Spring Boot 应用程序

Spring Boot 3 入门学习教程之开发第一个 Spring Boot 应用程序0. 前言1. Spring Boot 介绍2. 系统要求2.1 Servlet容器2.2 GraalVM Native Image&#xff08;GraalVM 原生镜像&#xff09;3. 安装Spring Boot 开发环境3.1 安装JDK3.2 安装Spring Boot构建工具3.2.1 方式一&…

C++标准库分析总结(九)——<仿函数/函数对象>

目录 1.functor仿函数简介 2 仿函数的分类 3 仿函数使用 4 仿函数可适配的条件 1.functor仿函数简介 仿函数是STL中最简单的部分&#xff0c;存在的本质就是为STL算法部分服务的&#xff0c;一般不单独使用。仿函数&#xff08;functors&#xff09;又称为函数对象&…

【InnoDB Cluster】修改已有集群实例名称及成员实例选项

【InnoDB Cluster】修改已有集群实例名称&#xff0c;成员实例名称和选项 文章目录【InnoDB Cluster】修改已有集群实例名称&#xff0c;成员实例名称和选项修改名称修改已有集群实例名称修改已有集群实例的成员实例名称修改成员服务器操作系统的主机名直接修改元数据库中的表使…

力扣(LeetCode)88. 合并两个有序数组(C++)

朴素思想 朴素思想&#xff0c;开第三个数组&#xff0c;对 nums1nums1nums1 和 nums2nums2nums2 进行二路归并。 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {vector<int> nums3(mn);int i 0,j …

2.2 Linux启动初始化文件系统

为了方便了解和调试我们的Linux系统,我们需要将proc,debugfs,tmp等挂载起来,否则我们我发了解系统的进程,负载等信息,如下是未进行任何挂载时,我们无法通过ps等方法查看系统任何进程信息: 一,挂载proc fs proc是一个伪文件系统,(伪文件系统只存在内存中,而不占用存…

Node.js 入门教程 2 Node.js 简史

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程2 Node.js 简史2.1 一点历史2.2 20092.3 20102.4 20112.5 20122.6 20132.7 20142.8 20152.9 20162.10 20172.11 20182.12 2…

聊一聊微服务常见配置中心工作原理

0. 环境 nacos版本&#xff1a;1.4.1 Spring Cloud : 2020.0.2 Spring Boot &#xff1a;2.4.4 Spring Cloud alibaba: 2.2.5.RELEASE Spring Cloud openFeign 2.2.2.RELEASE 测试代码&#xff1a;github.com/hsfxuebao/s… 1. 配置中心基础 1.1 为什么要用配置中心&…

Js逆向教程-15滑块流程 极验

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Js逆向教程-15滑块流程 极验 一、滑块是什么&#xff1f; 区分是否是机器人。根据滑动轨迹区分是否是人操作的。 滑块肯定有滑动条 …

亚马逊云科技持续创新、领势而行,re:Invent颠覆想象

当一行行代码成为托起数字社会的基础架构&#xff0c;社会发展开始面临真正意义上的变革与重塑。作为云计算领域的探路者与引领者&#xff0c;亚马逊云科技持续创新、领势而行&#xff0c;正不断塑造并颠覆着大众关于云计算未来的想象。 2006年 开端 2006年&#xff0c;亚马逊…

【单片机基础】I2C通信-基于STC89C52RC

文章目录1、IIC总线结构2、IIC总线传输协议3、完成工程代码1、IIC总线结构 IIC总线是philips公司在八十年代初推出的一种串行、半双工总线。主要用于近距离、低速的芯片之间通信&#xff1b;IIC总线有两根双向的信号线&#xff0c;一根数据线SDA用于收发数据一根时钟线SCL用于…

Mac 使用paralles 从零搭建hadoop集群

目录 1. 虚机的安装与配置 1.1 安装parallels 1.2 安装fedora系统 1.3 fedora的配置 1.3.1 内存和硬盘配置 1.3.2 网络配置 1.3.3 共享文件夹 1.4 虚拟机克隆 与 加载 2. 免密登录 2.1 分别查看master&#xff0c; slave01&#xff0c;slave02 的ip 2.2 查看各虚机的…

关于mpy电压采集模块的那些事儿(ads1256 ads8688 ad7606)

先来个人生碎碎念&#xff0c;越狱第三次失败了&#xff0c;而且第四次也可能失败&#xff0c;没错就是这么尴尬&#xff0c;绝对越狱的事件还有917天&#xff0c;其实比较麻木了&#xff0c;越狱成功与否都无所谓了&#xff0c;其实现在出去&#xff0c;外头的疫情&#xff0c…

【学生网页设计作业源码】基于HTML+CSS+JavaScript简单的大学生书店(13个页面) 二手书店电子商务网站模板源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

常见的数据结构基本介绍

文章目录常见的数据结构介绍栈和队列的介绍数组数据结构链表数据结构二叉树和二叉查找树平衡二叉树红黑树结构常见的数据结构介绍 数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。 通常情况下&#xff0c;精心选择的数据结构可以带来更…

应用ceph文件系统存储(ceph-13.2.10)

记录&#xff1a;333 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;部署ceph-13.2.10集群。应用ceph文件系统(ceph file system)&#xff1b;主要是创建ceph文件系统、客户端挂载ceph文件系统等操作。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 ceph版本&am…

JS获取音频的总时长,解决audio.duration 为 NaN || Infinity 问题

目录一、需求分析二、发现问题1.使用浏览器内置播放器<audio>无法显示时长2.获取总时长为 NaN || Infinity三、疑惑点四、解决方案一、需求分析 后端的接口中包含音频链接&#xff0c;前端需要自定义一个播放器播放音频。 二、发现问题 1.使用浏览器内置播放器<audi…

JPA 中使用 @OneToMany 、@ManyToOne 等关系映射注解

JPA 做 ORM(Object Relational Mapping&#xff0c;对象关系映射)时&#xff0c;为了开发效率&#xff0c;通常会在实体类上用 hibernate 的关系关联注解。 包括&#xff1a;OneToOne、 OneToMany 、ManyToOne 、ManyToMany 、JoinTable、以及 JoinColumn 以及 OrderBy&#xf…

汽车Automotive > SOME/IP应用学习

目录 SOME/IP介绍 SOME/IP主要功能 SOME/IP协议 SOME/IP服务类型 SOME/IP-举例 SOME/IP各模块协议 SOME/IP-基础元件 SOME/IP-SoAD SOME/IP-SD协议 SOME/IP-SD举例 SOME/IP-TP协议 SOME/IP-TP举例 SOME/IP介绍 SOME/IP ( Scalable service-Oriented Middleware ove…