機械学習による株価予想の十八手

#概要

株式投資家にとっての当たり前を機械学習アルゴリズムに落とし込むための18の手法を紹介する。
この手法を応用して、Signate主催のコンペで9位（金メダル）を獲得。

#手法一覧

|  No.  |  株式投資の当たり前  |  機械学習アルゴリズムでの工夫  |
| ---- | ---- |  ----  |
|  1  |  株価はサプライズによって動く  |  サプライズ度合を特徴量にする  |
|  2  |  業績数値の単純な変化率では株価インパクトは測れない  |  変化率の分母を企業規模に相当する変数にする  |
|  3  |  インサイダーはいて当たり前と思う  |  「理由なき変動」が決算発表前にあったかを見抜く  |
|  4 | 予想発表時にすべての業績数値を発表するわけではない |  一部の業績指標がnull値だった場合、その変化率を他の指標の変化率で補完する  |
|  5  |  会社業績には季節変動がある  |  季節変動を平準化し、年換算する  |
|  6  |  過去の数値より未来の数値が大事  |  決算と来期予想が同じタイミングで発表されたら、来期予想を重視する  |
|  7  |  業績予想に対する強気度は企業ごとに異なる  |  業績予想の信頼度を定量化する  |
|  8  |  四半期決算と通年予想が矛盾しているときがある  |  四半期進捗度から、通年予想を予想する  |
|  9  |  会計基準が変更になると数値の意味が変わる  |  会計基準が同一の数値間でのみ比較する  |
|  10  |  決算期が変更されるときがある  |  短縮された通年を12か月で換算する  |
|  11  |  まったく価値観の異なる業種がある  |  特定業種銘柄フラグを設ける  |
|  12  |  権利付き最終日前に株価は上がり、権利付き最終日後に株価は下がる  |  権利付き最終日を特定し、前後の日付かの判定をする  |
|  13  |  配当には普通配当と記念配当がある  |  記念配当は一時的なので、価値を間引く  |
|  14  |  配当とともに株主優待がもらえる銘柄がある  |  株主優待も金銭価値に換算する  |
|  15  |  株式分割・併合が起こる  |  数値の連続性の３つの落とし穴に対処する  |
|  16  |  売りが売りを呼ぶときがある  |  下落率が閾値を超えた場合をフラグ化する  |
|  17  | チャート理論に基づいて株価が動くことがある  |  チャート理論をアルゴリズム化する  |
|  18  |  個別銘柄の株価はマクロ相場の影響を大きく受けるが、マクロ相場の予測は困難  |  マクロ影響を除去した目的変数にする  |

#1. 株価はサプライズによって動く
株式相場には常にプロの投資家がうごめいており、各銘柄の各種業績数値を常に予想して投資活動をしている。そんな状況下において、仮に「売上が前年比2倍」という決算が発表されても、株価が2倍になるわけではない。むしろ3倍が予想されていたのに、2倍だったら失望売りとなる。つまり事前予想と比較してこそ意味があり、staticな値や過去実績との比較を特徴量にすることはあまり意味がない。事前予想と決算の乖離、または前回予想と今回予想の乖離こそが意味のある特徴量であると言える。

#2. 業績数値の単純な変化率では株価インパクトは測れない
営業利益の事前予想100億円に対し、決算が200億円の場合、
変化率 = （ 実績 - 予想 ) / 予想
の計算式を使うと、変化率は100%となる。
この変化率を特徴量にするのは一見もっともらしいが、株においてはこれは使いづらい。
営業利益の事前予想1億円に対し、決算が200億円の場合、変化率は19900%となる。
営業利益の事前予想0億円に対し、決算が200億円の場合、変化率は無限大となる。
営業利益の事前予想▲100億円に対し、決算が200億円の場合、変化率は-300%となる。
これらは明らかに、決算が与えたインパクトを表現できていない。
実績と予想の差額であるサプライズ金額の重みが銘柄によって異なるので、それを補正するような適切な分母を考えるべきである。時価総額だったり、数年間の売上の平均値だったり、企業規模を類推できるような数値を分母にすることが望ましいと考える。
また、赤字が黒字になったことなどを特別扱いするために、別途フラグを用いるのがよいと考える。

