LSTMで株価予測(Heroku,Python)-LSTMモデル構築-

プログラミング

以下の続きです。

LSTMで株価予測(Heroku,Python)-データスクレイピング-
目標は機械学習を用いて株価予測ロジック作成すること。いつでもどこでも予測結果を見れるようにすること。(可能なら)自動売買できるようにすることの3点です!

前回までで、株価データを取得するところまではいきました。今回からは、LSTMを用いた株価予測ロジックをPython・Chainerで実装していきます。最後に完全コピペで動かせるソースを載せます。

Pythonを用いた株価予測LSTMモデルの構築

その1で決めた通り、今回はニューラルネットワークとランダムフォレストを使ってみます。今回扱う株価データは終値にせよ始値にせよ時系列データとなります。時系列データを扱う場合、ニューラルネットワークの一種であるLSTM(Long Short Term Memory)を用いるのが適切と思われます。LSTMの一般的な説明は、Qiitaにあがっている以下の記事をご参照ください。

わかるLSTM ~ 最近の動向と共に - Qiita
Machine Learning Advent Calendar 2015 第14日です。去年のAdvent Calendarで味をしめたので今年も書きました。質問、指摘等歓迎です。 # この記事の目的  ここ2~3年のDeep ...

さっそく、LSTMロジックをPythonで構築していきます。

インポートするもの

今回、ざっくりインポートするものは、Chainerライブラリとsklearnライブラリです。Chainerとは、Pythonでディープラーニングのプログラム実装の際に使用できるフレームワークの一つです。Chainerは日本の機械学習ベンチャー企業により開発されており、日本国内では非常に人気のあるフレームワークとなります。

株価データの取得

次に株価データを取得します。その1でご紹介した、日経株価データ取得関数(jstock())を適用し、pandaデータフレームに落とします(ここではその1でご紹介した日経株価データ取得関数をサブモジュール化(read_nikkei.py)しインポートしています。)。

また、ここでは取得した株価データのうち、CloseとAdj Closeが二つとも終値のため、Adj Closeは落とします。

次に、翌日の始値を別データフレームでコピーしていき、最終的にdf_orgに引っ付け、カラムを更新します。要は、翌日の始値を予測するため、当日の株価データと翌日の始値をセットにします。

株価データの正規化および訓練・テストデータ分け

次に、先ほどの株価データを正規化します。正規化に関しては以下にて説明がありますので、興味のある方は見てみて下さい。

今回は、min-max正規化を用います。

次に株価データをLSTMに入力するため整形していきます。

ここでやっていることを絵にすると、こうなります(M=5の場合)。

終値(Close)

説明変数(x)

目的変数(t)

3月27日

3月28日 3月29日 3月30日 3月31日

4月1日

3月28日

3月29日 3月30日 3月31日 4月1日

4月2日

3月29日

3月30日 3月31日 4月1日 4月2日

4月3日

3月30日

3月31日 4月1日 4月2日 4月3日

4月4日

3月31日 4月1日 4月2日 4月3日 4月4日

4月5日

つまり、ある日のデータセットはその日の終値とそこから、M日前までの終値となります。簡単のために、ここでは終値のみしか使用していません。このデータセットを用いてLSTMに学習させることになります。

次に、訓練・テストデータの個数を決め、データを分割しましょう。

LSTMモデルの定義

LSTMモデルを定義します。LSTMモデルに関しては以下を参考にさせていただきました。

https://aripy.net/python/stockscience/chainer-01/#LSTM

LSTMは少し特殊なディープラーニングであり、正直よく理解していません。一般的なディープラーニングの説明は以下が一番わかりやすいと思います。実装ベースのディープラーニングが理解できると思います。

Chainerのソースを解析。順伝播と逆伝播の仕組み | コード7区
Function の forward メソッドで順伝播、backward メソッドで逆伝播を処理します。順伝播では、各レイヤーごとの出力が、次のレイヤーの入力になります。逆伝播の処理は、順伝播で生成したインスタンスを逆からたどるように行います。パラメータ更新はOptimizer が行います。

次に、LSTMを使う上でのハイパーパラメータ等をセットしていきます。

LSTMモデル 学習の実行

セッティングが終わったので、LSTMに学習をさせます。学習では、ディープラーニングモデルの”重み”や”バイアス”といったものを誤差逆伝搬法と言われる手法を用いて決定していきます。

LSTMモデルの検証

まずは、LSTMに入力するデータおよび教師データを、LSTM構築時のように分割します。

次に学習済みのLSTMモデルにテスト用の入力データを与え、終値予測を実行します。

ここで、t_scaler.inverse_transformは正規化戻しになります。同じく、実績データも正規化戻しを実行します。

この時点で、test_tには終値実績がtest_yyにはLSTMによる終値予測結果が格納されていますので、グラフに書いて比較してみましょう!

LSTMによる株価予測結果

actualが終値実績(test_t)、preがLSTMによる予測結果(test_yy)になります。お!一見すると、良さそうな気もしますが、、、予測結果が実績に遅れて出てきているような感じがします。実はこの結果はある意味当然です。というのも、LSTMに与える入力変数として、前日までの終値を使っているためです。予測精度の良さを決めるには、株価の上げ下げ予測があっているか(正答率)を見てやる必要がありま

という訳で、正答率を計算してやります。

正答率の結果ですが、、、

49.5%(;´・ω・)

となってしまいました。ランダムに上げ下げ予測するのと何も変わりません(;´・ω・)

とりあえず突貫で作ったLSTMモデルですが、大した結果になりませんでした。一旦はこれを受け入れ、次からは株価予測サイトの構築に入ります。モデル改善に関しても、また別記事でご紹介したいと思います。

コメント