全上場企業の過去５年間の決算情報から機械学習で業績予想

# はじめに

金融庁の[EDINET](https://disclosure.edinet-fsa.go.jp/)というサイトから得た決算情報について、これまで２つ記事を書きました。

* [XBRLから上場企業の決算書の情報を得る。](https://qiita.com/teatime77/items/3ed6d4cd27f6440e163a)
* [全上場企業の過去５年間の決算情報をCSVファイルに変換](https://qiita.com/teatime77/items/e5aa2d9027749768f50d)

今回は前回作った決算情報のCSVファイルから機械学習で業績予想をしてみました。

機械学習は以下の手法を使いました。
* **リッジ回帰**
* **サポートベクターマシン**
* **ランダムフォレスト**
* **XGBoost**
* **LightGBM**
* **CatBoost**
* **全結合NN(ニューラルネットワーク)**
* **LSTM**

EDINETからは５年分(５期分)の決算情報を得られます。

LSTMでは、過去４期分のデータから５期目の業績を予測しました。
LSTM以外では、前期と今期のデータから次期の予測をしました。

※ 有価証券報告書は決算日から３ヵ月くらいあとに提出されます。
&emsp; 最新の決算書の決算日は２０１９年末なので決算情報に新型コロナウイルスの影響は入っていません。

以下の項目の業績予想をしました。
* **売上高**
* **営業利益** &emsp; &nbsp; ＝ 売上高 － 原価 － 販管費
* **経常利益** &emsp; &nbsp; ＝ 営業利益 ＋ 営業外損益
* **税引前純利益** ＝ 経常利益 ＋ 特別損益

上から順に不確定要素が増えるので、予想は難しくなります。

業績予想は次期の変化率を予測します。
つまり、売上高などが次期にどれだけ増えるかの予測です。

結論を先に言いますと、売上高の予測はある程度できますが、それ以外については結構むつかしいです。

# 売上高の予測

以下はLightGBMによる売上高の次期変化率の正解と予測を散布図にプロットしたものです。
![売上高.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/c5632b07-0203-f772-1ae2-f743310d7fe7.png)

変化率は平均０、標準偏差１に正規化しています。

正解の最小値と最大値の部分で縦に点が密集していますが、これは正解値の5%と95%でクリッピングしたためです。

このグラフを見ると、正解の値が大きい点は予測の値も大きい傾向があり、ある程度予測ができていることがわかります。

以下はLightGBMが計算した特徴量の重要度を高い順に並べたリストです。

```
特徴量の重要度
  1   5500 従業員数変化率
  2   4700 総資本回転率変化率
  3   3200 売上高変化率
  4   3100 受取手形及び売掛金変化率
  5   3100 流動負債変化率
  6   2100 その他、流動資産変化率
  7   1900 現金及び預金変化率
  8   1900 総資産額変化率
  9   1800 売上高総利益率
 10   1700 個別期首期末平均資産変化率
```
ここでの変化率は前期から今期への変化率です。
９位の売上高総利益率は変化率ではなく、今期のいわゆる粗利率です。


従業員数変化率がトップというのが少しおもしろいと思いました。
来期に売上高が伸びそうと思った会社は、今期のうちに従業員を増やすみたいです。

# 税引前純利益の予測

以下はCatBoostによる税引前純利益の次期変化率の正解と予測を散布図にプロットしたものです。
![税引前純利益.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/dc4fdd61-0c9f-035a-2588-b07a18a280f9.png)
売上高の場合のような右上がりの相関はあまり見らせません。
ただ、予測値が0.02以上の部分では正解の値はグラフの右に偏在しているように見えます。

同じデータで予測値が0.02以上の部分の散布図を作ってみました。
![税引前純利益-部分.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/ddb74799-243a-9f6e-c3ad-a15f6f8dcc7e.png)
多くの点がグラフの中央よりも右にあります。

企業の業績予想を元に株式投資をする場合、全企業の業績予想が正確にできる必要はなく、業績がよさそうな企業のグループさえつかめればよいです。

例えば、予測値が0.02以上の企業のうち10社に投資した場合、1社や2社は業績が悪くても残りの会社の業績が良ければ、全体として利益が出る確率は高そうです。

ここから先はわたしもよく分かってない[現代ポートフォリオ理論](https://ja.wikipedia.org/wiki/%E7%8F%BE%E4%BB%A3%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E7%90%86%E8%AB%96)の話ですが、ある企業のグループの利益の期待値と分散が分かれば、高い確率で利益が出せるんじゃない？ということです。

# 実行方法

アプリはGoogle Colaboratoryのノートブックで実行できます。
ColaboratoryのランタイムのタイプはGPUなしでかまいません。

* **処理１**  [前処理のノートブック](https://github.com/teatime77/xbrl-reader/blob/master/notebook/preprocess.ipynb)
* **処理２** [リッジ回帰、サポートベクターマシン、決定木のノートブック](https://github.com/teatime77/xbrl-reader/blob/master/notebook/sklearn.ipynb)
* **処理３** [全結合NNとLSTMのノートブック](https://github.com/teatime77/xbrl-reader/blob/master/notebook/TensorFlow.ipynb)

※ **処理１** をしなくても、**処理２**や**処理３** は実行できますが、自分で財務指標などを追加したい場合は**処理１**のノートブックを修正する必要があります。

アプリのソースは前回の記事と同じGitHubに入っています。
[https://github.com/teatime77/xbrl-reader](https://github.com/teatime77/xbrl-reader)

これまでの記事の内容を含めた全体の説明が以下にあります。
[http://lkzf.info/xbrl/doc](http://lkzf.info/xbrl/doc)


# おわりに
もともとはわたしが機械学習を勉強するためのテストデータとしてXBRLから決算情報を得ようとしたのが始まりでした。
今後は機械学習をはじめて学ぶ人でもわかるようなドキュメントを作っていきたいと思います。

まちがいなどがあれば、コメント欄に書かれるかTwitterに連絡をしていただければ助かります。
Twitterでアプリの更新のお知らせもしていきます。
[![Twitter_Logo_White_On_Blue20.png](https://qiita-image-store.s3.amazonaws.com/0/118740/af910f48-8c6b-27cb-7951-eaa6e97afa87.png)](https://twitter.com/teatime77)  [teatime77](https://twitter.com/teatime77)

**ここまで読んでいただき、ありがとうございました。**