この記事はラクス Advent Calendar 2019の最終日25日目です🎄
ブログの動機
折角のアドベントカレンダー。しかも記念すべき最終日!!技術の事だけでなくアドベントカレンダーにちなんだ事が書きたい。でも「企業・団体」のカテゴリでちなんだ事って無理じゃね。。。そもそも会社の事熱く語れるようなキャラでもないし、、、
と言う訳で、某社の株価予測でもしてみようかと思ったのがキッカケです。尚、今回のブログ記事で作成したコードはGitにあげています。
https://github.com/spider-man-tm/stock_price_predict
今回は基本的なモデルと簡易なコードで株価予測をしています。
使用したデータセットと簡単な可視化
今回はこちらのサイトから、株価情報をダウンロードさせて頂きました(株式投資メモ 株価DB)。多くの企業の株価情報をダウンロードできるかなり優良なサービスです。コード上は過去何年分を突っ込んでも良いのですが、今回は2015年〜2019年のデータを使用しています。(CSVとしてダウンロード可能なデータがそれだけでした。)
なんだか想像していたのと違う!?なぜかYhooファイナンスでみた情報と違っている気が。。。調べてみるとYahooファイナンスで描かれているプロットは株式分割を考慮していますが、株価DBの情報はあくまでも生の株価情報のため、分割の度に大きく値下がりしている様です。尚、株式分割では実質的な株の価値は下がりません。
(補足)株式分割とは?
ブログとは全く関係ありませんが、株式分割について軽く説明します。以下、引用です。
株式分割とは
株式分割とは、会社が発行済の株式を一定の割合で分割して、株式数を増やすことです。例えば、A社の株式を100株持っていて、A社が1株を2株に分割すると、持株数は200株と2倍になります。1株に対してもう1株が無償で割り当てられるのです。1株を2株、3株など整数倍だけでなく、1.2倍、1.5倍にするなど小数点を含む分割もあります。
ただし、1株を2株に分割しても会社そのものの価値は変わりませんので、結果的に1株あたりの価値(株価)も半分になります。ですので、持っている株式の資産価値は変わりません。
引用元)株式分割で株価が上がるとは限らない!値動きパターンをチャートから読み解く
それにしても初っ端からいきなり生々しい図が出てきました。今頃ですが、こんな記事をエンジニア向けブログに書いて、会社の偉い人が何か言ってこないか心配になってきました。。。
さらに、終値の前日差をプロットしてみます。
大きな下落は株式分割がされているタイミングです。尚、上図二つはソースコードの plot.py
を実行すれば出力されます。
モデルの概要
ディープラーニングのフレームワークはPyTorchを使用しています。ソースコードですが、モデルのクラスをmodel.py
、基本的な変数をconfig.yml
で定義しています。モデルの学習コードがtrain.py
、推論コードがeval.py
です。今回は11月20日までのデータから将来30日分を予測してみようと思います。また10日分のデータを入力して、次の1日を推測するネットワークになっているので、後半になればなるほど予測の精度も下がっていくことが予想されます。
尚、LSTMについての説明は以下の記事などが参考になると思います。
結果
まずはLossの推移です。
LossはMSEで取っています。データをMinMaxで正規化しているので、数字だけ見てもどれほど剥離しているのかイメージしにくいかもしれません。次に学習済みモデルを使ってValidation Dataを正しく予測できているのか検証してみたいと思います。
楽観的な予測結果が出ていてある意味ほっとしました。(色々な意味で)
これまた楽観的な結果で安心しました。(色々な意味で)
尚、ブログを書いているのが11月24日でこのブログが公開されるのは12月25日のクリスマスです。因みに12月25日の株価は 2,521 円まで値上がりするとの結果が出ています。気になる方は調べてみても良いかも。
考察
- 株式分割を考慮したデータの方がより正確に予測できる可能性がある。
- そもそも、Validation dataの数が少ないので、データ全体に占めるvalidation datasetの割合をもう少し多めに取っても良いかも。そうでないとモデルの正しい評価がしずらい(上記モデルは100エポック中、Validation Scoreが最も高いものを採用しています。)
- 10日分の入力データから次の1日(1足分)を予測したが、もう少し大きくwindow(入力サイズ)を取った方が良いかもしれない。
-
train.py
実施後、saveされたモデルで推論を行なったが、本来であればValidatation dataとして使用した直近のデータを含めて再学習させた方がより良い推論結果になる可能性がある。