#3. インサイダーはいて当たり前と思う
インサイダー取引は処罰の対象であるが、実際に株取引をしていると、何の材料も出ていないのに株価が急騰する場面によく出くわす。明らかにどこかで情報が漏れており、不当に利益を得ている方々がいるのであろうと思わざるを得ない。例えば好決算発表が事前に漏れている場合には、好決算発表とともインサイダーによる売り浴びせが待っている可能性がある。
であれば、インサイダーの存在も織り込んでアルゴリズムを組む必要がある。つまり、好決算発表前に「理由なき」大幅上昇がなかったかを見抜く必要がある。

#4. 予想発表時にすべての業績数値を発表するわけではない
決算短信において、事前に業績予想を発表するときがあるが、このときに営業利益の予想は出しても、経常利益の予想は出さないときがある。つまり、データとしては欠損値が発生することになる。これを欠損値のまま放置する手もあるかもしれないが、機械学習に落とし込むときには使い勝手が悪い。最悪の場合、せっかくの営業利益のデータまで過小評価されてしまうリスクがある。このような場合には他の業績数値の変化率で置換をするというのが手っ取り早くもっともらしいと考える。例えば、営業利益が前期比2倍だった場合、経常利益も前期比2倍だろうと類推し、その数値で欠損値補完をするのである。
どの業績数値をどの業績数値で補完すればよいかは悩むところであるが、以下の並び順で考えて、隣接している上位の数値で補完するのがよいと考える。

売上⇒営業利益⇒経常利益⇒最終利益

#5. 会社業績には季節変動がある
Q1の売上が100億円だったからと言って、年間売上予想が400億円前後だろうとは言えない。企業ごとに業績には季節性があり、例えば「Q1の売上がQ2の1.5倍程度であることが多い」等の傾向がある。逆に言えば、企業の年間の業績推移の傾向を捉えて係数化しておけば、四半期決算から年間決算を予想することも可能になるのである。

#6. 過去の数値より未来の数値が大事
決算発表前は今期の決算はどうなるかとやきもきするのだが、いざ決算が発表されると、前期はもういい、大事なのは来期だ、と急に価値観が切り替わる。株価とは常に現在から将来にわたる企業価値を反映するものだからである。もちろん、前期の決算があまりにひどいと、資金繰り悪化で破綻するリスクが高まったり、将来展望も下方修正するリスクも出てくるので無視はできないが、決算と来期予想が同時に発表される場合には、来期予想を重視するほうがよい。

#7. 業績予想に対する強気度は企業ごとに異なる
同じ売上予想100億円でも、A社とB社が発表した場合で市場の捉え方は異なることがある。A社は強気な予想をしがちで後々下方修正することが多い、B社は保守的な予想をしがちで後々上方修正することが多い、と経験則から判断する投資アナリストは多いのである。実際の決算がどうなれど、予想発表時点でそのようなフィルタをかける市場関係者が多いのであれば、それもファクターとして考慮すべきである。各企業の過去の予想と実績の傾向を分析し、予想の信頼度を定量化すべきである。

#8. 四半期決算と通年予想が矛盾しているときがある
Q3の利益が予想の3倍などとサプライズ決算が出たにも関わらず、「通年の予想は変更無し」としれっと書いている決算短信をみかける。これは本当に通年の業績に影響がないのではなく、通年予想の更新が間に合わなかったか、あるいは意図的に変更をしなかったという場合が多いと見ている。実際にその後すぐに通年の上方修正をするというケースがある。であれば、四半期決算に基づいて、通年予想が修正されることを先回りして予想するという戦術が有効となる。

#9. 会計基準が変更になると数値の意味が変わる
昨年と本年で会計基準が変更になったことで、突然最終利益が数十パーセント増加、ということがある。これを額面どおりに取り入れてしまうと、会社の業績は好調だから買い、というような判断になりかねない。連続性を持たせてはいけないのであり、会計基準はGroupByのキーのひとつに組み込むべきである。つまり、会計基準が変わったら、もうそれは別の会社の決算と思った方が無難だと考える。

