【python量化】广发证券研报:Transformer 架构下的量价选股策略

以下内容来自知乎链接:

https://zhuanlan.zhihu.com/p/620820228

作者:日暮途远  已获得作者同意转载。

最近看到了一篇广发证券的关于使用Transformer进行量化选股的研报,在此进行一个复现记录,有兴趣的读者可以进行更深入的研究。

2bfb894c8652bb5f2596f9b8df5728b6.jpeg

来源:广发证券

应用的Transformer架构

其中报告中基于传统Transformer的改动如下:

1.替换词嵌入层为线性层:

在NLP领域,需要通过词嵌入将文本中的词转换为词向量作为输入,而在股票数据中大多数情况下,输入基本都会有数值型数据。所以将词嵌入层替换为常规的线性层,通过线性变换代替词嵌入的过程。

2.拓展数据输入到面板数据

虽然Transformer模型最初是设计为接收一维序列(即一个句子)作为输入的,但通过将词嵌入层替换为线性层的修改后,模型可以直接处理多维序列(即面板数据)。

这个已经通过上面的线性层实现个人认为不算明显的改动。

3.取消解码器的逐个预测机制和掩码操作

股票预测中,我们通常希望能准确预测未来一段时间的收益情况,因此模型输出一般为一个值(回归问题)或涨跌概率(分类问题),因此我们对解码器进行简化,取消了逐个预测机制和掩码操作。

数据介绍以及预处理

文章中使用的特征为个股过去20个月的月度量价数据中选取特征序列,每期的每只股票都是一个样本,特征向量可以表示为

ecdb88ab27f8d7c7c214aa38008eb0e6.png

其中return表示股票每月涨跌幅;turnover表示股票每月换手率(每日换手率之和)。

这也是之后用到的每个数据的维度(20, 2), 其中20是时间步长,2是特征维度。

之后对特征进行预处理:

1. 缺失值处理:当股票某一时刻的特征值缺失时(上市不满20个月的情况除外),使用上一时

刻的特征值进行填充。

2.极值、异常值处理:均值加三倍标准差缩边。

3.截面标准化。

关于label的给定,这里使用的是分类的概念,对每月对样本内的所有股票按下个月相对基准的超额涨跌幅进行排序,取涨幅前20%的股票,标记为“上涨”;取涨幅居中20%的股票(涨幅位于40%分位数到60%分位数之间),标记为“平盘”;取涨幅末20%的股票,标记为“下跌”。

f58bf2ea474f1a35688c4429132e9c0f.jpeg

来源:广发证券

其中舍弃三类标签的中间两部分是因为要同时为了使不同标签样本之间的区别更明显且样本数尽可能接近,之后将标签进行热编码。

模型的参数选择和整体结构

序列向量维度(经过替代词嵌入层的线性层处理后的维度)、多头注意力机制头数、编码器和解码器层数需要提前设定,通过网格搜索方法,研报中参数组合确定为:

1. 序列向量维度d=64

2. 多头注意力机制头数h=8

3. 编码器和解码器层数N=6

最终模型结构如下:

[20,2](输入层)→[20,64](线性层)→8×[20,8](编码层1)→8×[20,8](编码层2)→8×[20,8](编码层3)→8×[20,8](编码层4)→8×[20,8](编码层5)→8×[20,8](编码层6)→8×[20,8](解码层1)→8×[20,8](解码层2)→8×[20,8](解码层3)→8×[20,8](解码层4)→8×[20,8](解码层5)→8×[20,8](解码层6)

→[3](输出层)

模型共有403075个参数需要进行训练

