CodeLab技術ブログ

プログラミング技術まとめ

tensorflow+kerasでLSTMによる株価予想をやってみた

tensorflowをインストールしてみて、サンプルを動かすのに飽きたので何かやってみようと思ってネタを探してみました。
株価の予想をしている人も結構いるようで、googleの中の人もチャレンジしているようです。
FinancialTimeSeriesTensorFlow

というわけで私もチャレンジしてみました。
同じことをやってもあまり面白くないので、手法を変えてLSTMでの予想を試してみました。

LSTMってなに?

LSTM(Long short-term memory)はRNNを改良した学習モデルで、連続した時系列データを扱うのに適したモデルです。
株価も時系列データなので使えるかも?と思った次第です。

keras

早速コードを書いてみたいのですが、正直tensorflowのAPIはさっぱりわかりません。
サンプロコードの改造をしてみたのですがなかなかうまくいかないので、Tensorflowのラッパーライブラリである、kerasを使ってみました。

ちょうど、LSTMのサンプルが公式にあったのでこちらを改造することにしました。
stateful_lstm.py

kerasですが、素のtensorflowに比べて格段にコード量が少ない&わかりやすいと思いました。
将来的にtensorflowに取り込まれるようなので、こういったものはAPIがころころ変わるのが常ですが、それでも今からやっておいて損はないと思います。

学習データ

日経平均のデータを使用
1980年代から現在までの約7000日分のデータを入れました。
入力データは価格自体に意味はないので、始値、高値、安値、終値の4つを前日の終値で割った騰落率を入力データに使用し、4次元のデータを与えた。
出力データは翌日終値の騰落率(1次元)と翌日終値の暴落率が一定範囲内(例えば±1%とか)で値上がり、値下がり、変わらずの分類(3次元)の2パターンでやってみました。

惨憺たる結果…

書きなぐったコードしかないのでお見せできるものがなく申し訳ないのですが、結果だけいうと大失敗でした。
何がどう失敗かというと、何を入れても同じ結果しか返さないモデルしかできませんでした。

ハイパーパラメータをいろいろ変えてみたのですが、どうやっても正解率が50%前後。
こんなものかな…とおもって、予想データを見てみたのですが、
騰落率予想では全部ほぼ同じ値を、3値分類法では、全部値上がりか値下がりの予想をしていました。
いみないじゃん(笑)

というわけで・・・

何の成果もえられませんでしたぁぁぁぁ

まぁ、kerasのいじり方がちょっとわかったので、何の成果もないってことはありませんが、残念な結果ではあります。

考察

なぜこうなったか考えてみます。

・LSTMでは無理なのかも&パラメータが適切ではない。
・教師データが少なすぎる※今回のデータが8000件なのに対し、サンプルコードでは5万件のデータを使っている。
・次元を増やしたらいいかも?ほかの指標とか移動平均線とかも入れてみるとか?
・数日間の値動きから予想するんなら数日分のデータを多次元で渡したほうが良くね?
・そもそも、株価は機械学習では予想できない。まぁ、できたらみんなやってるだろうし。

次回やってみたい事

LSTMをやめて多層パーセプトロンでやってみる
教師データの数を増やす&次元を増やす
増やす方法についてはほかの指標や株価なんかも入れてみるのがいいかもしれません。
グラフの形から予想する、ということであれば似たような相関関係を持った指標であればそのままマージしても大丈夫な気がします。
次元を増やして移動平均とかテクニカル指標なんかも入れてみるのもよいかもしれません。

ただし、あまり次元を大きくしすぎると、次元の呪いという現象が発生するようです。つまり大きすぎると計算量が爆発的に増えて学習効率が下がる…というようなことらしいです。
とはいえ、画像に比べればはるかに少ない数。よくある画像識別のciraf10の例だと、32*32*3で約3000次元なのでそれより少なければ何とかなる…のかな?

あとは、株価以外の数値データの予想もやってみたいところですが、良いデータがないのがネックです。

コメントは受け付けていません。