MITSUI&CO. 商品预测挑战赛 - 第 15 名解决方案总结
MITSUI&CO. 商品预测挑战赛 - 第 15 名解决方案总结
概述
本解决方案通过结合在线训练方法、高级特征工程和集成学习,获得了第 15 名的成绩。关键的创新点在于在推理期间每 7 天使用新可用的标记数据重新训练模型,使模型能够适应不断变化的市场条件。
关键创新:推理期间的在线训练
核心思想
与传统使用一次性训练的静态模型或使用时间序列交叉验证的方法不同,本解决方案实施了一种动态训练策略:
- 初始训练: 使用 CombinatorialPurgedGroupKFold 交叉验证在历史数据上训练集成模型,这与我之前在 Kaggle 竞赛中的应用一致。
- 推理阶段: 当新的测试数据到达并变为有标记数据时:
- 将标记样本累积到缓冲区
- 每 7 天(当缓冲区达到 7 个样本时):为集成训练一组新模型(新折叠)。
- 使用最后 7 个样本作为验证集
- 使用更新后的模型进行预测
基本原理
金融市场表现出非平稳行为,模式随时间演变。持续重新训练允许模型适应最近的市场机制变化,并学习商品之间不断演变的 correlations(相关性)。
模型架构
策略模式设计
该解决方案实施了一种灵活的模型策略架构,允许轻松添加/移除模型:
class ModelStrategy(ABC):
@abstractmethod
def build_model(self, input_dim, output_dim)
def train(...)
def predict(...)
这种设计使得能够在保持一致的训练/评估流程的同时,快速尝试不同的架构。
集成模型
结合了三种互补的深度学习架构:
1. 注意力 DNN (Attention DNN)
- 带有注意力机制的多层感知机
- 学习动态关注重要特征
- 架构:1024 → 768 (Attention) → 512 → 384 → 256 → 424 输出
- 自定义排名损失平衡 MSE 和 Spearman 相关性
2. 残差 DNN (Residual DNN)
- 带有跳过连接的深度网络,防止梯度消失
- 两个带有 Add 层的残差块,以改善梯度流
- 在深度架构中训练更稳定
3. 自动编码器 (AutoEncoder)
- 学习压缩表示(128 维潜在空间)
- 多任务学习:重建 + 预测
- 通过瓶颈正则化特征以进行去噪
动态集成加权
集成采用基于性能的加权而不是统一平均:
- 验证评分: 每个模型在 CV 期间的保持折叠上进行评估
- 测试评分: 当标签可用时,模型也在测试集上进行评估
- 自适应权重: 策略权重根据基于排名的评分计算:
ranks = len(scores) - np.argsort(np.argsort(scores)) + 1
weights = ranks / ranks.sum()
4. 折叠级权重: 平衡性能 (α=0.1) 和及时性 (1-α=0.9)
这种双重评估确保在验证和测试数据上表现良好的模型在最终集成中获得更高的权重。
特征工程
高级金融特征 (生成 2,658 个特征)
1. 动量指标
- 变化率 (ROC): 多周期动量 (5, 10, 20 天)
- RSI (相对强弱指数): 超买/超卖信号
- Williams %R: 价格在近期范围内的位置
- CCI (商品通道指数): 与典型价格的偏差
2. 波动率特征
- 历史波动率: 多个范围 (5-60 天)
- Garman-Klass 估计量: 使用 OHLC 进行更好的波动率估计
- 波动率的波动率: 二阶波动率
- 半波动率: 单独的上涨/下跌波动率
- 跳跃变异: 检测价格不连续性
3. 移动平均线与趋势
- SMA/EMA: 多个周期 (5-200 天)
- MACD: 收敛/发散信号
- 布林带: 价格位置和带宽
- 金叉/死叉: 50/200 日均线交叉
4. 市场微观结构
- 成交量动量: 成交量变化率
- Amihud 非流动性: 单位成交量的价格影响
- 成交量趋势: 短期与长期成交量比率
5. 跨市场特征
- 滚动相关性: LME, JPX, US, FX 市场之间 (10-60 天窗口)
- 相关性稳定性: 相关性随时间的方差
- 价差特征: 市场组内的价格差异
- 价差 Z-score: 均值回归信号
- 半衰期: 均值回归速度估计
6. 机制检测
- ADX (平均趋向指数): 趋势强度
- 波动率机制: 短期与长期波动率比较
- 趋势斜率: 线性回归系数
- Hurst 指数: 趋势与均值回归行为
7. 统计矩
- 偏度: 分布不对称性 (尾部风险)
- 峰度: 肥尾检测
- Z-scores: 标准化价格偏差
- 变异系数: 风险调整后收益
特征选择
从 2,658 个工程特征中,使用以下方法选择前 800 个:
- 互信息回归: 捕捉非线性关系
- RobustScaler: 处理金融数据中的异常值
- 在保留预测能力的同时降低维度
训练策略
交叉验证
- CombinatorialPurgedGroupKFold: 5 折分割,1 折测试
- Purging (清除): 防止相邻时间段之间的数据泄漏
- Embargo (禁运): 在训练/测试之间添加缓冲区以考虑自相关性
自定义损失函数
混合排名损失结合:
loss = 0.2 * MSE + 0.8 * (1 - Spearman_Correlation)
- MSE 确保幅度准确性
- Spearman 相关性优化排名(竞赛指标)
- 80% 的权重用于排名,反映了竞赛目标
训练优化
- EarlyStopping: Patience=20,防止过拟合
- ReduceLROnPlateau: 自适应学习率
- 梯度裁剪: 稳定训练 (clipnorm=1.0)
- 批归一化: 加速收敛
局限性与未来工作
问题:特征选择局限性
问题: 特征选择仅使用第一个目标 (target_0) 进行评分,但将选定的特征应用于所有 424 个目标。
影响: 尽管存在此局限性,该解决方案仍获得了第 15 名。正确的多目标特征选择可以提高性能。
更好的方法
- 独立选择每个目标组的特征
- 使用所有目标的平均互信息
- 实施分层特征选择
潜在改进
1. 更好的特征选择:
- 特定目标的特征选择
- 按相关性结构对目标分组
- 特征选择器集成
2. 模型架构
- 添加 Transformer 层进行序列建模
- 实施时间卷积网络
- 多尺度特征提取
3. 持续训练
- 尝试不同的重新训练频率 (3, 5, 10 天)
- 实施增量学习 (更新权重与完全重新训练)
- 使用来自不同时间窗口的模型集成
4. 元学习
- 随时间学习最佳集成权重
- 检测机制变化并相应调整
- 实施自适应特征重要性
结果分析
分数 progression
- 第 1 轮 (公共): 0.134
- 第 2 轮 (私有): 0.110
- 第 3 轮 (私有): 0.445
第 3 轮分析
第 3 轮分数的显著提高 (0.110 → 0.445) 表明:
- 持续训练策略成功适应了最终的测试期
- 模型有效地从推理期间积累的标记数据中学习
- 集成加权方案properly 平衡了近期与历史性能
- 特征工程捕捉了后期不断演变的商品市场动态
替代方案:特定目标的特征工程
开发了一种替代方法,显示出有希望的初步结果,但由于基础设施问题未能在第 3 轮成功完成。
与最终解决方案的关键差异
1. 基于目标对的特征工程
这种方法不使用通用滚动特征,而是使用竞赛提供的 target_pairs.csv 创建目标特征:
- 关系映射: 每个目标映射到元数据中的特定商品对
- 自定义滚动窗口: 窗口大小匹配每个目标对关系指定的滞后值
- 精确特征: 仅针对与每个目标直接相关的列计算滚动均值/标准差
示例:对于与 "JPX_Copper - US_Oil" 相关的目标,特征仅从这些特定工具计算,而不是所有 558 列。
2. 更简单的架构,更频繁的更新
- 轻量级 DNN: 128 → 64 → 32 → 424 (比最终集成小得多)
- 更快的训练: 支持更频繁的重新训练 (每 7 天 vs 最终方案每 7 天)
- 时间加权集成: 近期模型指数加权更高 (1.0 → 1.2 → 1.44...)
3. 性能比较
| 指标 |
特定目标方法 |
最终集成方法 |
| 第 1 轮 (公共) |
0.196 |
0.134 |
| 第 2 轮 (私有) |
0.357 |
0.110 |
| 第 3 轮 (私有) |
失败 |
0.445 |
| 内存使用 |
较低 |
较高 |
失败原因
特定目标方法最初优于基线 (第 1 轮 0.196 vs 0.134),但最终未完成。失败的可能原因似乎是:
- 基础设施脆弱性: 较轻量的管道可能更容易受到 Kaggle 推理 API 不稳定的影响。
- 内存限制: 滚动窗口计算需要保留不断增长的历史数据,这可能随时间超过了可用内存限制。
- 缺乏 robust 检查点: 与加载预训练模型的最终解决方案不同,此方法完全依赖于推理期间的训练,如果中断没有明确的恢复路径。
经验教训
这段经历突出了在生产 ML 系统中稳健性优于原始性能的关键重要性:
- 防御性编程: 始终为推理失败实施 fallback 机制
- 内存管理: 监控并限制历史数据积累
- 模型检查点: 预训练稳定的基础模型以避免冷启动场景
- 大规模测试: 本地验证无法捕捉所有生产边缘情况
值得注意的是,许多参与者在第 3 轮经历了类似的失败。虽然令人失望,但这代表了关于在受限环境中部署自适应模型挑战的宝贵学习机会。
未来 iterations 的此竞赛将受益于增强的管道稳定性以支持在线学习方法 — 问题领域非常迷人,如果给定更 robust 的基础设施来操作,在线学习方法显示出巨大的希望。
结论
这项工作证明了自适应学习策略对于非平稳金融时间序列预测的有效性,在竞争激烈的领域中获得第 15 名。核心贡献在于实现在线训练框架,该框架在推理期间持续集成新标记数据,使模型能够在 9 个月的预测范围内跟踪不断演变的市场动态。
实验结果验证了几个关键假设。首先,定期模型重新训练(每 7 天)显著提高了预测性能,正如从第 2 轮 (0.110) 到第 3 轮 (0.445) 的分数大幅提高所证明的那样。其次,集成多样性—结合基于注意力、残差和自动编码器架构—被证明比依赖单一模型类更 robust。第三,涵盖动量、波动率、微观结构和跨市场动态的全面特征工程提供了比仅基于价格的特征更丰富的信号。
确定的局限性,特别是单目标特征选择策略,指出了未来工作的具体方向。特定目标或基于组的特征选择可以进一步提高性能,最佳重新训练频率和增量学习方法的调查也是如此。轻量级特定目标方法的比较分析,虽然最终由于基础设施限制未成功,但强调了生产机器学习中稳健性和容错性的关键重要性—这些教训远远超出了竞赛 setting。
更广泛地说,该解决方案强化了这样一个原则:在金融预测中,模型适应性可能与初始模型复杂性一样重要。随着市场机制的转变,从最近数据中持续学习的能力提供了优于静态方法的可持续优势。此处提出的方法—动态集成加权、清除交叉验证和混合排名损失函数—为涉及具有明确排名目标的非平稳时间序列的类似问题提供了模板。
完整的实现可在引用的 Kaggle notebook 中找到,为寻求将在线学习技术应用于商品价格预测和相关金融预测任务的 practitioners 提供了可重现的基础。
关键要点
- 在线学习有效: 每 7 天重新训练允许适应市场变化
- 集成多样性: 结合注意力、残差和自动编码器架构捕捉不同模式
- 特征工程很重要: 2,658 个高级金融特征提供丰富信号
- 稳健缩放: RobustScaler 处理商品数据中常见的异常值