機械学習による株価予測　いろはの”ろ”

#はじめに
前回記事[「機械学習による株価予測 いろはの"い"」](https://qiita.com/blog_UKI/items/25dc1c2559c61890a449)の公開後、筆者の機械学習モデルの獲得利益はめでたく1億を突破することができた。運用モデルの概要については筆者の[ブログ](http://we.love-profit.com/entry/2020/03/25/163511)にて紹介したが、折角の機会なので技術的な内容についてここに続編を執筆する。今回の記事では、株価を予測するための特徴量についてその考え方をまとめる。

#特徴量の種類
個別銘柄を説明するための代表的なデータとは、財務諸表とチャート（価格系列）である。一昔前は個人投資家がこれらのデータを揃えるのにかなりの苦労が必要だった（特に財務諸表が面倒であった）が、最近ではQiitaでXBRL用のライブラリが紹介されていたり、バフェットコードでAPI（有料）が提供されていたりと、随分と手間要らずになってきたように思う。

個別銘柄を説明するための材料についてさらに進んだ話をすると、IRを自然言語処理に掛けてセンチメントを抽出したり、経営陣の表情や社是を分析したり、サプライチェーンを可視化したりと、世の中の分析はさらに深化している。これは逆に言うと、システム的な運用を考えている個人投資家はチャートばかりに頼っていられないということだ。

話を元に戻すが、財務諸表および価格系列に基づく特徴量は、その更新頻度により以下のように分類できる。当然ではあるが予測には賞味期限が付きまとうので、これらの数値は予測する時点で最新のものに更新しておく必要がある。また、財務諸表については虚偽記載（意図したものかそうでないかはおいておいて）によって高頻度で訂正が入るため、留意が必要である。たしかXBRLではこの履歴も取れたと記憶している（定かではない）。

**(1)財務諸表**
売上高や純利益など原則四半期毎に更新され、デイリーの更新が不要なもの

**(2)価格系列**
チャートのデータであり、当然であるが毎日の更新が必要なもの

**(3)財務諸表×価格系列**
時価総額（価格×発行株数）、PER（価格÷一株益）など、価格に応じて変化が生じる財務系指標


#欠損値の扱い
特に財務諸表のデータにおいて欠損値の割合が多い。ここでは欠損値が発生する理由とその扱い方について考え方を説明する。
###欠損値が発生する理由
まず財務諸表において欠損値が発生する理由であるが、これには会計基準が変更された際に抜けてしまう場合や、業種に応じて使われない会計項目があること、さらにそもそもマイナーな項目（例えば棚卸や販管費など）は報告書を提出する上で必須項目ではないことが挙げられる。マイナーな項目の欠損率は高く、4割以上が欠損となっている項目も存在する。

次に価格系列であるが、当然の話であるが新規上場以前、上場廃止以降の価格データは存在しない。また、経営統合、公開買付、第三者割当増資、管理銘柄指定などによる急な売買停止もこれに該当する。ストップ高やストップ安が発生した場合、データ提供元の仕様によってはOHLCのいずれかの項目が欠損となる場合がある。

###欠損値の扱い方
まず財務諸表であるが、欠損の少ない項目であれば、その項目の仕様の考え方を元に、データが存在する他の項目から類似となる指標を計算することで補完することが可能である。しかし、欠損の多い項目に関してはそういう訳にはいかない。最も単純な方法は、欠損の閾値を取り決めて全体の欠損率が閾値以上となる項目は特徴量として取り扱わない、ということだ。そのように欠損の多い項目は参照しているプレイヤーも少なく価格形成に影響を与えるはずがないとタカをくくればよい。

ただし演繹的に見てどうしても取り入れたい項目であれば、その項目の推定分布からランダム抽出を行って補完する多重代入法と呼ばれる手法や、最近傍法によって近傍のサンプルの加重平均を用いて補完する手法が提唱されている。もしくは類似指標を含めて教師なし学習に掛けて新しい特徴量を作ってしまうやり方もある。

次に価格系列であるが、これは単純で欠損値がある銘柄は異常とみなし完全にサンプルからは排除する。サバイバーシップバイアスを気にされる方もいるかもしれないが、それを気にする必要があるのは価格系指標を用いた逆張り戦略であって、市場構造を学習させる場合にそのような銘柄はサンプルとして全く必要ない。


#特徴量の処理
本章では株式市場の構造を踏まえた上で実践的な特徴量の処理方法について解説する。以下では特徴量の事前処理、外れ値の扱い、数値変換、事後処理の各々について触れていくが、これらを適用する順序には決まりがなく、またその使用についても適宜判断が必要なことに留意しておくこと。

###特徴量の事前処理
株価を予測するためには収集したデータを単純に特徴量として採用するのではなく、線形回帰等を使って事前処理を行うことが重要である。以下に3つの事例を示す。

**(1)相互依存性の排除**
例えばバリュー系の指標であれば時価総額と強い相関を持っている。後段の機械学習モデルが重回帰などの統計的手法であれば特徴量同士の相関はケアしてくれるが、そうでなければ事前に処理を行うほうがモデルフレンドリーである。バリュー系の指標と時価総額を回帰してその残差を取ることで、時価総額控除済みバリュー指標を得ることができる。

**(2)類似指標の合成**
例えばバリュー系の指標にはPER、PBR、PCFRが考えられる。これらの指標は当然ながら強い相関を持つ。これらの指標を全て後段の機械学習モデルに突っ込んでもあまり意味がないので、事前処理として合成を行っておく。
この合成には、線形回帰を使ってウェイトを算出して合成する方法や、PCAを使って第一主成分を採用する方法がある（これも結局ウェイトと同じことになる）。非線形性を考慮したいのであればオートエンコーダやSOMを用いてもよい。著名なリスクモデルでは単純に1:1:1等の固定ウェイトで合成する場合が多いが、事前処理にも統計モデルや機械学習モデルを適用することで、説明力の向上に寄与する場合がある。

**(3)マーケット依存性の排除**
これは特徴量としてスペシフィックリターンなどを採用する際にマーケットリターンと個別銘柄のリターンのタイムシリーズ回帰の残差を取るものである。この事前処理にはその他のマクロ指標も同時に取り入れることで、その他のマクロ指標から受ける影響も排除するとともに、その感応度（為替依存性、原油依存性など）を新しい特徴量として抽出することも可能である。


###外れ値の扱い
まず財務諸表のデータであるが、明らかに常軌を逸した外れ値についてまず処置を行う。明らかに常軌を逸するとは、例えばPBRがマイナスの値であったり、純利益成長率が500%を超えていたりする場合である。これらはいったん欠損値とおいて、項目の仕様に応じてどう扱うか取り決める。例えばPBRであれば単純に0に丸めてもよいし、純利益成長率であればその業界における上限水準に丸める（winsorizeする）ということも考えられる。それ以外の通常の外れ値であれば、後述する数値変換によって処置できる。

次に価格系列の外れ値であるが、まずはマーケットの挙動を確認し、そこから大きく乖離するようであればサンプルから除外して障りない。繰り返しになるが、価格系列の外れ値とは市場構造を学習させる上で邪魔にしかならない。例を挙げてみると、直近のコロナの影響によりマスク関連銘柄が大きく上昇したが、これらを特徴量として取り込んだところで将来的に機能するモデルができるかというと当然Noである。これらのテーマ株を表現するには専用のモデルが必要なのである。

###数値変換
事前処理段階ではこの限りではないが、最終的に後段の機械学習モデルに突っ込む際には各特徴量に対してランク化を行う。後段の機械学習モデルが正規分布を前提とした統計的なモデルの場合は、ランクを強制的に正規分布に変換するランクガウス化を行う。このランク化は基本的にはユニバース全体を対象とするが、一方で業種毎にこれを行うとさらに説明力の向上に寄与する場合がある。

ランク化が有効である理由は銘柄の買い入れ方法に起因する。ETFや投信が売買されるとき、殆どの場合において組み入れ銘柄の選定は関連する指標をもとに上位からバスケット式に選択され（例えば上位50銘柄など）、実際の買い入れ比率は指標の値自体よりも時価総額や流動性が重視される。

つまり、その指標が影響するのは「買い入れするかしないか」だけであって、買い入れの数量には影響しないのだ。よって指標自体の数値を機械学習モデルに取り込むことは、ハッキリ言ってあまり意味がない。このようにETFや投信の仕様、ひいては機関投資家のオペレーションなどを調べることはモデル構築の上で重要な役割を果たす。

###特徴量の事後処理
各々の特徴量についてマーケットインパクトで補正を掛けるかどうか検討する。仮に何らかの事情に基づいてバスケット買いが発生し、各構成銘柄に均等に売買代金が振られるとした場合、その値動きの大きさは一律とはならないのである。

マーケットインパクトの考え方は流動性とは似て非なるものである。マーケットインパクトは隠れ板（成行が発生した後に流入してくる指値）まで考慮した板の厚みの勾配であり、これが大きいほど価格の動きは鈍くなる。また東証は価格帯に応じてティック幅が異なるため、銘柄の価格自体もインパクトへ影響することを頭に入れておかなければならない。

現実的にこれらを正確に反映することは難しいので、値動きや出来高などの指標を組み合わせて類似の効果を持つ補正係数が作れないか検討することになる。


#カテゴリカル変数の処理
株価予測のための最も重要なカテゴリカル変数は業種である。業種分類には様々なものがある。定性的な判断で分類するのであれば、輸出関連株、シクリカル、ディフェンシブなどの分類もできるだろうし、きちんと業種としての取り決めに従って分類するのであればTOPIX17セクター、東証33業種、GICS60などが挙げられる。こうした業種は該当を1、非該当を0とするone-hotエンコーディングを行うことが一般的である。

ただし業種は非常に数が多いため、one-hotエンコーディングでは特徴量の数が増えてしまうという問題がある。この問題を解消するためにPCAなどを用いて次元削減することが考えられる。業種の値動きは市場のリスク選好度によってセクターローテーションが発生するため、比較的キレイな特徴を得ることができる。また前章で説明したように銘柄の特徴量として為替感応度、原油感応度、ゴールド感応度などを抽出しているのであれば、それが大雑把なセクターの代替指標となることもありうる。

最後にもう1つ重要なカテゴリカル変数について。株式市場は時系列で規則性を有している。これは例えばポートフォリオリバランスなど、ある程度決まった周期や時期によって資金の流入、流出が発生することが多いためである。曜日フラグや月末・月初フラグ等を導入することによってこの傾向が現れる場合がある。ただし、これは「月曜に買えばよい」などという単純な曜日効果のようなものではなく、他の特徴量との相互作用の産物として現れるということは言うまでもない。

#おわりに
上記はあくまでも筆者のこれまでの研究によるものであり、必ずしもそうだと言うわけではない。しかし、全て読んで頂いた方には株価予測におけるドメイン知識の必要性が理解いただけたと思う。この分野に興味のある方の参考になれば幸いである。

ざっと書き殴ったため必要に応じて追記修正する予定である。なお、最後のいろはの"は"の章を執筆するかどうかは未定である。