以下是根据文章描述搭建的transformer模型。首先构建多头注意力,编码器,解码器模块:

 
import torch
import torch.nn as nnclass MultiHeadAttention(nn.Module):def __init__(self, d_model, num_heads):super(MultiHeadAttention, self).__init__()self.num_heads = num_headsself.d_model = d_modelself.depth = int(d_model / num_heads)self.W_Q = nn.Linear(d_model, d_model)self.W_K = nn.Linear(d_model, d_model)self.W_V = nn.Linear(d_model, d_model)self.W_O = nn.Linear(d_model, d_model)def forward(self, Q, K, V):Q = self.W_Q(Q)K = self.W_K(K)V = self.W_V(V)Q = self._split_heads(Q)K = self._split_heads(K)V = self._split_heads(V)attention_weights = torch.matmul(Q, K.transpose(-1, -2)) / torch.sqrt(torch.tensor(self.depth, dtype=torch.float32))attention_weights = torch.softmax(attention_weights, dim=-1)output = torch.matmul(attention_weights, V)output = self._combine_heads(output)output = self.W_O(output)return outputdef _split_heads(self, tensor):tensor = tensor.view(tensor.size(0), -1, self.num_heads, self.depth)return tensor.transpose(1, 2)def _combine_heads(self, tensor):tensor = tensor.transpose(1, 2).contiguous()tensor = tensor.view(tensor.size(0), -1, self.num_heads * self.depth)return tensorclass EncoderLayer(nn.Module):def __init__(self, d_model, num_heads):super(EncoderLayer, self).__init__()self.attention = MultiHeadAttention(d_model, num_heads)self.feedforward = nn.Sequential(nn.Linear(d_model, 4 * d_model),nn.ReLU(),nn.Linear(4 * d_model, d_model))self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)def forward(self, x):attention_output = self.attention(x, x, x)attention_output = self.norm1(x + attention_output)feedforward_output = self.feedforward(attention_output)output = self.norm2(attention_output + feedforward_output)return outputclass DecoderLayer(nn.Module):def __init__(self, d_model, num_heads):super(DecoderLayer, self).__init__()self.self_attention = MultiHeadAttention(d_model, num_heads)self.encoder_attention = MultiHeadAttention(d_model, num_heads)self.feedforward = nn.Sequential(nn.Linear(d_model, 4 * d_model),nn.ReLU(),nn.Linear(4 * d_model, d_model))self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)self.norm3 = nn.LayerNorm(d_model)def forward(self, x, encoder_output):self_attention_output = self.self_attention(x, x, x)self_attention_output = self.norm1(x + self_attention_output)encoder_attention_output = self.encoder_attention(self_attention_output, encoder_output, encoder_output)encoder_attention_output = self.norm2(self_attention_output + encoder_attention_output)feedforward_output = self.feedforward(encoder_attention_output)output = self.norm3(encoder_attention_output + feedforward

再通过上述结构搭建transformer网络:

import torch
import torch.nn as nnclass Transformer(nn.Module):def __init__(self, input_dim, hidden_dim, num_heads, num_layers):super(Transformer, self).__init__()self.input_layer = nn.Linear(input_dim, hidden_dim)self.encoder_layers = nn.ModuleList([EncoderLayer(hidden_dim, num_heads) for _ in range(num_layers)])self.decoder_layers = nn.ModuleList([DecoderLayer(hidden_dim, num_heads) for _ in range(num_layers)])self.output_layer = nn.Linear(hidden_dim, 3)def forward(self, x):# Input layerx = self.input_layer(x)# Encoder layersencoder_output = x.transpose(0, 1)for layer in self.encoder_layers:encoder_output = layer(encoder_output)# Decoder layers# 编码器最后一层的输出作为解码器的输入,当然也可以使用所有时间步长,则去掉这一行,将整个encoder_output传递给解码器decoder_output = encoder_output[-1, :, :].unsqueeze(0)for layer in self.decoder_layers:decoder_output = layer(decoder_output, encoder_output)# Output layeroutput = self.output_layer(decoder_output.squeeze(0))return output

其中,input_dim是输入的特征维度,这里是2;hidden_dim是模型中隐藏层的维度,这里是64;num_heads是多头注意力机制中头的个数,这里是8;num_layers是编码器和解码器中的层数,这里都是6。

训练完成后就可以读取训练好的模型进行股票分类预测了:

# 创建模型实例
model = Transformer(input_dim=2, hidden_dim=64, num_heads=8, num_layers=6)# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 训练数据的维度为 (batch_size, 20, 2),标签的维度为 (batch_size, 3)
# 开始训练
for epoch in range(num_epochs):
running_loss = 0.0
for i, data in enumerate(train_loader, 0):# 输入数据
inputs, labels = data
inputs = inputs.float()
labels = labels.float()optimizer.zero_grad()
outputs = model(inputs)# 计算损失
loss = criterion(outputs, labels)# 反向传播和优化
loss.backward()
optimizer.step()# 统计损失
running_loss += loss.item()# 输出统计信息print('Epoch [%d/%d], Loss: %.4f' % (epoch+1, num_epochs, running_loss / len(train_loader)))

全市场选股-多空对冲策略实证分析

在全市场A股,进行模型的训练和选股策略的回测。从2000年至2019年获取样本进行训练,在2020年到2023年(样本外),用训练好的Transformer预测模型进行策略回测,回测参数设置如下:

调仓周期:1个月

股票池:全市场股票(万得全A指数成份股),剔除交易日停牌的股票

回测期:2020年1月至2023年3月

交易成本:双边0.3%

假设可以卖空最低档(第五档)的股票,买入最高档(第一档)的股票,多空对冲策略自2020年以来,策略的年化收益率为15.58%,最大回撤为-12.09%,日度胜率为56.61%。

2f6c0ff51e24892c029709a6794d7a7b.jpeg

来源:广发证券

81ac7db54672da0ecba8139ca59eb372.jpeg

来源:广发证券

总结:本报告将Transformer模型引入投资领域,证明了Transformer因子具有一定的选股能力。从市场中众多使用时序网络(rnn)进行选股预测的研报中,为读者们提供了另一种神经网络拟合多因子的网络结构思路,有兴趣的读者可以做更深入的研究。

往期推荐阅读

IJCAI 2022 | 量化交易相关论文(附论文链接)

WWW 2022 | 量化交易相关论文(附论文链接)

KDD 2022 | 量化交易相关论文(附论文链接)

解读:通过挖掘概念间共享信息,实现股票趋势预测的图模型框架

解读:机器学习预测收益模型应该采取哪种度量指标

解读:基于订单流、技术分析与神经网络的期货短期走势预测模型

【python量化】大幅提升预测性能,将NSTransformer用于股价预测

【python量化】将Transformer模型用于股票价格预测

【python量化】搭建一个CNN-LSTM模型用于股票价格预测

【python量化】用python搭建一个股票舆情分析系统

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

【python量化】将DeepAR用于股票价格多步概率预测

10828f31fdbd7b5ae4c5b3746247787b.png

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

47bb859176b92c9f07ae1ada4b130311.png

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

eaa0327475980723e9a3a791875020bd.png

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

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

相关文章

MT5 EA交易期货-市价单开仓平仓

该例子演示了EA如何报期货市价单开仓,开仓后10秒钟报市价单平仓。 在外汇交易里没有市价单,而期货交易有市价单, 市价单报单时不指定价格,让交易所自行成交,就是做多无论多贵都买,做空无论多便宜都卖&…

ETF大小盘轮动策略回测分析

从前面的ETF基金定投策略回测和周内效应分析文章中可以看到,代表大盘指数的沪深300ETF基金510300和代表小盘的创业板ETF基金159915的收益在长期来看差别较大。但是单独定投小盘指数收益高,但是回撤比较大;单独定投大盘指数回撤也不小&#xf…

量化基金 获取基金持仓情况;获取优秀基金人气组合持仓基金情况

通过点击显示全部ajax接口加载获取数据 import requests import re from lxml import etree import csvdef get_stock_lists(id):url2 f"https://fundf10.eastmoney.com/FundArchivesDatas.aspx?typejjcc&code{id}&topline10&year2021&month3&rt0…

TensoRT量化第四课:PTQ与QAT

目录 PTQ与QAT注意事项一、2023/5/8更新二、2023/5/12更新前言1. TensorRT量化2. PTQ3. QAT4. QAT实战4.1 环境配置4.2 pytorch_quantization简单示例4.3 自动插入QDQ节点4.4 手动插入QDQ节点4.5 自定义层量化4.6 官方案例 总结 PTQ与QAT 注意事项 一、2023/5/8更新 新增手动…

Vicuna-13B量化模型单GPU可跑

链接在这(需要科学上网) Vicuna-13B: Best Free ChatGPT Alternative According to GPT-4 🤯 | Tutorial (GPU) 有人在B站转了人家的视频 ChatGPT:在你的本地电脑上运行Vicuna-13B 🤯|教程 (GPU) 下面就是部署的步骤…

“Hey Siri” 背后的黑科技大揭秘!

作者 | Vishant Batta 译者 | 苏本如,责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 以下是译文: 如今苹果手机可随时检测并回答“Hey Siri”命令,有人可能会想,它是不是在随时记录我们的日常生活对…

ChatGLM-RM(Reward Model)实现代码逐行讲解

这里我们尝试通过RM训练让模型学会从给定上下文中提取信息,来进行RM模型的实践。你可以从下面链接获取代码 GitHub - Pillars-Creation/ChatGLM-RLHF-LoRA-RM: ChatGLM-6B添加了RLHF的实现,以及部分核心代码的逐行讲解 ,实例部分是做了个新闻短标题的生成…

wochao!chatgpt 真的可以提高我的工作效率!

正确使用指南: https://www.explainthis.io/zh-hant/chatgpt/guidehttps://github.com/PlexPt/awesome-chatgpt-prompts-zh/

小马识途谈如何借助chatGPT提升工作效率

ChatGPT这么聪明会不会大家都要失业了?不用担心!ChatGPT不是跟人来抢饭碗的,是来帮助人提升工作效率的,当然也可以是一个很好的学习工具,小马识途营销顾问认为网络营销从业者可以利用它快速提升自己的能力。 1. 学习新…

优思学院|质量人如何利用ChatGPT提升工作效率?

在许多人知道怎么用ChatGPT之后,不少人开始思考如何利用这个工具来提升自己的工作效率。 质量人也不例外,在质量管理中,有许多重复的任务需要人手去完成。这些任务可能包括检查文档、审查流程、跟踪错误等。这些任务既耗费时间,又…

比起“一键脱衣”,这种 AI 技术更可怕

随着科技的发展,现在出现了许多高科技产品,比如 AI、ChatGPT 等等。 可以说 AI 颠覆了我们的认知,因为许多事情我们都可以交给人工智能去做,比如写程序、写论文、写PPT、绘图等等~ 目前我们打开一些软件后,…

如约而来 | 成功举办T00Ls论坛 “ 群英荟萃论技,共赴振兴网安 ”

沙龙概要 6月10日,在苏州希尔顿酒店T00ls论坛线下技术沙龙苏州站如期举办 。近年来,网络安全问题日益引起人们的关注,全球网络安全形势不断变化。为此,土司论坛联合百达智慧举办了一场以“低调求发展,潜心习安全”为主…

GPT神奇应用:辅助背单词

正文共 993 字,阅读大约需要 3 分钟 外语学习者必备技巧,您将在3分钟后获得以下超能力: 辅助背单词 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | nanako 编辑者 | Linda ●此图片…

Facebook如何安全度过新账号阶段不被封号

Facebook如何安全度过新账号阶段不被封号 今天来说下Facebook如何安全度过新账号阶段不被封号,这个应该是好多朋友都非常关心的问题,因为只有账号不被封后面才能有更多操作,加小组也好,创建主页管理主页也好,推广也好&…

ChatGTP--事务是否生效?

项目场景: 由于最近在做一个项目的cola代码改造,所以由于cola需要在 service 和 dao层中间加一层>>> gateway,和springcloud中的gateway不一样,这个仅仅是抽象了一层; 思考: 现在我的事务 依然在service中开启,那么我的事务经过了一个gateway后,再次调用d…

注册Tinder账号攻略 -- 解决账号被禁

Tinder是世界上最受欢迎的交友APP。每天,在Tinder上注册的左右滑动次数超过16亿次,匹配次数超过3000万次。Tinder的用户量每天都在不断的扩大,流量也自然更大,所以Tinder也成为了很多跨境电商朋友们推广的方式之一。 不过众所周知…

面向知乎的个性化推荐模型研究论文

面向知乎的个性化推荐模型研究 《面向知乎的个性化推荐模型研究》论文是大二暑假完成的,已投到《计算机应用与软件》中文核心期刊。论文主要对知乎提出一种基于混合算法的个性化推荐模型。论文基于用户模型、问题模型、推荐模型构建推荐系统,提出Person…

推荐只需要精确?顶会论文看多样化推荐研究趋势

©作者 | 林子涵 来源 | RUC AI Box 本文主要基于最近 2 年发表在顶级会议(KDD、SIGIR、WWW、CIKM、IJCAI等)的多样化推荐相关论文,介绍最新的研究工作,梳理其背后的技术脉络,同时在最后总结多样化推荐中潜在的研究…

【论文阅读】社交网络传播最大化问题-02

Leader-Based Community Detection Algorithmin Attributed Networks 以往leader-aware算法创新点问题定义定义基础概念定义创新概念 模型构造第一步:确定每个节点的leader第二步:合并小分支以得到最终结果 实验数据集人工合成网络现实世界的网络 基线方…

https://zhuanlan.zhihu.com/p/20397902

首发于 前端外刊评论 关注专栏 登录 写文章 Webpack傻瓜指南(二)开发和部署技巧 张轩 9 个月前 注意啦:如果你还没有看第一篇 请先看下第一篇的基础知识:Webpack傻瓜式指南(一) - 前端外刊评论 - 知乎专栏…