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

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

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

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

Python

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

Q&A

1回答

3125閲覧

kerasのステートフル LSTMで予測をするときに、たくさんのテストデータを用意をした方がいいのか

ayumuKi

総合スコア17

Keras

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

Python

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

0グッド

0クリップ

投稿2020/05/08 12:22

kerasの ステートフル LSTMで、株価の予測の学習をしました。
このモデルは10日の連続したデータから11日目のデータを予測するようにしていて、
ある日(例えば5月25日)の株価を予測したいときに、それよりも10日前からの10日分のデータを入力すれば出力されます。けれども、ステートフルモデルであるため、隠れ層のhidden_stateが時系列データを入力するとどんどん保存されていくので、10日分だけでなく、もっとたくさんの過去の連続したデータを入力していく方がより良い予測ができるのでしょうか。
わかりにくい日本語になってしまったのですが、つまり10日分だけでなく、100日分くらいの多くの連続したデータを入力した方がいいのでしょうか?
それとも実験してみるしかないのでしょうか。

python

1コード 2import numpy 3import pandas 4import matplotlib.pyplot as plt 5 6from sklearn import preprocessing 7from keras.models import Sequential 8from keras.layers.core import Dense, Activation, Dropout 9from keras.layers.recurrent import LSTM 10 11length_of_sequences = 10 12batch_size = 1 13class Prediction : 14 def __init__(self): 15 self.length_of_sequences = length_of_sequences 16 self.in_out_neurons = 1 17 self.hidden_neurons = 80 18 self.time_idx = None 19 20 def load_data(self,data, time_size,batch_size,in_out_neurons=1):#バッチの作成 21 data_size = len(data) 22 t_data = data[['終値']].iloc[1:] 23 t_data = t_data[['終値']].values.flatten().tolist() 24 data = data[['終値']].values.flatten().tolist() 25 max_iters = data_size // (batch_size * time_size) 26 self.time_idx = 0 27 x = None 28 t = None 29 for i in range(max_iters): 30 batch_x = numpy.empty((batch_size, time_size)) 31 batch_t = numpy.empty((batch_size, in_out_neurons)) 32 jump = data_size // batch_size 33 offsets = [j * jump for j in range(batch_size)] # バッチの各サンプルの読み込み開始位置 34 for time in range(time_size): 35 for k, offset in enumerate(offsets): 36 batch_x[k, time] = data[(offset + self.time_idx) % data_size] 37 batch_t[k,0] = t_data[(offset + self.time_idx) % data_size] #in_out_neurons = 1 の時 38 self.time_idx += 1 39 if i == 0: 40 x = batch_x 41 t = batch_t 42 else: 43 x = numpy.concatenate([x,batch_x],0) 44 t = numpy.concatenate([t,batch_t],0) 45 x = x.reshape(-1,length_of_sequences,in_out_neurons) 46 return x, t 47 48 def create_model(self) :#ステートフルモデル 49 model = Sequential() 50 model.add(LSTM(self.hidden_neurons, \ 51 batch_input_shape=(1, self.length_of_sequences, self.in_out_neurons), \ 52 return_sequences=False,stateful=True))#None 53 model.add(Dense(self.in_out_neurons)) 54 model.add(Activation("linear")) 55 model.compile(loss="mape", optimizer="adam") 56 return model 57 58 59 def train(self, X_train, y_train,x_test,y_test) :#学習 60 model = self.create_model() 61 for i in range(20): 62 model.fit(X_train, y_train, batch_size=1, epochs=1,shuffle=False,validation_data=(x_test, y_test)) 63 model.reset_states() 64 return model 65 66 67if __name__ == "__main__": 68 69 prediction = Prediction() 70 71data = pandas.read_csv('/content/drive/My Drive/csv_data/changed_csv7203_1983_2018.csv',index_col=0) 72test_data = pandas.read_csv('/content/drive/My Drive/csv_data/changed_csv7203_2018_2019.csv',index_col=0) 73data['終値'] = preprocessing.scale(data['終値']) 74test_data['終値'] = preprocessing.scale(test_data['終値']) 75prediction.length_of_sequences) 76x_train, y_train = prediction.load_data(data[['終値']], prediction.length_of_sequences,1) 77x_test, y_test = prediction.load_data(test_data[['終値']], prediction.length_of_sequences,1) 78model = prediction.train(x_train, y_train,x_test,y_test) 79 80predicted = model.predict(x_test,batch_size = 1) 81result = pandas.DataFrame(predicted) 82result.columns = ['predict'] 83result['actual'] = y_test 84result.plot() 85plt.show()

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

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

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

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

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

guest

回答1

0

一般的には10日分ではほぼまともな学習は不可能、
直近10日の株価で明日の株価が決まるとは非常に考えにくい。
直近100日の株価でも明日の株価が決まるとも考えにくいが10日分よりは何らかのパターンを学習する可能性が高まる。でもほぼ無理でしょう。

周期のあるような時系列データであればその周期を数回以上含めた方がそのパターンを学習すると思われます
ただ株価は周期のようなものがほぼないので難しいと思います。

株価と深層学習の取組ですと、
・ニュースや、各種レポートを自然言語処理して株価との関係を見る
・日次の株価ではなく膨大な取引単位を分析し、歪み(取引のラグ等から絶対にAをBに売買すれば儲かるというのがあるらしい)を見つける
は聞いたことがありますが、株価のみで株価はほぼ無理と思います。

時系列データの予測を学ぶという意味であれば、まずは季節性や曜日等で明らかに周期のあるもの、上昇や下降などトレンドのあるものなどパターンがある程度はっきりしているものでその特徴をきちんと捉えられるか から入るとよいと思います。
季節性のあるものの生産量や、売上高等。

投稿2020/09/18 10:10

aokikenichi

総合スコア2240

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問