451. Jane Street Market Prediction | jane-street-market-prediction
受 @dmitryvyudin 最近帖子的启发,我想我也分享一下我使用过的几个还没见别人提到的技巧。我认为前几个是好主意,而最后一个则有点处于作弊的灰色地带,当然也是无法实际部署的。很好奇是否有人也尝试过这些方法!
从很早开始,我就对回归方法不起作用感到沮丧,并且觉得分类方法丢弃了包含在 Resp 目标中的有价值信息。当我遇到标签平滑(1 -> 0.99, 0 -> 0.01)时,我产生了用 resp 来控制平滑程度的想法。所以我的分类标签实际上是 sigmoid(a*resp),其中 a 是一个可调的大参数。这样,如果 resp 非常接近零,0/1 标签实际上会被钝化为更接近 0.5 的数值。这对所有 5 个 resp 目标重复进行,输入到多目标神经网络中,我简单地平均了最终的预测结果。这对我的 CV 分数有明显的提升。
在我看来,这次比赛最具挑战性的部分是衡量哪些模型实际上表现良好。即使在将许多随机种子集成在一起或重复实验时,我也经常在不同的运行中得到相互矛盾的建议。除了关注像 AUC 这样的指标外,另一个有帮助的方法是对我的内部 CV 效用函数中的权重进行对数变换。这似乎有助于减轻大权重交易的影响,而又不完全忽略它们。
(正如许多其他人所提到的,我几乎完全忽略了公共 LB。我的两次提交在公共 LB 排名中都处于下半区。)
我觉得这很聪明,但不清楚它实际上帮了我多少忙。如果你看权重分布和效用分数,你会发现少数观测值构成了总权重的绝大部分。正因为如此,你实际上可以只在少数观测值上部署更好/更慢的模型,并获得巨大的收益。例如,权重为 30 或以上的观测值仅占观测值的 3%,但占总权重的三分之一。我对这些观测值使用了 20 个 MLP、5 个 Densenet 和 5 个 ResNet 的集成。最低权重的观测值几乎无关紧要,所以它们只用 1 个 MLP,运行时间只有 1/30。最终,我的部署运行时间远低于允许的最大值,而如果我对每个观测值都使用完整的 30 个模型集成,可能会超时。
从一开始,我就决定用我的两次提交来对冲相反的阈值。
(题外话:我从未被说服效用分数真的像主办方预期的那样惩罚风险承担。夏普比率平衡了风险和回报,但因为它乘以了总回报,回报项实际上在效用方程中出现了两次,因此在实践中超过了分母中的波动率惩罚。我没有发现任何证据表明我提交的“保守”方法有过帮助。但也可能我遗漏了什么……)
总而言之:如果你必须选一个,我认为 0.5 是最好/正确的阈值。然而,因为我们有两次提交机会,我提交了一个“看跌”和一个“看涨”。基本上是一个阈值为 0.49 的提交,和一个阈值为 0.51 的提交。
但我更进一步:如果 feat_0 实际上是做多/做空或买/卖,那么做空应该在糟糕的市场中更激进,而做多应该在良好的市场中更激进。所以最终,我的“看跌”提交对 feat_0 == 0 的观测值使用 0.49 阈值,对 feat_0 == 1 的观测值使用 0.51 阈值,而我的另一个提交则相反。如果市场相对于训练数据暴涨,我的一个提交会表现良好。如果崩盘,另一个会表现良好。我本可以用更激进的比如 0.47 和 0.53,但我也想在市场表现与训练数据完全一致时表现尚可。
如果 Jane Street 能找到一种在两个平行宇宙中交易的方法,并且只承担对他们更有利的那个宇宙的后果,我强烈推荐这种交易策略。
除了这些技巧,我所做的一切都与已发布笔记本中的内容非常相似。我集成了 MLP、Densenet 和 ResNet,其中 MLP 权重最大。3-4 层,Dropout,Swish 激活函数,非常少的 epoch。前 85 天的数据被包含,weight == 0 的观测值也被包含。我不确定为什么这么多人把这些数据去掉了。
很期待听到反馈,并期待接下来 6 个月的悬念!