返回列表

3rd place solution

486. G-Research Crypto Forecasting | g-research-crypto-forecasting

开始: 2021-11-02 结束: 2022-05-03 量化投资 数据算法赛
第三名方案

第三名方案

作者:sugghi
比赛排名:第3名

首先,我要感谢 G-Research、Kaggle 和所有的参赛者。通过这次有趣的比赛,我学到了很多东西。这对我来说非常困难(实际上,这是我人生中的第三次机器学习挑战),如果没有所有 Kaggle 参与者分享的知识,我无法应对这次挑战。

此外,由于这是一个运气成分很强的比赛,我能获得第三名纯属侥幸,但我很高兴我的排名在最后的几次更新中保持相对稳定。

在编码方面,我参考了 Kaggle 参与者的知识。我要特别感谢 @jagofc 提供的 local api。如果没有 @jagofc 的本地 API,我甚至无法成功提交一次。

这是我的解决方案。如果您有任何改进建议或认为我应该知道的其他事项,我很乐意听取您的意见!

模型概述

我的模型具有以下特点:

  • 仅使用了 'Close'(收盘价)数据。
  • 使用所有货币通用的一组特征,对每种货币分别训练模型。
  • 将每种货币的变化与所有货币变化的差值作为特征。
  • 单一 LightGBM 模型(7折交叉验证)。

考虑到本次比赛预测目标的定义,我觉得有必要准备包含整个市场信息的特征。我还认为某些货币可能会受到其他货币走势的影响,因此我也设法参考其他货币的信息。由于我认为这种处理会增加内存和推理时间的负担,我减少了使用的数据量。具体来说,我认为用于计算目标的 'Close' 最重要,因此决定只使用它。即便如此,由于推理时间有限(以及编码技能不足),无法进行模型集成。

对于交叉验证 (CV),我使用了 @nrcjea001EmbargoCV

关于训练数据

不同货币的训练数据开始日期差异很大。由于我的模型处理的是每种货币变化的平均值,我认为训练期和评估期之间现有货币的差异过大是不理想的。由于我预计在比赛评估期间所有货币的缺失值很少,我决定不使用所有训练数据,而是使用货币数量足够多的时期的数据。

起始日期的选择是通过查看 CV 分数决定的。然而,事后看来这是一个错误,因为这意味着我在比较不同数据的 CV 分数。

此外,每种货币都有几个长短不一的空白期。我尝试通过前向填充来防止滚动操作导致的数据缺失。另一方面,我认为在整个时期进行前向填充可能会在空白期较长时导致数据质量下降,因此我对前向填充设置了限制。在评估阶段,代码设计为无限制的前向填充,但我认为这不会造成问题,因为评估阶段没有很长的空白期。

特征工程

由于加密货币的价值在增加,我试图确保提取出独立于评估时期的变动幅度。

对于 'Close',我为多个滞后周期准备了两个特征:当前值与期间平均值的比率的对数,以及当前值与特定周期前值的比率的对数。对于这些特征,我取了所有货币的平均值(由于数据缺失,未进行加权平均)。此外,每种货币与所有货币平均值之间的差异也被作为一个特征。结果证明,这个特征效果很好。

应对时间限制

对我来说最困难的部分是时间限制。执行推理时,只生成一行特征应该就足够了,但我的编程技能不允许我很好地做到这一点,所以我放弃了这一点,生成了所有数据的特征。因此,我尽量避免使用 pandas 来加速处理,并设法在 9 小时内完成了推理。老实说,我对最终更新时的超时非常担心。

如果有更多时间我会做的事情

  • 加快特征生成速度以节省时间并进行模型集成。
  • 使用缺失数据较少的数据进行学习(外部数据?)。
  • 参数优化。
    第一次成功提交是在比赛结束前一周,所以我没能进行太多优化。

我将继续努力提高,以便

同比赛其他方案