KagglerへのNumeraiのススメ

11 min読了の目安(約6600字IDEAアイデア記事
Likes24

この記事について

世界最大のデータサイエンスコンペプラットフォームであるKaggleの、なんらかのコンペに参加したことのある方で、

  • Kaggleもっと参加したいけど、手頃なテーブルコンペが全然ない...
  • 魑魅魍魎が跋扈していて、上位(ゴールドメダル以上)、ましてや賞金を取るなんて夢のまた夢...
  • Numerai?なんか聞いたことあるけど周りに誰もやってる人がいないのでワカラン

という方、結構多いのではないでしょうか。この記事では、ちょっと変わったテーブルコンペであるNumeraiと、そのKaggleとの差分について簡単にまとめました。

Numeraiとは

Numeraiとは、株価を予測するデータサイエンスコンペです。そのように聞くと、株などの金融商品の価格を予測し、機械的に売買するBotを作ったりするのかな〜面倒くさそう...と思われるかもしれませんが、Numeraiのすごいところは、その本来は煩雑な機械学習の応用を、

train.csv, test.csvが与えられて、fit -> predict -> submit

という、最も簡易なテーブルコンペの形式に変換されているところです。

ですので、Numerai参加者には、金融商品に関する知識、取引のタイミングの考慮や売買ロジックの実装などは求められていません。データをダウンロードし、好きなモデルをfitし、ターゲット予測値を提出して、それで終わりです。

データ

訓練データであるtraining_data.csvは以下のような形式になっており、idをprimary key(匿名化された株の銘柄)として、期間を表すera、そして匿名化された特徴量が310個入っており、最後に予測対象であるtargetのカラムがある、という形式です。

データは完全に匿名化&ビン化されており、一般公開されているので以下のようにして誰でも取ってくることができます。

import pandas as pd

def read_train(data='train'):
    # get data 
    if data == 'train':
        df = pd.read_csv('https://numerai-public-datasets.s3-us-west-2.amazonaws.com/latest_numerai_training_data.csv.xz')
    elif data == 'test':
        df = pd.read_csv('https://numerai-public-datasets.s3-us-west-2.amazonaws.com/latest_numerai_tournament_data.csv.xz')
    
    # features
    feature_cols = df.columns[df.columns.str.startswith('feature')]
    
    # map to int, to reduce the memory demand
    mapping = {0.0 : 0, 0.25 : 1, 0.5 : 2, 0.75 : 3, 1.0 : 4}
    for c in feature_cols:
        df[c] = df[c].map(mapping).astype(np.uint8)
    return df
train = read_train('train')
test = read_train('test')

validation dataはtournamentに含まれています("data_type" が"validation"であるもの)。

データの取得、線形モデルでのモデリング、提出の流れは、公式のGithubにありますのでそちらをご参照ください。機械学習初心者でも大丈夫な、非常に単純なテーブルコンペの形式になっていることがおわかりになると思います(Google Colabで動きます)。

https://github.com/numerai/example-scripts/blob/master/making-your-first-submission-on-numerai.ipynb

以下では、Kaggleとの差分について見ていきたいと思います。

賞金

おそらく一番気になるところだと思います笑 Numeraiはヘッジファンドによって運営されており、参加者が提出した予測値のアンサンブルを用いて、実際の売買を行っています。そして、参加者は、運営のアンサンブルモデルにどれくらい貢献したかによって、掛け金に応じた報酬を受け取ることができるわけです。

この仕組みは非常に独特ですが、Kaggleにはない独自の面白さを生んでいます。

入賞しなくても、予測が悪くなければ賞金がもらえる

Kaggleでは基本的に、予測精度の上位3チームに高額な賞金が支払われます。残りの大多数の参加者には、少なくとも金銭的なメリットはありません。

しかしNumeraiでは、予測精度が良く運営のアンサンブルに若干でも貢献していれば、それに応じた報酬、すなわちスコアx自分の掛け金を受け取ることができます。逆に予測精度が悪いと、悪い分だけ引かれてしまいますが...。

私自身、正直雑魚Kagglerですが、Numeraiでは若干の浮き沈みはあるにせよ全体的には余裕のあるプラスです。後述しますが、Numeraiデータの匿名特徴量はかなり強く、公式のXGBoostのExampleを提出するだけでも若干のプラスになりますので、中長期で安定した報酬を受け取ることはさほど難しくないはずです。

また、報酬は基本的に予測値とターゲットのRank correlationに応じたものになるため、±15%を超えることはまずないと思っていいです(25%超えることはまずないですが、その場合は25%でclipされます)。ですので、余程掛け金を冒険しないかぎり、比較的安定した金融資産と捉えることもできます。Numeraiのtournamentは後述しますが、1ヶ月単位のRoundが毎週開催されるため、安定して勝てるモデルが作れれば、あとは毎週末提出するだけでweeklyで+数%稼ぐことも可能です。株や仮想通貨を自分で運用するのは中々大変なので、データサイエンスに自信のある方は、Numeraiをご自身のポートフォリオの1つとして検討されてもいいかもしれません。

報酬を受け取るには、専用の仮想通貨NMRを購入する必要がある

円やドルでできればそれに越したことはないのですが、Numeraiで遊ぶには専用のトークンが必要です。NMRという仮想通貨で、これを任意の金額自分のSubmissionに掛け、報酬もNMRで受け取ります。掛け金ゼロでも予測値を提出することはできますが、どんなに結果が良くても報酬を受け取ることはできません。逆に悪くても掛け金が没収されることはないので、最初は掛けずに始めた方がいいかもしれません...。

NMRの購入ですが、自分は現物BTCをLiquidで買って、Bittrexに送りそこでNMRを買っています。正直面倒なので、もっといい方法があれば教えて欲しいです^^;

NMRは現在(2020年9月下旬時点)のところ1NMR 30ドル前後で落ち着いています。

NMR / JPY chart

モデリング

Numeraiはビン化された匿名特徴量を使って匿名Targetを予測しにいくため、特徴量エンジニアリング自体はなかなか難しいです。実際のところ、310ある匿名特徴量はTargetとの相関が高いものも多く、特徴量エンジニアリングなしでXGBoostに投げるだけでそこそこのパフォーマンスが出ます(公式Exampleはこちら)。

ただ、Eraカラムにある時期によってデータを分けられるのですが、相場というのは難しいもので、予測が簡単なEraと難しいEra(予測値の逆を出した方がスコアが良い時期)があり、難しいEraでも勝てるモデルを作るのはかなり厳しいです。EDA (Exploratory Data Analysis)をがっつりすると周りと差をつけられるかもしれません。

アンサンブルがあまり効果的ではない

Kaggleでは、上位解法はなんらかのアンサンブルを用いていることがほとんどです。機械学習モデルは複数あれど完全無欠なものはなく、複数モデルのアンサンブルでスコアを底上げするのは基本テクニックになっています。

一方Numeraiでは、評価指標をCORRかCORR+MMCか自分で選ぶことができます。CORRは単純な予測値とTargetのRank correlationで、MMC(Meta Model Contribution)とは、その英名通り、メタモデルにどの程度貢献できたかを表す数値です。

Kagglerは予測精度を最大化する生き物ですので、習慣でCORRを選んでしまいがちですが、CORR+MMCの方が(MMC加算分だけ)報酬が高いこと、また、CORR+MMCの方がスコアが中長期的に安定する傾向にあることから、多くの人がCORR+MMCを選択しています。事実、Leaderboard上位の人は全員CORR+MMCを選択しています。

運営のアンサンブルモデル(メタモデル)にどのくらい貢献できるか、つまり、targetとの相関がなるべく高く、メタモデルとの相関がなるべく低い予測値を作り出せるか、が1つの評価指標になっているため、アンサンブルをすればするほど、自分の予測値がメタモデルと近づいてしまい評価が悪くなる、という性質があるように思います。私自身、いくつかのラウンドで99th quantile (上位1%)を取りましたが、いずれもシングルモデルです。

こうした、ユニークだが強いシングルモデルを作って、アンサンブルなしで結果が出る、というのは、Kaggleではなかなか味わえない体験のように思います。

治安が良い

優秀な機械学習エンジニアの方でKaggleやっていない方が良く言われるのが、「Kaggleは治安が悪い」というご意見です。確かに、KaggleにおいてはPrivate sharing(チームを組んでいない人にコードをシェア、あるいは売買すること)を始め、初見の人に優しくないDiscussionであったり、自分の実力試しの場としてちょっと...となってしまうのはわかります。Kaggle側も様々な対策を講じていますが、予測精度至上主義の性質上、なかなか難しいのが現状です。

一方Numeraiでは、予測精度だけでなく、メタモデルに貢献できるようなユニークな予測が求められます。そしてその結果が自分の報酬に直結するので、他の人に解法を教えてしまうと最早自分の解法はユニークでなくなり、自分のメタモデルへの貢献度が下がり、結果的に自分の報酬が下がる恐れがあります。こうしたインセンティブ設計は、Private sharing防止に一役買っていると思います。

また、ForumというKaggleでいうDiscussionの場もあるのですが、KaggleやってからForumを覗くと治安が良くてびっくりします。Forumの治安を守るための使い方チュートリアルもあって、いいプラットフォームにしようという運営の高い意識が伺えます。


Forumの使い方のTutorialを終えたらバッジもらえました。かわいいです。

スケジュール

Kaggleは不定期に色々なコンペを開催しており、期間は3ヶ月が基本です。最近は画像系が多く、手頃なテーブルコンペは残念ながらかなり稀という印象です。長い期間勉強を続けながら、信頼できるCross valdiation戦略を樹立し、「でもこれ最後にShakeしたらどうしよう」と震えながら、強い公開ノートブックを参考に自分のコードを書き直し、Discussionを読み込み情報戦に遅れを取らないようにしながら、頭を抱えて「なんもわからねぇ」「あ完全に理解した」を繰り返す日々です。

Numeraiではtournamentが毎週(Roundと呼ばれます)が開催されており、Roundは毎週土曜(UTC18時、日本時間だとの9時間後の27時)に始まります。そこで新しいtournament dataがリリースされ、参加者はそれに対する予測値を提出します。締め切りは翌月曜日(UTC14時半、日本時間だとの9時間後の23時半)です。

Roundの終了は1ヶ月後で、その1ヶ月分のスコアで評価され報酬が決まりますが、予測値に対するフィードバック自体はDailyで行われるため、短いスパンでモデルの検証を行い、次の週のRoundで別のモデルに変更しても何も問題ありません。Kaggleというより、Atcoderの方が時間感覚としては近いかもしれません。KaggleにせよNumeraiにせよ、色々自分のアイデアを試してみて、それが報酬につながるととても楽しいですね。

まとめのまとめ

NumeraiはKaggleとはまた一味違ったデータサイエンスコンペで、テーブルデータで力試ししたい人、データサイエンスでお小遣いを稼ぎたい人におすすめのプラットフォームです。

注意

掛けて遊ぶ場合は余裕資金の範囲内で!

出典

以下、Numeraiに参加する方は一度は一読されることをおすすめします。