返回列表

Tentative 3rd Place Solution (6th in Public) - life is volatile

471. Optiver Realized Volatility Prediction | optiver-realized-volatility-prediction

开始: 2021-06-28 结束: 2022-01-10 量化投资 数据算法赛
暂定第3名方案(公榜第6名) - life is volatile

暂定第3名方案(公榜第6名) - life is volatile

作者: A.Sato (Grandmaster), Tomomu Iwai (Master)
比赛: Optiver Realized Volatility Prediction

在开始之前,我要感谢 Kaggle 和 Optiver 主办了这场精彩的比赛。当然,还要感谢我优秀的队友 @tomotomo5,是他起草了这篇帖子。

我们在公共排行榜上最终排名第6,目前在私人排行榜上排名第3(截至10月15日)。

在这篇讨论中,我们想介绍一些我们实施的核心想法,正是这些想法提升了我们的分数。其中一些在社区中尚未被广泛讨论。在模型方面,我们的最终模型是 LightGBM 和 ANN 的简单堆叠模型(这部分不太值得注意)。

time_id 最近邻

我们方案中最大的“游戏规则改变者”是基于 time_id 最近邻的特征,这与 @nyanp 在其下方的解决方案中解释的特征创建思路相似。
https://www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/274970

我承认我们的理念没有 @nyanp 那么复杂。我们只是试图找到具有相似市场条件的 time id。事实上,我们并不太清楚我们可以恢复 time-id 的顺序,尽管我们最终创建了与 @nyanp 非常相似的特征。

不同之处在于:

  • 在计算最近邻时~~不使用降维(@nyanp 解决方案中的 TSNE)~~
  • 增加了第1个最近 time_id 和第 k 个最近 time_id 的距离比
  • 没有使用时间序列交叉验证,因为我们没有想到时间序列逆向工程的想法 :(

目标转换

目标转换是我们模型的关键部分,它增加了模型的鲁棒性。股票波动率可能表现为非平稳序列,这意味着波动率水平可能随时间不稳定,但波动率的变化不太可能如此。

考虑到这一点,我们决定将比赛任务从直接预测已实现波动率的水平改为预测目标值与 0~600 秒已实现波动率的比率。

具体来说,我们的转换目标公式如下:
(转换后的目标) = (目标值) / (0~600 秒的已实现波动率)

300 秒模型

由于预计训练数据集和最终测试数据集之间存在较大的时间间隔,我们希望尽可能多地向模型提供关于测试数据集的信息。

因此,我们 (1) 连接了训练集 + 测试集,(2) 将 600 秒切成两半,(3) 使用前半部分(0-300 秒)创建特征,(4) 预测后半部分 300-600 秒的已实现波动率。然后我们 (5) 基于数据集的 300-600 秒创建特征,并 (6) 预测 600-900 秒的已实现波动率。

预测结果被用作我们主模型的特征。
这个想法最棒的部分是我们能够基于测试数据训练模型。

宏观估计

我们相信个股波动率在很大程度上取决于宏观环境。
因此,我们训练了一个模型来预测每个 time_id 中所有 stock_id 的平均波动率。

结果被用作我们主模型的特征。

希望此后的私人排行榜不要那么动荡,即使生活是动荡的
非常感谢您的阅读,祝您 KAGGLE 愉快!

同比赛其他方案