jane street market prediction 冠军方案 经验分享 (1/3)

在这里插入图片描述

前言

比赛链接:Jane Street Market Prediction
在这里插入图片描述

作者本人是机器学习竞赛的爱好者,打过几次比赛,也有一点收获。参加这次比赛主要是因为它和炒股相关,股市相关的比赛一直都是非常具有挑战性的,这一场比赛也是如此。第一次接触机器学习我就想着怎么搞个模型来炒股,这一次终于圆了一个心愿了(并且’赚’得还不错),同时也希望读了这篇文章的同学也能有所收获日进斗金赚大钱。这个比赛的分享分为两个部分,第一部分偏经验介绍,第二部分则直接上代码。
之前写的文章更新有点慢,以后会慢慢补上的…

Shake up

在这里插入图片描述
先展示比赛分数的变化,纵坐标是取得的分数,横坐标是公榜分数,可以看出私榜的top存在两类模型,一类模型本身的公榜分数就不高,但是私榜分数不错。还有一类模型,公榜分数很高,私榜分数也不差 (例如我们的模型)。
有些人以为:这个比赛就是摸奖赛,大家都在过拟合,最后得奖肯定是随机的,这是很偷懒的想法,下面也会介绍一些结论,来揭露一些发现。
比赛中存在很严重的过拟合公榜的现象,很多人发布了针对公榜调参的模型,最终使用这些模型的人形成了右边中间的黑云。shape up还是比较严重的,但是可以看出公榜和私榜存在线性correlation,分高的模型偏向于取得高分,也希望之后的轮次我们的模型能越战越勇吧。
在这里插入图片描述

比赛历程

比赛的初期我通过xgb模型取得过排行榜前三,而后又通过模型融合当过几天第一,领先其它选手挺多的。也有了一些独特的发现,这个发现使得我可以很容易得在public kernel的基础上提升分数。

在那之后发生了一件改变比赛流向的事情,有人发现,在某个 public kernel中,如果只是把最后两折训练的模型取出来的话,可以取得比较好的线上分数。

这样做的弊端也很明显,只用到了少量的数据,很可能产生过拟合公榜的情况。这个过拟合模型的发现也对公榜排名造成了大混乱,虽然我可以稍微融合模型保持前几名的分数,但是这样做对于赢得比赛并没有好处。

这之后我选择了弃赛一个月,终于回国和女朋友到处玩。玩了一个多月回来,发现公榜大变天了,第一名都超过一万分了,然而模型方面,大部分人依然在使用之前公榜取得比较好分数的public kernel模型,并没有太多的进展。几天后有一个参赛者分享了一个调参好的模型,跑了200 epochs的MLP取得了线上8100分的成绩。我当时就用上了我的独特的发现,立马就取得了前排的成绩。之后这个分享者又把性能调到了9300,我再一次用上了我的独特的发现,成绩立马就进了前十,这个时候读者一定会疑惑了:

是什么发现这么神,不管什么模型用上都能稳定提分?
在这里插入图片描述
确实是不管什么模型加上都能稳定提分。

在这里插入图片描述

评价标准

我们先聊一下这场比赛的评价标准:utility score
计算公式如下:

p i = ∑ j ( w e i g h t i j ∗ r e s p i j ∗ a c t i o n i j ) p_i = \sum_j(weight_{ij} * resp_{ij} * action_{ij}) pi=j(weightijrespijactionij)

t = ∑ p i ∑ p i 2 ∗ 250 ∣ i ∣ t = \frac{\sum p_i }{\sqrt{\sum p_i^2}} * \sqrt{\frac{250}{|i|}} t=pi2 pii250

where is the number of unique dates in the test set. The utility is then defined as:

u = m i n ( m a x ( t , 0 ) , 6 ) ∑ p i u = min(max(t,0), 6) \sum p_i u=min(max(t,0),6)pi

p i p_i pi代表了每一天的收入,weight是购买stock的数量,resp是 未来交易时的价格浮动,action 则代表是否进行这次交易。

与收入 income 不同,utility score 还考察了模型收益的稳定性,即模型的最大回撤不能过大,不然的话就不是好模型,最终的 utility score 也会相对较低。可以看出:如果有某一天的收入为负的话,t 计算公式里的的分母会变小,分子会变大,utility score 也会被惩罚得很严重。

另一个可以看出的要点是,在 t 值大于6的时候,总收入决定了u值的大小,然而这往往是不可能(有可能)的。

在这里可以看出,最后取得第一名的模型,很可能要么是取得了比较高的t值,要么是取得了比较高的p值(我们的模型),这一点在第一轮的排行榜上有了很好的反映。有没有办法既取得很好的p值,又有很好的t值呢