#10. 決算期が変更されるときがある
機械学習エンジニアには迷惑な話であるが、決算期（決算する月または日）を変更するときがある。これまでは6月が決算期だったのに、今年から3月に変更となった場合には、今年の業績は9か月分しかない、となる。月数や日数で補正をして12か月分に換算しなおさないと計算が狂ってしまうのである。

#11. まったく価値観の異なる業種がある
例えば、創薬ベンチャーのように、毎年大幅赤字の連続だが株価は絶好調というような特異な業種が存在する。創薬ベンチャーの場合には、一発当てるという長期的な夢に基づいて株価が形成されているのであろう。このような特異業種を通常の業種と混ぜてしまうと、法則が狂ってしまう。one-hotベクトルなどで特別扱いするか、初めから分析対象から外すなどの対策が必要となる。

#12. 権利付き最終日前に株価は上がり、権利付き最終日後に株価は下がる
配当を設定している銘柄であれば、権利付き最終日に株を保有しているだけで配当金がもらえる。（配当金額の決定は決算発表時なので、権利付き最終日時点では本当にもらえるかは不明であり、予想配当金額を信じるしかないのだが。）
となれば、普段は保有していなくともその日だけ保有しようというにわか投資家がやってくる。配当欲しさに多少の高値でも株は買われるので、株価は上がることが多い。なるべく安値で仕入れたいと思う投資家は権利付き最終日より少し前から仕込んでおこうとなるので、結果的に権利付き最終日以前の一定期間は株価が緩やかに上昇する傾向もある。逆に権利付き最終日を過ぎたら、配当がもらえるだろうと見込んで、多少の安値で売却しても元がとれると思い、株は売られる。配当金額が大きい銘柄ほど株価の下落幅は大きくなる。これはかなり手堅い法則であるため、アルゴリズムにも組み込む必要がある。少なくとも、今日という日は権利付き最終日にどれだけ近いのか、前なのか後なのかは考慮すべきファクターとなる。
上記実現のために、面倒ではあるが、東証の休日カレンダーを準備する必要がある。月の最終営業日起算で営業日数ベースで権利付き最終日が決まるからである。年末年始など変則的なので、通常の祝日カレンダーでは対応できないし、日本の祝日も毎年のように変わるので、最新の情報を参照しないといけない。
また、2019年7月18日より前は、月の最終営業日から3営業日前が権利付き最終日であったが、それ以降は月の最終営業日から2営業日前が権利付き最終日となるので、ロジック対応が必要になる。

#13. 配当には普通配当と記念配当がある
これまで配当金額が年10円だったのに、突然今年は100円となるときがある。創立100周年記念だから特別に奮発するというような時である。この背景を知らないと、A社の配当は10倍になった、高利回りだから買いだ、という判断をしてしまう。一過性のものであるので、額面どおりに受け取らず、金額の平準化を図るべきである。問題は記念配当なのかの判断が難しいということである。筆者の知る限り、テーブルデータでそのような項目を取得するのは難しく、某情報サイトでスクレイピングをするか、自然言語処理に頼らざるをえない。次善の策としては、ある一定の上昇率や上昇幅であれば、記念配当とみなして価値を間引く、という方法がある。

#14. 配当とともに株主優待がもらえる銘柄もある
飲食、観光、交通、小売など、特にBtoC業界においては、配当以外に株主優待を設定している企業は多いが、株主優待目当ての投資家も多い。某有名レストランの食事代金が20%OFFになるクーポンがもらえるとなれば、人によってはそこに1万円の価値を感じ、その優待をもらえる最低の投資額から考えて数千円分の株価下落があろうともトータルで得なので安値でも売るという行動につながる。
であれば、株主優待を金銭的価値に換算し、その金額が大きいほど権利付き最終日後に株価が下がる可能性が高いということも考慮すべきファクターとなる。ただし、これは定量化が非常に難しいタスクである。株主優待のデータを取得し、投資金額に応じた株主優待の種類を把握し、株主優待から各投資家が感じる金銭的価値の期待値を算出しないといけないのである。Quoカード500円がもらえる優待であれば、価値は500円と考えても差し支えないだろうが、「当社カタログの全商品が10%OFF」のような優待の場合、その価値は人それぞれであろう。

