精华帖子

基于Transformer模型的选股策略

由bq20kttn创建,最终由bq20kttn 被浏览 25 用户

一、Transformer模型

Transformer最初发布是用于时序任务和NLP任务,在近年来也有不少Transformer在CV应用比较出色的研究,我们有理由相信Transformer也可以应用于量化投资领域。

Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年首次提出。Transformer架构引入了自注意力机制,这是一个关键的创新,使其在处理序列数据时表现出色。

以下是Transformer的一些重要组成部分和特点:

自注意力机制(Self-Attention):这是Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。

多头注意力(Multi-Head Attention):Transformer中的自注意力机制被扩展为多个注意力头,每个头可以学习不同的注意权重,以更好地捕捉不同类型的关系。多头注意力允许模型并行处理不同的信息子空间。

堆叠层(Stacked Layers):Transformer通常由多个相同的编码器和解码器层堆叠而成。这些堆叠的层有助于模型学习复杂的特征表示和语义。

位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。

残差连接和层归一化(Residual Connections and Layer Normalization):这些技术有助于减轻训练过程中的梯度消失和爆炸问题,使模型更容易训练。

编码器和解码器:Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。

二、Transformer的结构与作用原理

Transformer的架构详解:

上图展示了 Transformer 的两个主要部分:编码器 (Encoder) 栈(左侧)和解码器 (Decoder) 栈(右侧)。编码器将输入词元转换为富含上下文信息的嵌入,而解码器则自回归地生成输出词元。每个栈都由 N 个相同的层堆叠而成(例如,N 可以是 6, 12, 24…),以增加模型的深度。

其工作流程可以概括为: 输入词元 → 输入嵌入 + 位置编码 → 编码器层 (自注意力 + 前馈网络) → 编码器输出 解码器接收偏移的输出嵌入 + 位置编码 → 掩码自注意力 → 编码器-解码器注意力 → 前馈网络 → 线性层 → Softmax → 输出词元概率

简略结构(每一个编码器都对应上图的一个encoder结构):

Transformer的编码组件是由6个编码器叠加在一起组成的,解码器同样如此。所有的编码器在结构上是相同的,但是它们之间并没有共享参数。编码器的简略结构如下:


Encoder 编码器

· Transformer中的编码器部分一共6个相同的编码器层组成。

· 每个编码器层都有两个子层,即多头自注意力层和逐位置的前馈神经网络。在每个子层后面都有残差连接和层归一化操作。

  1. 多头自注意力机制 (Multi-Head Self-Attention):允许输入序列中的每个词元关注所有其他词元,从而计算出每个词元对于理解当前词元的重要性。这帮助模型捕捉整个序列中的复杂关系,例如“谁对谁做了什么”。
  2. 位置前馈网络 (Position-wise Feed-Forward Network):独立地处理每个词元更新后的表示,对其进行非线性变换和特征提炼。

Decoder 解码器

Transformer中的解码器部分同样有6个相同的解码器层组成。

每个解码器层都有三个子层,掩码自注意力层、Encoder-Decoder自注意力层、逐位置的前馈神经网络。同样,在每个子层后面都有残差连接和层归一化操作。

  1. 掩码多头自注意力 (Masked Multi-Head Self-Attention):在这一部分,解码器中的每个词元只能“看到”它自己及之前位置的词元。这是通过一个“前瞻掩码 (look-ahead mask)” 实现的,它阻止模型在生成当前词时偷看未来的词,确保了文本是按顺序一步步生成的。
  2. 编码器-解码器注意力 (Encoder-Decoder Attention):也称为交叉注意力。解码器的查询 (Query) 来自其前一层的输出,而键 (Key) 和值 (Value) 则来自编码器的最终输出。这种机制让解码器在生成每个输出词元时,能够聚焦于输入句子中最相关的部分。
  3. 位置前馈网络:与编码器层类似,用于进一步处理和提炼每个词元的表示。


Encoder-Decoder模型

encoder-decoder模型是为了应对 RNN 中无法满足不等长序列的输入输出而产生的一个 RNN 变种。encoder-decoder是深度学习中非常常见的一个模型框架,比如无监督算法的 auto-encoder 就是用编码的结构设计并训练的,再比如神经网络机器翻译NMT模型,往往就是LSTM-LSTM的编码-解码框架。

准确的说,encoder-decoder并不是一个具体的模型,而是一类框架。Encoder和Decoder部分可以是任意的文字,语音,图像,视频数据,模型可以采用CNN,RNN,BiRNN,LSTM,GRU等等。其中,encoder对数据进行编码,decoder对encoder生成的编码进行解码。

encoder先将输入数据编码成一个上下文向量c;

拿到 c 后,就用另一个 RNN 网络对其进行解码,这部分 RNN 网络被称为 Decoder,具体的做法就是将 c 当作之前的初始化状态 h0 输入到 Decoder 中。


在 encoder-decoder 结构中,encoder把所有的输入序列都编码成一个统一的语义特征 c 再解码,因此,c 中必须包含原始序列中的所有信息,它的长度就变成了限制模型性能的瓶颈,如机器翻译问题,当要翻译的句子较长时,一个 c 可能存不下那么多信息,就会造成翻译精度的下降。

