Pythonを用いて株価予測を行ってみよう!その1(ニューラルネットワークを動かしてみた)

こんにちは。蝉の店です!

最近は家業であったり家事をしたり資格を取ったり弟に宿題教えたりでそこそこ忙しい毎日を送っていますがまぁ楽しく過ごしています。遊びも欠かしていません。

職場では、研修期間を終えていよいよ配属となりました。心機一転頑張っていきたいと思います。職場ではJavaを使うようです。

クラスや継承、カプセル化などの概念をようやく理解し始めた初心者プログラマーではありますが、ポチポチとキーボードをたたきながら勉強を進めています。

私は正直勉強はそこまで好きではないので、必要最低限の勉強が終わればすぐに応用に入って実際の生活に役立てるようにしたいですね~。

では本題に入りましょう。私は現在Pythonで機械学習、もっと言えばニューラルネットワークの勉強をしています。

ニューラルネットワークの勉強として使っているのがこのホームページです。友人に教えてもらったのですが数学的理論がしっかりしているし、とても分かりやすいです。

このサイトは、線形代数や偏微分などの数学的知識がないと少々きついかもしれません。私は現在ニューラルネットワークを学ぶための数学の教材(JupyterNotebook)を作成しています。完成したら公開しようと考えています。

そしてそのニューラルネットワークを用いて、私は株価予測をしたいと考えています。不労所得ほしい。

私が使っている環境は、Python3.7でJupyterNotebookを使っています。JupyterNotebookは対話型の開発ツールで、単にコードだけではなくMarkdown形式で文章やLatexを使って数式まで入力できてしまいます。

教えてくれた同期には足を向けて眠れませんね。

私は若干の数学的知識はあるので、基本的にはコードを読んで理解して実装するという流れで勉強しています。

ニューラルネットワークでは、学習用データとテストデータに分かれていて教師あり学習です。今回は学習用データとして、2013年から2016年度までの株価の終値、テストデータとして2017年から現在までの株価の終値を導入しています。

今回はタイトルにある通り、10日間の終値のデータからその次の日の株価が前日より上がるか下がるかを予測します。

先に行っておきますが、今回の結果は予測すら成立していません。しかしそんなさんざんな結果でも良ければ最後まで見ていってください~。

もしこれがうまくいけば、次の日に株価が上がるタイミングで株を買って、次の日に株価が下がるタイミングで株を売れば儲けることができます。もちろんそんな上手くいくわけはないんですけどね。

とある3銘柄の10日間の株価の終値をinputデータとします。その中で隠れ層を定義して(隠れ層は1層のみで、40個のニューロンとします)、outputとしてとある1つの銘柄を①前日比2%以上上昇、②前日比2%未満上昇、③前日比2%未満下降、④前日比2%以上下降のどれかを予測します。

その3銘柄は取引先の関係で主要株主となっている企業を選択しました。他にも原油価格や日経平均株価などもinputデータとして入れると良いかもしれません。

学習データとして2013年から2016年までの終値を学習させます。テストデータは2017年からつい最近までの終値の株価を予測します。ソースコードも載せようかと思ったのですが煩雑になってしまうので、次回以降紹介しようと思います。まぁ今回のテーマは動かすだけですし。

世代数は1000まで行いました。過学習?知らない子ですねぇ。その他のパラメータは次回以降紹介できれば。

ひとまずは結果のみ。


画像3

画像3

画像2

一番上の数字がテストデータに対するコスト関数の値で、CMと書かれているのがconfusion matrixという行列です。

行成分が予測を表しており、列成分が正解データです。つまり対角成分が予測と正解が一致していてそれ以外が不正解です。順番はそれぞれ上、左から①前日比2%以上上昇、②前日比2%未満上昇、③前日比2%未満下降、④前日比2%以上下降です。

1枚目の画像でわかる通り、なぜか全てのテストデータinputに対して全て②前日比2%未満上昇と予想していることがわかりました。これはバグなんですかねぇ・・・。原因究明しなくてはなりません。

世代数が増えるごとに徐々にCMにばらつきが生じています。学習が進んでいる証拠ですかね。ここはひとまず安心しました。またコスト関数の値も単調減少で推移しているので順調のような気もします。

しかし肝心の正答率はほとんど伸びません。一見正答率が30%超えているので良さそうな気もしましたがCMを見てこれはいい結果とは到底言えません。解析が必要です。この傾向はいくら世代数を伸ばしたところで変わりませんでした。

コスト関数は減少しても正答数の改善は見られない。このことは株価変動がランダム性が伴っていることと関係するかもしれません。もちろん学習機の性能が悪いかもしれません。多分両方ですね。

次回は様々な側面(コスト関数の改善、初期値問題、グラフによる視覚化など)から解析したいと思います。また一部分ソースコードも載せて考察したいと思います。

それではまた!






この記事が気に入ったらサポートをしてみませんか?