🚥

Numerai Signals のTips

2021/06/01に公開
1

備忘録。おそらく初心者向けではない。

Numerai Signals について

Numerai Signals は、自分でデータを作成して予測まで行うコンペティションです。ターゲットだけがNumerai 社から与えられます。

日本語の紹介記事は以下のふたつが参考になります。

予測結果を元に実際に運用されたことのある人もいるそうです。

今回話すこと

Signalsで、corr sharpe > 0.65 を平均的に出せるようになるまでの話

エッジが減りうるのになぜ話すのか?

単純にすごく面倒くさいからです。おそらく真似する人はほとんどいないと思います。勉強させていただいたUKI さんの記事の「最後に」にも、似たようなことが書いてあります。

導入

Numerai Signalsをやる上で気をつけた方が良い以下のTipsを述べます。しかし、詳細には踏み入りません。

  • データの入手先
  • データの作成方法
  • モデリング(≒リサーチ)
  • バックテスト
  • バックテストの罪

データの入手先

こちらのForumを参照。フリーだとyfinanceが妥当かもしれませんし筆者も使っていますが、いつか使えなくなるかもしれないことは、頭の隅に入れておくと良いかもしれません。

データの作成方法

データそのものについての注意

データを作成方法と聞くとfeature engineering を思い浮かべる人が多いかもしれませんが、まずやるべきはデータの観察です。実際、yfinance でOHCLVデータが取れますが、その中には明らかに間違っているデータ(例えば、adj close が負の値を取るなど)があるので、それらを省くか別の値で置き換えるかする必要があります。open, close, high, low, volumeなどについても同様です。また、こういった誤ったデータが多い時期は、その時期ごと取り除いた方が良いかもしれません。多少の選択バイアスは入りますが、ノイズを学習させられるよりはマシです。
こうしたクリーニングを行うことで、corr sharpe は0.3~0.4に上がります。

Numerai のcommunity をみていると、有料無料も含め、数あるAPIから良いデータを提供するものを探している印象を受けます。ベンダーに頼るより、自前で取ったほうが良いという話を聞くので、私は極力(APIの力を頼りながら)自前で取っています。

データ作成

Numerai によると、利用するデータ(≒Signals)を以下の四つに類別しています。

  • ファンダメンタルSignals (P/E ratio, dividend yield, analyst ratings)
  • テクニカルSignals (MACD, RSI, MFI)
  • オルタナティヴデータSignals (クレジットカード取引, 衛生画像, ソーシャルメディアの感情)
  • ブレンドSignals (Barra risk factors, Fama French factors)

引用元:Numerai Signalsについての概要

yfinanceのみでデータを取得するとなると、オルタナティヴデータは扱えません。また、ファンダメンタルも直近4年分しか取得できないため、これらも利用できません。したがって、以下の二つのSignalsを利用することになると考えられます。

  • テクニカルSignals
  • ブレンドSignals

yfinance のみで勝負する人たちは、これらのデータを元に予測結果を作ることになると考えられます。ブレンドSignalsは地味に作成するのが面倒だったので、まずはテクニカルSignalsを増やしてみることを勧めます。ネットで検索すると、色々出てくるので、それらをうまく使うと良いと思います。

さて、こうしたデータを特徴量にするのは良いのですが、まさかそのまま学習させる人はいませんよね?遥か昔1$360円だったように、時代(era)によって同じ値でも違う意味を持つことがあります。なので、era 毎に比較可能なfeature に変換することが必要になると私は考えます。こうすることで、corr sharpeは0.05~0.1程度上がります。よくわからない人は、5分位binningを試すと幸せになれるかもしれません。
参考:Jason Rosenfeld(jrAI)によるYahooFinanceの完全無料データを使用したNumerai Signalsのノートブック。

5分位のbinning を気に入っているのは、欠損値の意味をneutral にしたいときには中間の値に設定すれば良いからです。(ex. [0.0, 0.25, 0.50, 0.75, 1.0] ならば、nanをneutral=0.50に置き換える。)nan値を扱わないのであれば、7分位、9分位と使っても良いかもしれません。

ここまでのデータ入手、クリーニング、作成でかなりの時間が取られてしまいます。暇人以外はSignalsをやるのは勧められません。

モデリング(≒リサーチ)

ここからは皆さんが持っている硬い枕が役立つ時間です。私見ですが、柔らかい枕も役にたっている印象を受けます。
さて、モデリングについてですが、以下の二つを行うと良いと思います。

  1. ハイパーパラメータの設定、学習、Kfold
  2. 特徴量の吟味
  3. 良さそうなモデルでなければ1.に戻る

