欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > 基于Transformer的多资产收益预测模型实战(附PyTorch实现与避坑指南)

基于Transformer的多资产收益预测模型实战(附PyTorch实现与避坑指南)

2025/5/12 15:26:46 来源:https://blog.csdn.net/deepever/article/details/147771130  浏览:    关键词:基于Transformer的多资产收益预测模型实战(附PyTorch实现与避坑指南)

基于Transformer的多资产收益预测模型实战(附PyTorch模型训练及可视化完整代码)


一、项目背景与目标

在量化投资领域,利用时间序列数据预测资产收益是核心任务之一。传统方法如LSTM难以捕捉资产间的复杂依赖关系,而Transformer架构通过自注意力机制能有效建模多资产间的联动效应。
本文将从零开始构建一个基于PyTorch的多资产收益预测模型,涵盖数据生成、特征工程、模型设计、训练及可视化全流程,适合深度学习与量化投资的初学者入门。

二、核心技术栈

  • 数据处理:Pandas/Numpy(数据生成与预处理)
  • 深度学习框架:PyTorch(模型构建与训练)
  • 可视化:Matplotlib(结果分析)
  • 核心算法:Transformer(自注意力机制)

三、数据生成与预处理

1. 模拟金融数据生成

我们通过以下步骤生成包含5只资产的时间序列数据:

  • 市场基准因子:模拟市场整体趋势(几何布朗运动)
  • 行业因子:引入周期性波动区分不同行业(如科技、消费、能源)
  • 特质因子:每只资产的独立噪声
def generate_market_data(days=2000, n_assets=5):  np.random.seed(42)  market = np.cumprod(1 + np.random.normal(0.0003, 0.015, days))  # 市场基准  assets = []  sector_map = {0: "Tech", 1: "Tech", 2: "Consume", 3: "Consume", 4: "Energy"}  for i in range(n_assets):  sector_factor = 0.3 * np.sin(i * 0.8 + np.linspace(0, 10 * np.pi, days))  # 行业周期因子  idiosyncratic = np.cumprod(1 + np.random.normal(0.0002, 0.02, days))  # 特质因子  price = market * (1 + sector_factor) * idiosyncratic  # 价格合成  assets.append(price)  dates = pd.date_range("2015-01-01", periods=days)  return pd.DataFrame(np.array(assets).T, index=dates, columns=[f"Asset_{i}" for i in range(n_assets)])  

2. 数据形状说明

生成的DataFrame形状为[2000天, 5资产],索引为时间戳,列名为Asset_0到Asset_4。

四、特征工程:从价格到可训练数据

1. 基础时间序列特征

为每只资产计算以下特征:

  • 收益率(Return):相邻日价格变化率
  • 波动率(Volatility):20日滚动标准差年化
  • 移动平均(MA10):10日价格移动平均
  • 行业相对强弱(Sector_RS):资产价格与所属行业平均价格的比值
def create_features(data, lookback=60):  n_assets = data.shape[1]  sector_map = {0: "Tech", 1: "Tech", 2: "Consume", 3: "Consume", 4: "Energy"}  features = []  for i, asset in enumerate(data.columns):  df = pd.DataFrame()  df["Return"] = data[asset].pct_change()  df["Volatility"] = df["Return"].rolling(20).std() * np.sqrt(252)  # 年化波动率  df["MA10"] = data[asset].rolling(10).mean()  # 计算行业相对强弱  sector = sector_map[i]  sector_cols = [col for col in data.columns if sector_map[int(col.split("_")[1])] == sector]  df["Sector_RS"] = data[asset] / data[sector_cols].mean(axis=1)  features.append(df.dropna())  # 去除NaN  # 对齐时间索引  common_idx = features[0].index  for df in features[1:]:  common_idx = common_idx.intersection(df.index)  features = [df.loc[common_idx] for df in features]  # 构建3D特征张量 [样本数, 时间步, 资产数, 特征数]  X = np.stack([np.stack([feat.iloc[i-lookback:i] for i in range(lookback, len(feat))], axis=0) for feat in features], axis=2)  # 标签:未来5日平均收益率  y = np.array([data.loc[common_idx].iloc[i:i+5].pct_change().mean().values for i in range(lookback, len(common_idx))])  return X, y  

2. 输入输出形状

  • 特征张量X形状:[样本数, 时间步(60), 资产数(5), 特征数(4)]
  • 标签y形状:[样本数, 资产数(5)](每个样本对应5只资产的未来5日平均收益率)

五、Transformer模型构建:核心架构解析

1. 模型设计目标

  • 处理多资产时间序列:同时输入5只资产的历史数据
  • 捕捉时间依赖资产间依赖:通过位置编码和自注意力机制
  • 输出多资产收益预测:回归问题,使用MSE损失

2. 关键组件解析

(1)资产嵌入层(Asset Embedding)

将每个资产的4维特征映射到64维隐空间:

self.asset_embed = nn.Linear(n_features=4, d_model=64)  

输入形状:(batch, seq_len, assets, features) → 输出:(batch, seq_len, assets, d_model)

(2)位置编码(Positional Embedding)

由于Transformer无内置时序信息,需手动添加位置编码:

self.time_pos = nn.Parameter(torch.randn(1, lookback=60, 1, d_model=64))  # 时间位置编码  
self.asset_pos = nn.Parameter(torch.randn(1, 1, n_assets=5, d_model=64))  # 资产位置编码  
  • 通过广播机制与资产嵌入相加,分别捕获时间和资产维度的位置信息。
(3)自定义Transformer编码器层(Custom Transformer Encoder Layer)

继承PyTorch原生层,返回注意力权重以可视化:

class CustomTransformerEncoderLayer(nn.TransformerEncoderLayer):  def __init__(self, d_model, nhead, dim_feedforward=256, dropout=0.1):  super(

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词