Signalsの特徴量作成について
これは Numerai Advent Clalendar 12日目の記事です。
今年のカレンダーでは、私が貯めてきたSignalsのノウハウを公開していきたいと思います。一週間後に行われるNumerai Japan Meetup で私が発表する内容とも一部重なる部分がありますので、そちらもご覧いただければと思います。
もくじ
- どのようなデータを使えば良いのか?
- 特徴量エンジニアリング
- 特徴量選択について
どのようなデータを使えば良いのか?
前回の記事述べましたように、使えるデータはそんなにないです。今のところ、yfinance で世界中の銘柄を集めるのが良い気がしています。yfinance をさわればわかると思うのですが、世界中の銘柄に共通して取得できるデータは、以下のデータです。
- OHLCV データ(数値)
- country, sector, industry(カテゴリカル)
もちろん、ファンダメンタルデータを用いることはできますが、今から集めるとなると直近のデータしか集まらないのではないかと思います。仮に、過去4年分のファンダメンタルデータを利用できるとしても、Signals で提供されている期間(約過去20年分)のうち一部の期間しか使えないでしょう。一方で、短期間のデータでもモデルは大して変わらないとの情報もあります。実際、私のモデルでも、4~5年の期間を学習に使えれば、10年分のデータを学習に使うのと大差ないパフォーマンスが出ているように思います。そう考えると、直近のファンダメンタルデータを(持っていれば)使うのも良い戦略かもしれません。
特徴量エンジニアリング
使用するモデルについてですが、線形モデルでは一般に予測結果のボラティリティが大きくなるようなので、ツリーモデルを使った方が良いです。lightgbmやXGBoostなどのツリーモデルを使う場合、country, sector, industry はラベルエンコーディングしてそのまま使うのが手間も少なくパフォーマンスも良いです。以下では、OHLCV データでどのような特徴量を作れば良いのかについて述べていきます。
テクニカル指標
とりあえずテクニカル指標を作ってみましょう。テクニカル指標作成ライブラリである talib、ta は、詳しくなくても使えるライブラリです。ちなみに、各指標ごとにデータ作成に利用するための期間のデフォルト値が設定されていますが、みなさん自分で設定されることを勧めます。期間の選び方は、いろんな考えがあると思いますが、ある程度長い方が、モデルが安定するような気もします。一方で、期間が長すぎると、モデリングの際に問題が発生することとなります。これについては、モデリングに関する次回の記事で述べたいと思います。
要は、良い感じの期間を設定しましょうという話です。
自分で作る
talib、taなどでは作れない特徴量を作ると、周りと差をつけられると思います。これについてはファイナンスの知識があった方が有利かもしれません。或いは、ファイナンスの知識がなくとも、有用な特徴量を見つけることはできるかもしれません。ここで重要なのは、すでに作成した特徴量との相関があまりない(0.95以下程度を目安)特徴量を作ることです。この点を意識した特徴量生成アルゴリズムを開発できると、周りとの差をつけられるかもしれません。或いは、neutralization を行った特徴量も良いかもしれないです。
talibやtaで作られていない特徴量の例については、いくつか述べるだけにとどめさせていただきたいと思います。
- シャープレシオ
- 騰落率
- close / (60日間移動平均)
データの正則化
以上で得られたデータをそのまま利用するのは良いとは思いません。定常性がなければちゃんとした予測モデルを作成することができないからです。定常性を持たせる方法はいくつかありますが、ここでは、同じ期間毎のbinningを推します。すなわち、同じ期間の銘柄間で、5分割するのです。これは、Numerai がトーナメントデータで行っているものと同じ処理だと考えています。彼らはこの操作のことを、データの正則化と呼んでいた気がします。(過去のyoutube 動画を見るとどこかに載っているかも)
特徴量間の相関を見る際には、当たり前ですが、binning などによる変換後のデータで計算してください。トーナメントに参加したことがある人は、トーナメントデータをそのまま扱うような状況を想定されると良いと思います。
特徴量選択について
いろんな方法があると思いますが、相関の高すぎる特徴量の削減が重要です。実際、相関が高すぎる特徴量が大量に含まれていると、ツリーの数を多くする毎にパフォーマンスが落ちる場合があります。これは、偽の発見(見かけは良いが、実際の運用には適さないモデル)である可能性が高いです。この点についてはモデリングの際に明らかになることが多いので、次回の記事に回したいと思います。
ではいくら以上の相関を持つ特徴量を削減すれば良いのか?私は0.96以上の相関を持つデータは削減した方が良いのではないかと思っています。これは、旧データセットを参考にした値です。この値が正解という訳ではなくて、実際、0.98の相関を持つデータを加えるとパフォーマンスが良くなることもあります。この辺りは経験則によるところではないでしょうか。
この考え方は、トーナメントの新データセットでも通用するかもしれません。実際、新データセットでは相関の大きな特徴量が結構ある気がしています。この辺りを削除すれば、より安定したモデルが作れるのかもしれませんね。
最後に
今回は特徴量生成について記事を書かせていただきました。内容の新規性が薄すぎて拍子抜けされた方もいらっしゃるのではないでしょうか?思うに、このNumeraiという競技は、特別な才能よりかはむしろ、地道な努力の積み重ねが重要なのではないかと思います。ちゃんと自分で考えた上で、明確な計画を実行した人こそ、リターンが得られるのだと思います。
文字だらけの記事になって申し訳ありませんが、画像やコードについては後日(おそらくMeetup後)追記したいと思います。
次回のモデリングの記事は結構な大作になるのではないかなと思います。乞うご期待。
それではみなさん、Numerai or Die!
Discussion