バックテストでバリデーションすると、バックテストオーバーフィッティングしてしまうため注意です。feature importance (MDI, Permutation Feature Importance, mutual_information)を元にモデルの特徴量を吟味して、良さそうなモデルを絞った上で、それらをバックテストに回すと良いです。
私もバックテストオーバーフィッティングした可能性のあるモデルを提出しましたが、neutralization で大幅にcorr sharpe が落ちました。neutralization はうまくワークしているのだろうと思います。バックテストについては、ファイナンス機械学習、通称硬い枕に詳しいです。

パラメータチューニング

おそらく多くの人が知りたい内容であろう。しかしこの内容は、硬い枕に乗っているので、各自調べられたい。平均独自性の部分と、特徴量重要度の章にヒントが載っています。例えばxgboostだと、max_samplesや、colsamples_bytree あたりは良い感じに決まると思います。
本の内容とアルゴリズムのパラメータの理解ができていれば、自ずと定める値も決まってきます。

特徴量の吟味

モデル(特徴量)の吟味についてですが、各featureのMDIのバランスが良い感じに取れている場合(≒どの特徴量も同じ重要度を示す)には、良いモデルである可能性は高いです。これは、xgboostだと容易に実現できます。これでcorr sharpe に0.5ほどの差がつくと思います。また、偽の発見をしているのか見つけるために、例えばノイズを特徴量に入れてみて、ノイズよりimportance が低いfeature は実質ノイズである可能性があるかもしれません。この点は、Permutation Feature Importance をみた方がわかりやすいです。

以上のリサーチ結果を見て、例えば、高いmutual_info を持つfeature がimportanceの上位に来ているモデルであれば、それなりに良いのかもしれませんし、逆に、他のmomentum featureが上位に来ているのであれば、上昇相場に適したモデルになっているかもしれないです。そのような感じで納得するまでリサーチを進めます。

(6/14追記)RFやxgboostなどを利用する際には、モデルのバリデーションとしてn_estimatorsを増やした場合のパフォーマンスの変化を見ると良いです。例えば、n_estimators=1000でcorr sharpe=0.6だった場合でも、n_estimators=5000とした場合にcorr sharpe=0.45などとなった場合には、モデルが妥当でない可能性があります。この記述は硬い枕にもありますが、個人的にはもっとも実践的なtipsだったと思います。特徴量を増やすか強い正則化をかけるなどして乗り切りましょう。

バックテスト

リサーチで得られたモデルを、検証データで統計量などを観察します。ここでの目的は、モデル≒ストラテジーが明らかな偽物かを判定することであって、モデルの良さを高めることではないです。できれば、モデルを作る人とテストをする人は分けた方が良いですが、筆者はまとめて行っています。バックテストの結果をリサーチに用いるとバイアスが入ってしまうため決して行ってはならないのですが、ここは誘惑に勝つ必要があります。

ちなみに私の場合ですが、リサーチの後にバックテストをして、悪くなければCPCVを行うようにしています。
順番が逆ですが、CPCVの計算コストの高さゆえにこうやっています。今のところ、まぁまぁ良い感じのモデルにはなっていそうです。

色々試しましたが、PurgedKFoldくらいで大丈夫です。クロスバリデーションもいらないかも。重要度がちゃんとしたものになっているのかをチェックするのが大切かもです。

バックテストの罪

本人でも中々自覚できないバイアスやルールが存在します。ファイナンス機械学習から、いくつかピックアップしてみようと思います。
日常生活でも、自分が陥っていないたチェックしてみると面白いです。

  • 生存バイアス:投資ユニバースとして現時点のものを使うことで、破綻した会社や上場廃止した証券を除外してしまう。
  • 先読みバイアス:投資判断の時点で公になっていない情報を利用してしまうこと。例えば、予測結果からスコアが良くなるような銘柄のみを選別し、それらを元に改めてバックテストを行うなど。
  • ストーリーテリング:ランダムなパターンを正当化するために事後的にストーリーを作り上げること。よくやってそう。
  • データマイニングとデータスヌーピング:テストデータの利用。
  • 取引コスト:実際にトレーディングコストを把握するためには実際に取引する必要があり、困難である。
  • 外れ値:再現性のない少数のデータに基づき戦略を作成する。
  • ショートポジション:ショートポジションを持つには貸し手を見つける必要がある。

生存バイアスはデータ入手時から、先読みバイアスはモデリングとバックテストのフェーズから考慮しておくと良さそうです。

以上の試行錯誤の結果


良さげなスコアをゲットできました。

最後に

偉そうなことを言いましたが、データを集めるところが一番の鬼門で、忍耐力のいるところです。ファイナンス機械学習もやる気があれば必要なところは読めると思います。忍耐力に自信のある方は是非ご参加ください。
また、世界のどこかで私が主催ではないSignalsのモブプログラミングを行なっているので、そこだともう少し詳しい話が聞けるかもしれません。皆さんと会えることを楽しみにしています。

指摘などありましたら、コメント歓迎です。

それでは、numerai or die...!

Discussion

pegion_HOLEpegion_HOLE

結構読みづらいところが多いな。後日(いつ?)修正します。