初心者がDiagnosticsのスコア上げを頑張った話@Signals
これは、Numerai Advent Calendar 2021 の12/14の記事です。
この記事は何であるか
Numerai Signalsという、株の予測をするコンペみたいなのがあります。
10月末に取り組みを始めて、およそ1ヶ月かけてDiagnostics(公式のバリデーションみたいなもの)のスコアを頑張って上げました。その記録です。
いわゆる「ポロリ」はほぼ無いです。どこまでオープンにしてよいのかまだよくわからないので、安全側に倒しました。想定読者である初心者の方に、「ふーん、この程度の素朴な施策でDiagnostics向上するんだー。楽勝じゃんー。」と思っていただける程度の概要にとどめています。
ただし、筆者は高スペックのサーバーを趣味で運用してまして、Google Colab等で手軽に始めてみたい方は、ここに書かれている施策だけでCORR0.05は達成できない可能性があります。
また、言うまでもありませんが、Diagnosticsは所詮はバリデーションです。Diagnosticsを上げたからといって、Liveで好成績が出せるとは限りません。
やったこと
本題です。時系列順に書いていきます。
ドキュメント読む
まず、公開されているドキュメント、フォーラムの書き込み、チャット、先輩たちの解説記事を読み込みました。
トータルで20時間くらい費やした気がします。(Numeraiトーナメントについても情報収集したのでSignalsに絞れば半分の時間で済んだかも)
目的を決める
数ヶ月〜1年のペイアウトの最大化を目的にしました。理由はお金がほしいからです。
方針を決める
CORRとMMCを向上させる必要がありますが、MMCを狙って向上させるのは非効率と判断しました。運営のモデルの特性を理解するのに骨が折れそうだったのと、上位者の成績を見ると、CORRとMMCが相関しているように感じられたからです(定量的には分析してない)。
そこで、何らかのバリデーションデータを用いて、CORRスコアを0.01以上向上させる改善策を積み重ねることにしました。つまり、以下のようなイメージです。
ベースライン(CORR>0.01) ---> 改善策A (CORR>0.02) ----> 改善策B (CORR>0.03)--->・・・
0.01の向上が無い改善案を採用せずに切り捨てる理由は、「なんとなく」です。[1]
以下には、CORRを0.01以上改善できた施策のみを記載します。不発だった施策は書きません。
ベースライン
大変有り難いことに、先輩方がベースラインとして使えるJupyterノートブックを公開してくださっています。
私は @katsu1100 さんが公開してくださっていた、こちらのノートブックをベースラインとして活用させていただきました。このベースラインはかなり強く、3ヶ月リターンが執筆時点で4位です。すごい😳
この時点でDiagnosticsのCORRは約0.01でした。費やした時間は1時間程度でしょうか。[2]
特徴量を増やしてCORR0.03
ohlcvデータを使って特徴量を増やしました。特徴量を増やすとスコアがメキメキ向上し、0.02は軽く突破、最終的には0.03の後半くらいで伸びなくなりました。
ほぼ脳死状態でパラメタを増やしたり、指標を増やしました。Kaggle本に書いてある特徴量エンジニアリングっぽいことはまったくやってません。
ただ、特徴量が数千個程度に増えたので、メモリがスワップしないように計算する工夫など、細かい配慮が必要でした。
この時点でDiagnosticsのCORRは0.035前後でした。費やした時間は1日〜2日程度でしょうか。
ちなみに、ベースラインのノートブックは、dropnaされたデータがDiagnosticsにアップロードされているようでした。このままですと、Diagnosticsで評価されるtickerが減ってしまうので、dropnaをしないでアップロードするように変更しました。すると、なぜかDiagnosticsのCORRが0.01くらい向上しました。[3]
データ増やしてCORR 0.04
ohlcデータでスコアが頭打ちになったので、新しいデータを買いました。
Nasdaq Data Linkというところに様々なデータセットがあったので、データセットの中身を見ながら効きそうなデータを物色しました。
データをたくさん買いたくなりましたが、株価予測のために最もオーソドックスと思われるデータセットを買いました。例によってデータ固有のノイズや欠損などがあったため、モデルに投入するための前処理はそこそこ大変でした。
この時点でCORRは0.04前半でした。費やした時間は、データの物色で半日、データの前処理に半日〜1日といったところです。
なお、データを増やしたことで、手元のバリデーションとDiagnosticsが大きく乖離しました。手元での評価では、CORRが0.07を突破して「うおー」となったのですが、Diagnosticsで大きく下がって0.04となって少しガッカリました。たぶん運営のNeutralizationの効果だと思います。
なお、ここでデータを増やさずに、ohlcデータのままでモデリングを頑張る世界線もありえるわけですが、データ増やしたほうが投入時間あたりの精度向上が大きいと判断しました。理由はなんとなくです。[4]
少しヒネってCORR 0.05
最後の試みとして、少しだけヒネったことをやりました。データ追加でもなく、特徴量エンジニアリングでもなく、モデリングでもなく、本当にちょっとしたことです。Diagnosticsだけでなく、Liveにも貢献するであろう施策です。
これでCORRが0.05に達しました。この結果が、記事冒頭のツイートです。
Liveの成績
銀メダル取れました。うれしい。
安定してそこそこの成績を出してくれるといいなと思ってます。
-
経験上、バリデーションでのスコア改善が少しだと、プロダクションに入れるとほとんど効かない印象があります。バリデーションにオーバーフィットしてる場合や、プロダクションでも精度向上しているが、ビジネスにインパクトを出すほどではないから目立たない場合があると思います。0.01を「十分に改善したしきい値」にした根拠はないです。 ↩︎
-
ベースラインがあることは本当にありがたかったです。ドメイン知識がほぼゼロだったので、特徴量として「株価のナマの値」とかを使って爆死してたと思います。スクラッチで書いたらCORR0.01を達成するのに1ヶ月以上必要だったでしょう・・。 ↩︎
-
ちなみに、私の環境では、dropnaしないvalidationデータのpredictが、いつまでたっても終わらないという現象がRound294で発生しました。 ↩︎
-
これまた経験則で、モデリングすごく頑張って数パーセント改善したあとに、良いデータが来たので投入すると、あっさりと10%以上の改善があるみたいな虚無が強く印象に残っているからだと思います。(しかもよくある) ↩︎
Discussion