在这里插入图片描述

独特的发现

官方在数据中提供了5组收益指标,分别是 resp_1, resp_2, resp_3, resp_4 和 resp. 我们的最终受益是按照resp的值计算的。

这里先上结论,

  1. 根据 resp_1,resp_2 交易所取得的收益更加稳定,t值高
  2. 根据 resp_3 交易所取可能有较高的t值,p值也往往高
  3. 根据 resp, resp_4 交易可能取得很高的p值,但是t值往往很低

这里读者一定会有疑问,为什么resp和resp_4是归为一类的?他们之间有什么区别呢?
有兴趣的读者不妨下载数据集分析一下,可以发现不同的 resp 类别,具有的方差是不同的,浮动更大的类别在时间线上距离更远,更加不稳定,所以方差较大。有兴趣的读者不妨参考 Rough estimate of resp_i timeframes

从以上结论我们发现了,利用resp_3,我们可以得到既稳定,又有高收益的模型,也就是说如果我们在预测和训练的时候直接使用resp_3,很可能得到比用resp预测更高的收益!

实验结论也很有说服力,当时我凭借单模xgb(resp_3)直接进入前五(7905),融合多个种子更取得了当时排行榜第一!

这也就是我上文中提到的独特的发现不管什么模型,提交resp_3就能涨点! 这一先结论不管是线上线下大部分时候都是成立的。

一些实验结论

xgboost训练轮数

在线上提交了几次后,可以发现线上分数比线下分数要高出不少,将近有两倍的差距。线下多次实验,我们发现的结论是,xgboost训练100轮后就基本不会提升utility score了,但是在线上可能需要训练400轮才能取得最好的效果。最终提交的模型我们选择了训练了100轮的xgboost模型,线上的分数大概在6000~7000分这个区间内。XGBOOST的超参对于模型的性能影响很大,但是线下分数高的模型超参,线上成绩也往往很高。

不同resp的训练收益曲线

在这里插入图片描述
这是训练神经网络时得到的收入曲线,横坐标是epoch//5,纵坐标是utility score,对于不同resp所取得的收益,可以看出resp_1, resp_2 所取得的收益总是偏低,而resp_3, resp_4, resp取得的收益则更高。这里列出的曲线是模型收敛较为稳定时取得的曲线,实际上通过选择不同的验证集,还可以观察到不同的模式。数据分布完全不同的情况下,resp_2可以取得更好的收益!

均值还是众数?

实际上通过线下分析观察可以发现,在预测试,如果训练时使用了多目标,取均值和众数取得的收益其实是差不多的,但是对于某些特殊情况,均值或者众数往往有奇效。鉴于这里的严重不确定性,我们没有在这里做过多的研究。

最佳的交易阈值

线下经过实验得到的结论是 0.51~0.52 之间的阈值可以带来更高的收益,最后的提交的模型中有一个是用0.51作为阈值,也希望这一发现能在未来的六个月带来正向收益吧。

如何提升模型效果?

  1. 利用更多的数据(weight=0),这里是我们有所欠缺的地方,但是相信别的队伍也没有做得太好,不排除有队伍做了一些处理,取得了效果,但是做了处理并不代表他们利用上了这些数据。下结论前需要大量实验来验证才正确。
  2. 减少交易次数,鉴于评价标准的惩罚机制,放弃risky的交易机会可能会带来分数上的提升。但是这里也比较玄学,并没有发现令人信服且能提升分数的方法。
  3. 特征工程。更多的特征工程可以让模型更容易学习到数据中的pattern,但是随之而来的则是严重的过拟合。

最终模型

比赛的数据是匿名特征(130列),特征工程不是完全无用,但是往往会吃力不讨好。为了保持解决方案的简洁性,最后提交的模型没有加入特种工程。
实际上有一些特征工程可以在线下取得分数的提升,但是加入线上模型会降低分数,我们这里希望只保留线上线下都有提升的强结论。
读到这里的读者可能会发现,我们并没有用什么特别复杂的方法。实际上我大部分的精力都花在了观察数据和模型的表现上,复杂的模型或者方法也尝试过,但是往往效果不好,线上线下不一致,或者并没有显著性。相信大家也会有一种直觉,最终获胜的模型可能并不是那么复杂,这也是我们最终提交所遵循的原则。

我们最终模型是 AE+MLP + XGBOOST(100 round), 每种模型各针对三个种子进行了训练。取得的公榜分数分别是 99xx 和97xx, 私榜分数是 54xx和 52xx。

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌叉烧包z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值