1. 项目概述
在量化投资领域,股票收益率预测一直是一个极具挑战性的课题。传统的预测方法往往依赖于人工特征工程和模型调参,不仅效率低下,而且难以适应市场的变化。我们基于PaddleTS框架开发了一套股票日收益率预测AutoML系统,通过自动化机器学习技术,实现了从数据预处理到模型选择的全流程优化。
这套系统最大的特点在于:
- 集成了17种不同类型的时间序列预测模型
- 采用Optuna超参数优化框架进行自动化调参
- 支持多进程并行计算和断点续传功能
- 针对A股市场特点进行了专门优化
目前系统已经在500只A股股票上进行了测试(已完成247只),结果显示Informer模型在54.7%的股票上表现最优,平均MAE达到0.5986%,显著优于其他模型。
2. 系统架构设计
2.1 整体架构
我们的AutoML系统采用分层设计,主要包含四个核心模块:
code复制┌─────────────────────────────────────────────────────────────┐
│ Stock AutoML System │
├─────────────────────────────────────────────────────────────┤
│ 数据层: 股票CSV数据 → 特征工程 → TSDataset │
├─────────────────────────────────────────────────────────────┤
│ 模型层: 17种PaddleTS模型 (线性/RNN/Transformer/高级) │
├─────────────────────────────────────────────────────────────┤
│ 优化层: Optuna TPE采样 + Percentile剪枝 │
├─────────────────────────────────────────────────────────────┤
│ 执行层: 4进程并行 + Checkpoint断点续传 │
└─────────────────────────────────────────────────────────────┘
这种分层架构的设计考虑到了:
- 数据处理与模型训练的分离,提高代码可维护性
- 模型池的扩展性,可以方便地添加新模型
- 优化过程的独立性,便于尝试不同的超参数搜索算法
- 执行效率的优化,充分利用计算资源
2.2 数据处理流程
2.2.1 数据来源与预处理
我们使用的A股日线数据包含5371只股票的历史交易数据。原始数据包含开盘价、收盘价、最高价、最低价、成交量等基础字段。预测目标是日收益率,计算公式为:
python复制df['target'] = df['close'].pct_change() * 100
为了保证数据质量,我们进行了以下筛选:
- 仅保留交易日≥500天的股票
- 剔除ST股票和流动性较差的股票
- 处理异常值和缺失值
2.2.2 数据分割策略
为了评估模型的泛化能力,我们将数据按时间顺序分为三部分:
- 训练集:70%(用于模型训练)
- 验证集:15%(用于超参数优化)
- 测试集:15%(用于最终评估)
这种分割方式模拟了实际投资中的滚动预测场景,避免了未来信息泄露的问题。
3. 特征工程详解
3.1 技术指标构建
我们构建了8个技术指标作为模型的协变量,这些指标涵盖了价格、成交量、动量等多个维度:
| 特征 | 计算方法 | 含义 |
|---|---|---|
| ma_diff | (close - MA5) / MA5 | 均线偏离度 |
| vol_ratio | vol / MA5(vol) | 成交量比 |
| macd | (EMA12 - EMA26) / close | MACD指标 |
| rsi | gain / (gain + loss) | 相对强弱指数 |
| boll_pos | (close - mid) / (2×std) | 布林带位置 |
| volatility | std(pct_change, 10) | 10日波动率 |
| momentum | pct_change(5) | 5日动量 |
| price_pos | (close - low20) / (high20 - low20) | 价格位置 |
3.2 特征处理技巧
为了避免未来信息泄露,我们对所有特征进行了shift(1)操作,确保模型在预测t时刻的收益率时,只能使用t-1时刻及之前的信息。
此外,我们还进行了以下处理:
- 标准化:将所有特征缩放到相近的数值范围
- 缺失值填充:使用前向填充处理缺失值
- 异常值截断:对±3σ之外的值进行截断处理
提示:特征工程是量化模型成功的关键。我们发现ma_diff和vol_ratio这两个特征对预测效果提升最为明显,可能是因为它们能有效捕捉股票的趋势和流动性变化。
4. 模型池设计与实现
4.1 模型分类与选择
我们集成了PaddleTS框架中的17种时间序列预测模型,涵盖了从简单线性模型到复杂Transformer架构的多种方法:
4.1.1 线性模型(3种)
- NLinear:归一化线性模型
- DLinear:分解线性模型
- RLinear:残差线性模型
4.1.2 基础神经网络(4种)
- MLP:多层感知机
- LSTM:长短期记忆网络
- TCN:时序卷积网络
- LSTNet:长短期时序网络
4.1.3 Transformer系列(4种)
- Transformer:标准Transformer
- Informer:高效长序列Transformer
- PatchTST:补丁时序Transformer
- TFT:时序融合Transformer
4.1.4 高级模型(6种)
- TimesNet:时序网络
- NBEATS:神经基扩展分析
- NHiTS:分层插值时序
- SCINet:采样卷积交互网络
- DeepAR:自回归深度学习
4.2 模型实现细节
以表现最优的Informer模型为例,我们采用了以下配置:
- 编码器层数:2层
- 解码器层数:1层
- 注意力头数:8头
- 模型维度:512
- ProbSparse注意力机制
- 自注意力蒸馏结构
这些配置在保证模型性能的同时,也控制了计算复杂度,使得模型能够在合理的时间内完成训练。
5. AutoML优化策略
5.1 超参数搜索空间
我们定义了以下搜索空间,覆盖了模型结构、训练参数等多个维度:
python复制{
'model': [17种模型],
'in_chunk_len': [10, 20, 30], # 输入序列长度
'out_chunk_len': [1, 3, 5], # 预测步长
'batch_size': [64, 128],
'learning_rate': [5e-4, 1e-3, 2e-3],
'epochs': [12, 15]
}
这个搜索空间的设计考虑了:
- 输入序列长度:覆盖短期、中期记忆需求
- 预测步长:支持单日和多日预测
- 批次大小:平衡内存使用和训练稳定性
- 学习率:适配不同模型的优化需求
- 训练轮数:防止过拟合的同时保证充分训练
5.2 优化算法配置
我们采用TPE(Tree-structured Parzen Estimator)作为采样器,配合PercentilePruner进行早停剪枝:
- 采样器:TPE
- 适用于高维、离散的搜索空间
- 能够有效处理不同超参数之间的依赖关系
- 剪枝器:PercentilePruner
- percentile=50
- n_startup_trials=5
- 在验证集MAE低于前50%时停止训练
每只股票进行50次trials,确保充分探索搜索空间。
5.3 评估指标选择
我们选择MAE(Mean Absolute Error)作为主要评估指标,原因在于:
- 对异常值不敏感,更适合金融数据
- 解释性强,直接反映预测误差的绝对值
- 与投资决策的损失函数更匹配
计算公式为:
code复制MAE = mean(|y_true - y_pred|)
6. 工程实现与优化
6.1 内存管理
在长时间运行的大规模实验中,内存管理至关重要。我们采取了以下措施:
- 显式垃圾回收:
python复制gc.collect() # 每次trial后主动回收
- GPU缓存清理:
python复制paddle.device.cuda.empty_cache() # 清理GPU缓存
- 及时释放资源:
python复制del model # 模型及时删除释放资源
6.2 断点续传机制
为了应对可能的中断情况,我们实现了完善的断点续传功能:
- 使用
imap_unordered实现边跑边保存 - 每完成一只股票立即写入checkpoint
- 支持从中断点恢复,避免重复计算
6.3 并行计算优化
我们采用多进程并行处理来加速实验:
- 4进程并行处理
- 使用spawn方式启动子进程
- 进程间隔离,避免资源竞争
这种配置在NVIDIA RTX 3090 (24GB) GPU和251GB内存的服务器上表现良好,单个股票的优化时间控制在480秒以内。
7. 实验结果分析
7.1 整体表现
在已完成的247只股票上,系统取得了以下整体表现:
| 指标 | 值 |
|---|---|
| MAE 均值 | 0.6358% |
| MAE 中位数 | 0.6306% |
| MAE 最小值 | 0.1635% |
| MAE 最大值 | 1.1827% |
| MAE 标准差 | 0.1708% |
这些结果表明:
- 系统在不同股票上的预测效果存在差异
- 大部分股票的MAE集中在0.5%-0.8%之间
- 极值股票值得进一步分析
7.2 模型表现排名
各模型的表现对比如下:
| 排名 | 模型 | 选中次数 | 占比 | 平均MAE |
|---|---|---|---|---|
| 1 | Informer | 135 | 54.7% | 0.5986% |
| 2 | LSTM | 47 | 19.0% | 0.6467% |
| 3 | Transformer | 20 | 8.1% | 0.6866% |
| 4 | MLP | 14 | 5.7% | 0.6837% |
| 5 | NBEATS | 12 | 4.9% | 0.7487% |
| 6 | DLinear | 10 | 4.0% | 0.6223% |
| 7 | LSTNet | 4 | 1.6% | 0.7182% |
| 8 | RLinear | 3 | 1.2% | 0.8966% |
| 9 | NLinear | 2 | 0.8% | 0.8783% |
从表中可以看出:
- Informer表现最为突出,在超过一半的股票上表现最优
- LSTM作为传统时序模型仍具竞争力
- DLinear虽然简单,但表现意外地好
- 纯线性模型(NLinear/RLinear)表现较差
7.3 最优股票案例分析
表现最好的20只股票及其最优模型:
| 排名 | 股票代码 | 最优模型 | MAE |
|---|---|---|---|
| 1 | 000520.SZ | Informer | 0.1635% |
| 2 | 000670.SZ | Informer | 0.1726% |
| 3 | 000012.SZ | DLinear | 0.3253% |
| ... | ... | ... | ... |
分析这些股票的特点发现:
- 多为流动性较好的大盘股
- 价格波动相对稳定
- 成交量充足,市场信息充分
7.4 超参数分布分析
7.4.1 输入序列长度
| 长度 | 选中次数 | 占比 |
|---|---|---|
| 10天 | 96 | 38.9% |
| 20天 | 88 | 35.6% |
| 30天 | 63 | 25.5% |
结果表明:
- 短期历史数据(10-20天)更为有效
- 过长历史可能引入噪声
7.4.2 预测步长
| 步长 | 选中次数 | 占比 |
|---|---|---|
| 1天 | 104 | 42.1% |
| 5天 | 77 | 31.2% |
| 3天 | 66 | 26.7% |
这说明:
- 单日预测最为可靠
- 多步预测难度显著增加
8. 深度分析与讨论
8.1 Informer的成功因素
Informer模型之所以表现优异,主要归功于以下几个设计:
-
ProbSparse Self-Attention
- 将标准注意力复杂度从O(L²)降至O(L log L)
- 通过测量查询和键的相似度分布,只计算重要的注意力对
- 特别适合处理长序列的股票数据
-
Self-Attention Distilling
- 通过卷积和最大池化逐步压缩特征
- 提取更本质的时序模式,过滤噪声
- 在编码器中实现了层次化的特征学习
-
Generative Decoder
- 一次性生成全部预测序列
- 避免了自回归模型的误差累积问题
- 预测结果更加稳定可靠
8.2 模型复杂度与效果的关系
我们发现模型复杂度与预测效果并非简单的正相关关系:
-
高级Transformer模型(如Informer)
- 在大部分股票上表现最好
- 但对计算资源要求较高
- 需要足够的数据支持
-
传统RNN模型(如LSTM)
- 实现简单,训练速度快
- 对短期模式捕捉能力强
- 但长期依赖建模能力有限
-
线性模型(如DLinear)
- 计算效率最高
- 在部分股票上表现优异
- 但表达能力有限
经验分享:在实际应用中,我们建议先尝试Informer,如果效果不理想再考虑LSTM或DLinear。对于资源有限的环境,DLinear是一个不错的折中选择。
8.3 未被选中模型分析
以下模型在247次评估中从未被选为最优:
- TCN, PatchTST, TFT, TimesNet, NHiTS, SCINet, DeepAR
可能的原因包括:
- 参数敏感:这些模型通常需要更精细的超参数调优
- 数据需求:部分高级模型需要更大规模的数据
- 任务适配:某些模型设计用于特定场景(如概率预测)
- 实现限制:如SCINet对输入长度有特殊要求(必须是2^n)
9. 实践建议与部署方案
9.1 模型选择策略
基于实验结果,我们推荐以下优先级:
python复制Informer > LSTM > DLinear > Transformer > NBEATS
具体建议:
- 对新股票优先尝试Informer
- 如果训练时间受限,考虑LSTM
- 对预测效果要求不高但需要快速响应的场景,使用DLinear
9.2 推荐参数配置
对于大多数A股股票,以下配置表现良好:
python复制{
'in_chunk_len': 10或20,
'out_chunk_len': 1,
'batch_size': 128,
'learning_rate': 1e-3,
'epochs': 12
}
9.3 部署注意事项
- 数据更新:确保使用最新的市场数据
- 模型重训练:建议每周或每月重新训练模型
- 监控机制:建立预测效果的实时监控
- 风险控制:不要过度依赖模型预测,应结合其他分析手段
10. 未来优化方向
基于当前实验结果,我们认为以下方向值得进一步探索:
-
集成学习
- 结合多个模型的预测结果
- 例如使用Informer、LSTM和DLinear的加权平均
-
特征扩展
- 加入基本面数据(PE、PB等)
- 整合市场情绪指标(新闻情感分析等)
- 考虑宏观经济指标的影响
-
模型解释性
- 可视化Informer的注意力权重
- 分析模型关注的关键时间点
- 增强模型的可解释性和可信度
-
在线学习
- 实现增量式模型更新
- 快速适应市场变化
- 减少全量重训练的成本
-
风险控制整合
- 结合预测不确定性进行仓位管理
- 开发基于预测的止损策略
- 优化风险调整后收益
在实际操作中,我们发现这套AutoML系统虽然自动化程度很高,但仍需要人工监督和干预。特别是在模型选择和参数调优阶段,结合领域知识的判断往往能带来额外的提升。建议使用者不要完全依赖自动化结果,而应该把系统作为辅助工具,结合自己的市场理解做出最终决策。