1. HOME
  2. ブログ
  3. IT技術
  4. 【後編】ディープラーニングで株価予想!【Python】

【後編】ディープラーニングで株価予想!【Python】

【後編】ディープラーニングで株価予想してみる!

【前編】の続きとなります。

今回は、ディープランニングを用いて株価予想を行い、その結果を受けてモデルの改善をしていきます!

前回の記事はこちら

ディープラーニング実践

まず下準備として、モデルの過学習を防ぐために、以下のようにコールバックを設定しましょう。

EarlyStopping の引数を簡単に説明すると

  1. monitor: どの値で過学習を判断するのか
  2. patience: どのくらのエポック数改善しなければ学習を終了するか

株価は、1、2エポック学習が進まなくても、その後急に改善することがあるので、 patience=5 に設定しました。

モデルのパラメータを学習させてみる

では、いよいよモデルのパラメータを学習させましょう!

とは言っても難しい作業はなく、以下のように model の fitメソッドを呼び出せばいいだけです。

ただし、model_2 を学習させる際は、次元を一つ増やすために、入力用テンソルを X_train[:,:,np.newaxis]  としていることに注意してください。

model_1

model_2

学習終了

EarlyStopping が作動し

  1. model_1は17エポック
  2. model_2は14エポック

で学習が終了しました。

今回は「バッチ数10」「エポック数50」で行いました。

ですが、適当なので、自分で行う際は変えていただいて構いません!

学習の過程を見てみると、どちらのモデルも「loss」が減っていて学習が上手く行われていることが分かります。

結果

テストデータで結果を図示してみましょう。

上手く予想できているのでしょうか…

model_1の予測

model_2の予測

見た感じ、model_1の方が予測の精度がよさそうです。

LSTM を使っている model_2 はどうしたのでしょう…?

株価との相性が悪いのでしょうか?

価格の上げ下げの正解率で評価してみる

別の観点から評価してみましょう。

株価を予想するモチベーションは、なんと言っても「お金を稼ぐ」こと。

価格の上げ下げの正解率は、どのくらいか調べてみましょう。

正解率を調べる関数を、以下のように定義しました。

正解率を調べた結果は

では、「model_1」「model_2」のどちらが稼ぐことのできるモデルか調べてみます。

なんと、これでも model_1 に敗北してしまいました!

しかし、正解率が「0.5」を超えないようでは、実際に使用することは出来ません…。

改善案その1

どうにかして稼げるモデルを作れないでしょうか?

まずは「改善案その1」として、Topix と他の株価を合わせて入力してみます

使用したデータは以下の通りです。

期間は先ほどと同じで、Topix の他に 267社の株価を用います!

モデルの構築

では、モデルを構築します。

LSTM層で return_sequence=True とすることで、リターンのシーケンスがそのまま出力されます

これによって、LSTM層をつなげることが出来ます。

今回のように、入力の3次元目が大きくなる場合に使用すると良いでしょう。

学習した結果

この後は、先ほどと同様の流れでモデルを学習します。

さて、結果はどうなるでしょうか?

なんだか悪化したような…。

価格の上げ下げの正解率は、0.44 となりこちらも改善は見られませんでした…。

改善案その2

稼げるモデルを目指すため、目的関数を変更してみます!

先ほどは、株価を予想する(つまり回帰)モデルを構築しました。

「改善案その2」では、株価を予想するのではなく、価格の上げ下げを予想するモデルに変更してみます。

データは、Topix のみのものを使用します。

モデルの構築

まず、モデルは以下のようになります。

モデルの変更点は、最後の Dense層の activetionsigmoid にしたこと。

そして、compileメソッドの引数loss を、 binaryf_crossentroppy’ としたことです。

このようにすることで、2値分類(価格が上がるか下がるか)を実行できるモデルが構築できます

出力ラベルの変更

モデルに合わせて、出力ラベルを変更することも忘れずに行いましょう。

出力ラベルを、次の日Topixの値が上がったら「1」次の日Topixの値が下がったら「0」とする関数は、以下のようになります。

モデルを学習

先ほどと同様の手順で、モデルを学習していきます。

今回は2値分類なので、結果は図示できません。

テストデータの正解率

代わりに、テストデータの正解率を見てみましょう。

evaluate メソッドは、「与えられた入力データ」と「その正解データ」に対してモデルを適用し、(loss, metrics) のタプルを返す関数です。

metrics=acc と指定しているため、metrics の値は正解率となります。

ですので、このモデルは 0.56 の正解率を達成することが出来たことになります!

やはり「目的に合ったモデルを構築する」ということが何よりも大切だということが分かりますね。

おわりに

ディープラーニングを用いて株価予想をしてみました。

「絶対当たる夢のようなモデル」はやはり一筋縄ではいかないようです。

ですが今回の検証で、最終的には56%の正解率にたどり着いたことを考えると、「8割方当たるモデル」というのは工夫次第で実現可能かもしれません!

もっとも、そのようなモデルが発見され広まれば、全員がそのモデルを使用するので、当たらないモデルになってしまいますね(笑)

関連記事

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事