投資判断支援AIを作ってみた
就活終わって暇になったので証券口座を開設したり、投資や簿記の勉強をはじめました。 もう研究なんてしなくていいってことです。
さて、今回は投資の素人が良く考える「全部判断してくれるAIみたいなのないかなぁ」っていうのを愚直に作ってみました。
完全に素人なので、ドメイン知識を活かせないとここまで辛いか…って感じで精度があまり出なかったのが印象的です。勉強します。
パフォーマンスについて
早速気になるパフォーマンスですが、以下の通りになりました。
しょっぱいですね。4年で10万円ちょっとの利益しか出てないので利回りは2.6%ってとこでしょうか? まぁ4年間で74回しか取引を行っていないのにここまでの利益が出せるなら十分人間以上ってことで良いでしょうか()
予測-リターンの散布図は以下の通りになっています。(正規化した上で±3σ以上の異常値は省いて表示しています)
X軸が予測値、Y軸がリターンです。若干正の相関が見られます。
-σあたりの予測が怪しいですが、今回はそこは予測に使用していないのでまぁ良しとしましょう。
次に、各特徴がどの程度予測に影響を及ぼしているのかSHAPを用いて解析します。
このように予測に重要な数値が表示されました。 (本来であれば変数名が表示されるはずなのですが、どうにもドキュメントが見当たらずにこのような形式になりました)
数値を追っていくとどうやらボリンジャーバンドあたりを詳しく見ているようです。
データについて
今回はお試しということで日経225のデータを利用しています。
2005年から2014年のデータを学習に、 2016年から2019年のデータをモデルの評価に使用しています。
以下の簡単なコードで入手可能です。
import pandas_datareader as web nikkei = web.get_data_yahoo("^N225", start = "2005-01-01", end = "2014-12-31")
また、予測にはこのデータだけでなく、他のテクニカル指標も用いています。 用いているのは単純移動平均、ボリンジャーバンド、MACD、RCIです。 この他に日付データ(曜日、月など)も循環指標として利用しています。
テクニカル指標はやろうと思えば自分で計算できるのですが、便利なライブラリがあるのでこのように計算します。
import talib nikkei['sma25'] = talib.SMA(nikkei["Close"], timeperiod=25)
ただまぁ、自分で書くとどのような指標なのかが理解できるので個人的には一旦自分で書いた方が良いんじゃないかなぁとも思います。
また、Lassoなどでは時系列の表形式データが入力できないのでこれらのデータは1次元にほどく必要があります。 多次元時系列データの特徴量抽出はどうやって処理してあげれば良いのか悩みますね。 一応tsfreshを利用してみたのですが、どうにも上手く動作しませんでした(公式ドキュメントどうりに動かしてもダメとは…?仕様…?)
モデルについて
モデルはなんてことのないLSTMを使用しています。(詳しく言うとLSTM+BatchNorm+Denseです。BatchNormを入れると安定しますが、逆に層を増やすと安定しませんでした。)
ちなみに、これと同じ程度のパフォーマンスをLassoで出せます。
変数の重要度がLassoであれば一発で分かるのですが、SHAPを使いたかったのでこちらにしました。
この他にベースラインとしてsklearnで用意されているものに加えてLGBMなど様々なモデルを利用しましたがどれもイマイチでした。 結局単純なモデルが一番ですね。
取引戦略について
1σ~3σの値が出力された場合のみ取引を行います。そのために取引回数が非常に少ないです。(年平均18回なので一ヶ月に1~2回です。) また、ホールドする概念も無いため、その日のうちに必ず売ります。
また、いわゆる空売りは考慮していませんので、大きな負の値が予測されても特に何も行いません。
ここらへんの戦略も今後詰めていく必要がある部分ですね。
今後について
とりあえずデータを増やします。 日経平均だけではどうしようもないので、ファンダメンタル分析も交えつつ(できればやりたくない)日本市場の様々な企業のデータを学習させようかと思います。 また、利用するテクニカル指標を増やしつつ、今回上手く動作したLSTMとLassoに関して変数を分析し、有用な指標を見極めていければと思っています。
ただ、とりあえず研究もやらなきゃなので、社会人になってからの運用をめざしてのんびりやっていこうかと思います。
間違いの指摘やアドバイス大歓迎なのであったら連絡ください。よろしくお願いします。