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()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。