本项目是一个面向沪深300成分股的排序学习选股方案:
StockTransformer,同时建模单股票时序模式与股票间交互;核心目标是学习“当天应优先持有哪些股票”的排序函数,而不是单只股票二分类。
训练与推理主流程如下:
data/stock_data.csv);158+39特征);open_t1 到 open_t5 的相对收益);final_score 并保存最优权重;best_model.pth + scaler.pkl 在最新日期上生成Top5选股结果。统一管理训练与推理参数,包括:
sequence_length(默认60);d_model、nhead、num_layers 等);batch_size、num_epochs、learning_rate);pairwise_weight、top5_weight、base_weight);output/)。定义核心模型 StockTransformer,主要由以下模块组成:
PositionalEncoding:时序位置编码;TransformerEncoder:提取单股票历史序列表示;FeatureAttention:对时间维特征做注意力聚合;CrossStockAttention:在同一交易日内建模股票间关系;ranking_layers + score_head:输出每只股票的排序分数。输入形状:[batch, num_stocks, seq_len, feature_dim]
输出形状:[batch, num_stocks]。
包含特征工程与数据集构建逻辑:
engineer_features_39():39个技术指标特征;engineer_features():158个Alpha类特征;engineer_features_158plus39():合并 158 + 39 特征;create_ranking_dataset_vectorized():向量化构建按日排序样本(训练核心加速点)。说明:特征工程使用了 TA-Lib,若未正确安装会报错。
训练主脚本,关键内容:
_preprocess_common():按股票分组并行特征工程、股票ID映射、标签构建;split_train_val_by_last_month():按最后阶段数据切分训练/验证集,并保留序列上下文。RankingDataset + collate_fn:处理每日股票数量不一致问题(padding + mask)。WeightedRankingLoss
listwise_loss 与 pairwise_loss;calculate_ranking_metrics()
pred_return_sum、max_return_sum、ratio_pred、final_score 等;final_score 选择最优模型。训练产物:
best_model.pth:最佳模型参数;scaler.pkl:标准化器;config.json:训练时配置快照;final_score.txt:最佳分数记录;log/:TensorBoard日志。推理主脚本,流程:
scaler.pkl 进行特征标准化;best_model.pth 对全部可预测股票打分;output.csv:
stock_idweight(固定 0.2)数据抓取脚本(Baostock):
默认训练数据文件:
data/train.csv关键列:
股票代码、日期、开盘、收盘、最高、最低、成交量、成交额、换手率、涨跌幅 等。预测输出文件:
result.csv(由 predict.py 生成)。按你要求的推荐方式如下:
uv 安装依赖uv sync
source .venv/bin/activate
sh train.sh
sh test.sh
TA-Lib 安装失败TA-Lib,需要先安装系统层面的 ta-lib 库,再安装Python包。wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz && \ tar -xzf ta-lib-0.4.0-src.tar.gz && \ cd ta-lib && \ ./configure --prefix=/usr && \ make -j1 && \ make install && \ cd .. && \ rm -rf ta-lib ta-lib-0.4.0-src.tar.gz
多进程相关问题
train.py 与 predict.py 均在入口使用了 spawn 模式,Linux/macOS下请保持通过脚本入口运行(不要在交互式环境里直接多进程调用主逻辑)。
GPU/CPU自动选择
代码会按 CUDA -> MPS -> CPU 顺序自动选择设备;无GPU时可直接CPU运行。