質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3128閲覧

損失係数が一向に減らない|深層学習を用いた株価予測

python_wakaran

総合スコア13

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/08 12:33

現在、ディープラーニングを用いてAPPLEの2000年から2018年の株価データを用いて2018年から2019年の株価データを予測するプログラムを作成しています。その中で学習過程で損失係数が一切下がらず、正解率が0%になってしまいました。

私自身、機械学習・深層学習経験があまりないので以下のコードは様々なサイト等を参考にして作成したものです。そこでどこを直せば損失率を下げることができ、正解率を上げることができるのかお分かりになる方がおりましたら教えていただきたいです。

いかにコードを記載します。


Python

1import keras 2import pandas as pd 3import numpy as np 4import matplotlib.pyplot as plt 5from pandas_datareader import data 6import tensorflow as tf 7from datetime import datetime 8 9#Keras-Sequential-model 10from keras.models import Sequential 11from keras.callbacks import EarlyStopping 12#layer 13from keras.layers import Dense, Dropout, Activation 14#Parameter update 15from keras.optimizers import RMSprop, SGD, Adam 16%matplotlib inline 17 18#データ設定 19train_start = '2010-04-01' 20train_end = '2018-03-31' 21test_start = '2018-04-01' 22test_end = '2019-03-31' 23 24df_train = data.DataReader('AAPL', 'yahoo', train_start, train_end) 25df_test = data.DataReader('AAPL', 'yahoo', test_start, test_end) 26 27#日時と調整終了値 28past_date = df_train.index 29past_price = df_train['Adj Close'] 30future_date = df_test.index 31future_price = df_test['Adj Close'] 32 33#ディープラーニングモデル 34def build_multilayer_perceptron(): 35 model = Sequential() 36 model.add(Dense(100, input_shape=(20,))) 37 model.add(Activation('relu')) 38 model.add(Dropout(0.2)) 39 model.add(Dense(100)) 40 model.add(Activation('relu')) 41 model.add(Dropout(0.2)) 42 model.add(Dense(1)) 43 model.add(Activation('softmax')) 44 model.compile(loss='mse', 45 optimizer='adam', 46 metrics=['accuracy']) 47 return model 48 49#標準化 50def getInputLabel(price, period=20): 51 period = period 52 input_tensor = [] 53 label_tensor = [] 54 for i in range(0, len(price) - period, 1): 55 input_tensor.append(price.iloc[i:i + period ]) 56 label_tensor.append(price.iloc[i + period ]) 57 input_tensor = np.array(input_tensor) 58 label_tensor = np.array(label_tensor) 59 return input_tensor, label_tensor 60 61#訓練用データとテスト用データ 62past_tmp = past_price - past_price.mean() 63past_tmp = past_tmp/past_price.std() 64X_train, y_train = getInputLabel(price = past_tmp) 65 66future_tmp = future_price - future_price.mean() 67future_tmp = future_tmp/future_price.std() 68X_test, y_test = getInputLabel(price = future_tmp) 69 70earlystopping = EarlyStopping(monitor='loss', patience=5) 71 72model = build_multilayer_perceptron() 73model.summary() 74 75#Learning 76history = model.fit(X_train, y_train, 77 batch_size=20, 78 epochs=100, 79 verbose=1, 80 validation_data=(X_test, y_test), 81 callbacks=[earlystopping]) 82 83>>> 84Epoch 1/100 85100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 86Epoch 2/100 87100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 88Epoch 3/100 89100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 90Epoch 4/100 91100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 92Epoch 5/100 93100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 94Epoch 6/100 95100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 96Epoch 7/100 97100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 98Epoch 8/100 99100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 100Epoch 9/100 101100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 102Epoch 10/100 103100/100 [==============================] - 0s 2ms/step - loss: 1.9591 - accuracy: 0.0000e+00 - val_loss: 1.8511 - val_accuracy: 0.0000e+00 104 105model.evaluate(X_test, y_test, verbose=0) 106>>>[1.851119041442871, 0.0] 107```

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/10/08 13:13

説明変数には何を設定しましたか?
python_wakaran

2020/10/08 15:07

説明変数には#標準化にある関数から導くinput_tensorの値を用いています。 これは調整終了値の値を20個ごとの塊にしたものです。これは https://rightcode.co.jp/blog/information-technology/deep-learning-stock-price-forecast-create#i-4 このサイトに用いられているものを利用したものになっています。 説明変数について指摘され、考えてみると説明変数を変えた方がいいのではと考えるようになりました。。。初学者なので上のコードについて何か至らぬ点があれば指摘していただけると幸いです。
toast-uz

2020/10/08 22:32

損失率が減らないのって、標準化が不十分か、そもそもモデルが乱数性やノイズを帯びていて、学習不可能な場合かと思います。 できあがった X_train, y_train を眺めてみて、きちんと意図通りの標準化がされた数値になっており、かつそれなりに連続的な変化をしているか(激しく揺らいでいないか)をご確認ください。
python_wakaran

2020/10/09 02:07