#15. 株式分割・併合が起こる
保有している株の枚数が、1枚だったのに自動的に2枚になったり（株式分割）、2枚が1枚になったりする（株式併合）。1⇒2の株式分割の場合、通常それが発生した直後は株価は半分になる。トータルの価値は変わらないのである。この仕組みを理解していないとある日突然株価が半分になるという怪奇現象を鵜呑みにすることになり、法則が狂う。たいていの株価データは、過去日付の株価を最新の株式数に応じた数値に補正してくれているものなので、通常は意識しなくてもよいが、落とし穴が３つある。
ひとつ目は、過去に取得した株価データに、新しい株価データを差分として追加する場合。当然過去に取得した株価データは補正されていない状態なので、新しい株価と結合すると連続性が失われる。この場合は再度過去分まで取得しなおすほうが手っ取り早いことが多い。
ふたつ目は、過去分の配当利回りが狂うことである。株式分割に合わせて、過去の配当金額まで補正してくれていればよいのだが、補正をしてくれているデータとしてくれていないデータが世の中には存在する。補正をしていないデータの場合、過去の配当金額は30円で、その時の株価は3000円だったので、当時は利回り1%だったが、株価だけ株式分割で補正されて過去の株価データが1500円に変更されているが、過去の配当金額は30円のままで、利回りは過去は2%だったとなってしまう。このようなデータの場合には自分で補正をせざるを得ない。
３つ目は、その日の値幅上限がわかりにくくなることである。株価によって一日の上昇・下落の値幅上限は決まっているが、株価が補正されていると、その日の株価の動きが値幅上限いっぱい（ストップ高・安）だったのかどうかはわからなくなる。結局はオリジナルの株価がいくらだったのを計算しなおさないといけなくなる。

#16. 売りが売りを呼ぶときがある
株価予測をアルゴリズム化するときには、時系列データとして考える方が多いようだが、筆者はその側面はあまり重視しない。時系列とは突き詰めると、上がったらまた上がる、上がったら次は下がる、という考えに行きつくと思うが、そのような法則は信頼性が低いと思っている。インデックス投資をされる方は、日経平均などは長期的に見れば上昇基調なので、上がり続けることは間違いない、と思っている方も多いようだが、それも所詮は数十年単位での傾向に過ぎず、もう少し長いスパンでどうなるかはデータもないし、かつ人の一生と比較した場合には気長すぎる法則であると考えている。
ただし、株式市場の性質上、短期的な株価の動きが次の株価を決めることはあると考えている。○○ショックと呼ばれるように、下落が止まらなくなる現象が時折発生する。毎日下落幅が倍くらいのペースで数日間下がり続けることがあり、この場合はさすがに前日の株価下落幅が本日の下落の要因であると思わざるを得ない。
このメカニズムの原因の証明は難しいかもしれないが、筆者は信用取引の存在が大きいと考える。信用取引には、買いと売りの2種類があるが、このうち信用買いとは自身の現金または現物株を担保に借金をして株を買う行為である。当然借金なので、借入額に上限がある。現金よりも現物株のほうが担保能力は低い。そして、一定の閾値を超えたら証券会社は強制決済を執行する。そうすると、ある程度マクロ相場が下落すると、売りたくないのに売らざるを得ない投資家が出てくる。彼らが売ることで株価が下がると、それまでは信用枠に余裕のあった投資家まで売らざるを得なくなる。「パニック売り」「狼狽売り」と呼ばれたりするが、心理的にパニックになるというよりも、仕組みがそうさせているというほうが妥当だと思う。
そうであれば、パニック売りが発生するような条件をアルゴリズム化すればよい。短期的なマクロ相場の値動きがファクターとなりえると考えている。

#17. チャート理論に基づいて株価が動くことがある
チャーチストと呼ばれる投資家がいる。株価チャートの形状を頼りに投資をしている投資家を指す。「このようなチャートの形状が発生すると、このような値動きになることが多い」というなんとも眉唾モノの法則があるのだが、実際にそれを信じている人が一定数いると、彼らが本当にその理論に基づいて売買をするために、結果的に法則どおりの値動きになってしまう、ということが少なからずあるのだろうと筆者も考えている。
そうであれば、根拠が乏しくも大勢が依存しているチャート理論があれば、それもアルゴリズムに組み込むことが得策となる。