Attention机制通过在每个时间输入不同的 c 来解决这个问题,以我爱中国为例,下面是带有 Attention 机制的 Decoder:

每一个 c 会自动去选取与当前所要输出的 y 最合适的上下文信息。具体来说,我们用 aij 衡量 encoder 中第 j 阶段的 hj 和解码时第 i 阶段的相关性,最终 decoder 中第 i 阶段的输入的上下文信息 ci,就来自于所有 hj 对 aij 的加权和。这里的 aij 就是我们要学习的参数。

通过计算 encoder 和 decoder state 之间的关联性的权重,得到 Attention 分布,从而对于当前输出位置得到比较重要的输入位置的权重,在预测输出时相应的会占较大的权重。通过 Attention 机制,我们打破了只能利用 encoder 最终单一向量(即只能利用一个 c )结果的限制,从而使模型可以集中在所有对于下一个目标单词重要的输入信息上,使模型效果得到极大的改善。并且,通过观察 attention 权重矩阵的变化,可以更好地知道哪些部分翻译对应哪部分源文字,有助于更好地理解模型工作机制。

Attention一般都使用 Attention(Q, K, V) 来进行表示。其中,Q表示 Decoder 的(上一次)隐状态,K 表示 Encoder 中的隐状态,V表示 Encoder 的输入。

\

三、策略流程步骤

1. 数据准备与预处理

(1)训练数据准备(2022.01.01-2024.12.31)

数据范围:全市场非 ST、非停牌、无风险警示、上市板块类型(list_sector)小于 3、流通市值超 5 亿且上市满 252 天的 A 股股票,确保样本具备足够的流动性与交易可行性。

特征工程:构建量价类、统计类、相关系数类三类共 98 个核心特征。其中量价类特征包含当日及滞后 1-4 期的收盘价、开盘价、最高价、最低价、成交额、换手率、收益率等;统计类特征包含 5 日维度的均值、最大值、最小值、标准差、滚动排名、线性衰减值等;相关系数类特征包含成交量与收益率 / 价格指标、各类价格指标之间的 5 日相关系数。

特征预处理:对所有特征执行空值剔除操作(QUALIFY COLUMNS (*) IS NOT NULL),并通过 c_normalize 函数完成特征归一化,消除量纲差异;同时剔除特征列中存在空值的样本,保证训练数据的完整性。

标签定义:以股票未来 5 日收益率(m_lead (close, 5) /m_lead (open, 1) - 1)作为模型训练标签,为避免极端值干扰,对标签执行 1% 和 99% 分位数的极值截断处理,建立特征与未来收益的映射关系。

\n(2)测试数据准备(2025.01.01-2025.12.22)

特征数据:与训练阶段保持完全一致的 98 个核心特征,确保数据口径统一;仅剔除 date、instrument 字段外的空值样本,无标签数据。

特征预处理:基于训练集拟合的归一化规则对测试集特征进行标准化处理,严格规避数据泄露问题,保证测试阶段的客观性。

\n2. 模型训练与预测

(1)模型训练参数

模型类型:基于 Transformer 编码器结构的回归模型,仅保留编码器模块适配股票收益预测的单序列特征分析场景,核心包含输入映射层、可学习位置编码层、多头注意力编码器层、输出全连接层。

核心参数:

TRANSFORMER_PARAMS = {
    "input_dim": 98,        # 输入特征维度(98个量化特征)
    "d_model": 128,         # Transformer内部特征维度
    "nhead": 8,             # 多头注意力头数
    "num_layers": 3,        # Transformer编码器层数
    "dropout": 0.1,         # Dropout比例
    "lr": 0.0005,           # 初始学习率
    "weight_decay": 0.01,   # 权重衰减系数(AdamW优化器)
    "T_max": 30,            # 学习率调度器周期
    "eta_min": 1e-6,        # 最小学习率
    "max_norm": 1.0,        # 梯度裁剪最大范数
    "patience": 5,          # 早停机制容忍轮数
    "epochs": 30            # 最大训练轮数
}

优化器与损失函数:采用 AdamW 优化器(带权重衰减),损失函数为均方误差损失(MSELoss);学习率调度采用余弦退火策略(CosineAnnealingLR),并通过梯度裁剪(max_norm=1.0)防止梯度爆炸;引入早停机制(patience=5),验证损失连续 5 轮未下降则终止训练,保存最优模型。\n(2)收益率预测

将测试阶段预处理后的 98 维特征数据转换为张量输入训练完成的 Transformer 模型,模型以评估模式(eval ())运行,通过 torch.no_grad () 关闭梯度计算,输出每只股票未来 5 日收益率的预测值。

3. 选股与交易执行

选股规则:基于每日收益率预测值,筛选排名前 20 的股票构建持仓组合,仅保留当日有有效特征数据的股票样本。

调仓周期:每 5 个交易日调仓一次

仓位管理:目标持仓 20 只股票,等权分配仓位

交易成本:买入成本 0.01%,卖出成本 0.08%(最低 5 元)

基准指数:沪深 300 指数(000300.SH)

四、回测结果



策略源码:



\

标签

量化投资选股策略
{link}