なるほど。一応標準化は以上のコードの#訓練用データとテスト用データの部分でしている(つもり)のですが、株価の変動は連続的な変化をしているとは言いにくいので、以上の方法では株価を予測することは難しいかもしれませんね。 損失率の減少の要因大変勉強になりました。ありがとうございました。
toast-uz

2020/10/09 03:57

私も、コードを見る限り、標準化はできていると思います。機械学習の質問は手元での再現が難しいので、念のため、学習させる直前のデータを見ていただくのが良いかと思い、コメントしました。 また、一次方程式等で擬似的に「キレイな」データを作って、それを入力としてみて、期待通りの学習効果が得られるかどうかを見るとよいでしょう。前処理の問題なのか学習モデルの問題なのかが、切り分けできると思います。
python_wakaran

2020/10/09 06:28

なるほど。一応このコードに関して言えば、株式データなどの取得もPythonのライブラリを通して行っているので他の人がこのコードを実行しても再現性があると思います。 ご指摘通りきれいなデータで学習できるか試したところ、同様に損失関数が減らないことが確認できたので、学習モデルに原因があることが発覚しました。このような実践的な方法が知れて助かりました。ありがとうございます。もし学習モデルに原因があるとして、その解決法やヒントとなる知識をお持ちであれば教えていただけるとありがたいです。。
toast-uz

2020/10/09 11:31 編集

根本的に学習できていないので、モデルをなるべく単純化して変化をみたいですね。Dropout層は無くす。次元も最初は小さくする。あと、0中心の偏差データなのでreluの活性化は相性悪いように思います。tanhにしたいですね。 あと、問題の、20個ごとの塊で学習させているのも、いったん単純化して、1個ごとにしてみたいですね。
python_wakaran

2020/10/10 07:02

なるほど。アドバイスありがとうございました。 以上のことを実践してみたいと思います。 非常に勉強になりました!
guest

回答1

0

ベストアンサー

説明変数には#標準化にある関数から導くinput_tensorの値を用いています。

これは調整終了値の値を20個ごとの塊にしたものです。これは
https://rightcode.co.jp/blog/information-technology/deep-learning-stock-price-forecast-create#i-4
このサイトに用いられているものを利用したものになっています。

上記リンクでは最初は「Topix」を説明変数にしていますが、その後「Topix と他の株価」を説明変数にして最終的に「株価の上げ下げ」を予測しています。
質問者さんの目的変数は「APPLEの株価」ですが、

これは調整終了値の値を20個ごとの塊にしたものです

とは他の主要銘柄の株価のことですか?
であれば「他社の株価を説明変数にした機械学習では予測できなかった」という結果が出ているのではないでしょうか?もっとAPPLEに関連したデータを説明変数にすることで精度を上げることは出来るかもしれません。

ただし上記リンクにも

今回使うディープラーニングは、説明変数として過去の株価を用いるので、「テクニカル分析」を行うことになります。

ですが、過去の様々な論文で、テクニカル分析の効果がないことが実証済みです。
ですので、過度な期待はせず温かい目でご覧ください。

とありますので個別の株価予測は難しそうです。

投稿2020/10/08 22:26

meg_

総合スコア10760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python_wakaran

2020/10/09 02:26

meg_さん回答ありがとうございます。 ここで行っていることはX_trainであれば、2000年から2018年度の調整終了値を標準化したもの [-1.50435708, -1.49594732, -1.49244291, ..., 2.11300193, 2.06433253, 2.09834922] を20個ごとの塊にしていく。つまり[0:20],[1:21]...としていくということを行っています。 [-1.50435708, -1.49594732, -1.49244291, ..., -1.41735343, -1.41882175, -1.39532681], [-1.49594732, -1.49244291, -1.48890523, ..., -1.41882175, -1.39532681, -1.42052335],... といった具合に。この方法は以前上げたサイトに載っていたもので、こうすることによってどのような効果があるのかは正直分かっておらず、とりあえずこういうものなんだという解釈で進めていました。 しかしサイトで行っている株価予測はおそらく過去のデータ8割を用いて学習し、残り2割を用いてその過去の株価を再現できるかということをしているのに対し、私が使用としていることは過去のデータを用いてその後の株価を予測するということなので、この方法ではできないかなと考えるようになりました。目的変数を見直した方がよいかもしれませんね。。
meg_

2020/10/09 04:00 編集

> 20個ごとの塊 というのが、20日分の株価なのか1日分の20銘柄の株価なのかは分かりませんが、現在の訓練データでlossが全く減らないのであれば訓練データが悪いのだと思います。 質問者さんの機械学習は2つのサイトの方法をミックスしたものなのですか? どちらか一つの方法で実行してみてはどうでしょうか?
python_wakaran

2020/10/09 06:12

説明不足ですみません。20日分のデータという意味でした。 そうですね。一方のものを参考にしたものではエラーが発生してしまったのでこのような2つのものを合成したものを作成しました。なので、ひとつのもので作成してみることにします。 回答ありがとうございました。
meg_

2020/10/09 07:10

株価予測は非常に難しいかと思います。外的要因の影響が大きいかと思います。
python_wakaran

2020/10/10 07:03

なるほど。。 参考になりましたありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問