#18. 個別銘柄の株価はマクロ相場の影響を大きく受けるが、マクロ相場の予測は困難
どんなに個別銘柄の業績が良かったとしても、相場の地合いには勝てないことが多い。マクロ相場は個別銘柄のパフォーマンスにとって重要なファクターであることは間違いない。しかし、マクロ相場を予測することは非常に困難であると考えている。だったら、むしろマクロ相場を予測することはあきらめたほうがよい。ただし、過去の銘柄の値動きを説明するときにはマクロ相場の影響も考慮しないと誤差が大きくなる。そこで筆者が考える手法は、マクロ相場の値動きを説明変数にするのではなく、目的変数から控除してしまうというものである。


```math
(本来) \ \ \ \ \ \ \      y = a + bx_m + cx_1 + dx_2
```
```math
(代替案：訓練時) \ \ \ \ \ \ \      y - bx_m = a + cx_1 + dx_2
```
```math
(代替案：推論時) \ \ \ \ \ \ \      y = a + cx_1 + dx_2
```
```math
y: 個別銘柄の変化率
```
```math
x_m: マクロ相場の変化率
```
```math
x_1, x_2: その他の説明変数
```
マクロ相場の変化率の期待値は、データが多いほど0に近づくはずであるという仮説のもと、その他の説明変数のみで個別銘柄の変化率との相関関係を炙り出そうという試みである。
推論時には、マクロ相場の変化率は、誤差として受け入れる覚悟である。
実際には、マクロ相場の変化率を全銘柄の変化率と業種ごとの変化率に分けることも有用であると見ている。

#実証実験
Signate主催のコンペ[「日本取引所グループ ファンダメンタルズ分析チャレンジ」](https://signate.jp/competitions/423
)に参加し、上記の手法を応用してみた。決算短信発表後20営業日以内における個別銘柄の最高値・最安値を予測するというコンペである。評価指標がスピアマン順位相関係数であるため、実際には絶対的な株価の予測ではなく、相対的な上昇しやすさ、下落しやすさの予測とも言える。
一部の手法においてはデータ制約から代替案を使用したりもしたが、18の手法をほぼすべて取り入れることができた。
最終順位は9位で、金メダル獲得となった。（総投稿者数211名、参加者数1443人）
上記の手法がある程度有効であると確信を持つことができた。
結果的には、上位者のスコアには及ばないスコアとなったが、筆者のスコアは他者のスコアよりも対象期間が長くなるほど大きく改善するという傾向があったように感じており、より長期の期間の場合には定常性が確認できるのではないか、というポテンシャルを感じ、今後も研鑽していく所存である。

#上記コンペのソースコード

コンペのルールにより、データ自体の提供はできないため、実行することはできないですが、雰囲気だけでも掴んでいただければ幸いです。
https://github.com/heegle/JPX_fundamental

#株価予測における機械学習の有用性
アルゴリズム株取引はかなりブームであるようだが、筆者は未来永劫有用なモデルが開発できるかどうかには懐疑的である。なぜなら、株価を形成するのは結局市場参加者であり、「この通り売買したら儲かる」というモデルが普及することにより、それが市場参加者の行動を変え、結果として旧来モデルどおりの動きではなくなると信じるからである。複数のAIが自動売買を繰り返す世界ではなおさらである。
しかしながら、現代においてはまだまだ自身の判断に頼る投資家は多く、かつ特に日本市場においてはそれは顕著であると思う。であれば、そこには何らかの法則が残っており、機械学習で儲けのアルゴリズムを見つけ出すチャンスはまだまだあるのではないかと考えている。
株以外のコンペで優秀な成績を出している参加者が、今回のコンペでも優秀な成績を残していることがそれを証明しているように思う。つまり、株は博打ではなく、サイエンスが入り込む余地があるのだ。
興味がある方は、JPX（日本取引所グループ）が提供する東証APIサービス等を活用して、予測モデルを構築してみるのがよいと思う。