前提・実現したいこと
下記リンクを元に、kerasのLSTMモデルを使って相場予測のプログラムを書いています。
ディープラーニングで株価予測するときの罠
発生している問題・エラーメッセージ
そこで、実運用をするために毎回学習はできないので、学習済みのモデルを試しに使おうとしたのですが、うまく使えていないようです。
#学習込みのコード def read_data(): btcjpy = pd.read_csv("btcjpy_anx_hist.csv") btcjpy = btcjpy.dropna() btcjpy = btcjpy.sort_values("日付け") closes = btcjpy['終値'].values closes = closes.reshape(-1,1) return closes def create_model(): inputs = Input(shape=(5, 1)) x = LSTM(300, activation='relu')(inputs) price = Dense(1, activation='linear', name='price')(x) updown = Dense(1, activation='sigmoid', name='updown')(x) model = Model(inputs=inputs, outputs=[price, updown]) model.compile(loss={ 'price': 'mape', 'updown': 'binary_crossentropy', }, optimizer='adam', metrics={'updown': 'accuracy'}) return model def build_train_test_data(base_data): scaler = StandardScaler() data = scaler.fit_transform(base_data) x_data = [] y_data_price = [] y_data_updown = [] for i in range(len(data) - 5): x_data.append(data[i:i + 5]) y_data_price.append(data[i + 5]) y_data_updown.append(int((base_data[i + 5 - 1] - base_data[i + 5]) > 0)) x_data = np.asarray(x_data).reshape((-1, 5, 1)) y_data_price = np.asarray(y_data_price) y_data_updown = np.asarray(y_data_updown) train_size = int(len(data) * 0.8) x_train = x_data[:train_size] y_train_price = y_data_price[:train_size] y_train_updown = y_data_updown[:train_size] x_test = x_data[train_size:] y_test_price = y_data_price[train_size:] y_test_updown = y_data_updown[train_size:] return x_train, y_train_price, y_train_updown, x_test, y_test_price, y_test_updown, scaler def main(): model = create_model() data = read_data() x_train, y_train_price, y_train_updown, x_test, y_test_price, y_test_updown, scaler = \ build_train_test_data(data) model.fit(x_train, [y_train_price, y_train_updown], validation_data=(x_test, [y_test_price, y_test_updown]), epochs=3, batch_size=10, callbacks=[CSVLogger('train.log.csv')]) model.save('model.h5') with open('scaler.pkl', 'wb') as f: pickle.dump(scaler, f, protocol=pickle.HIGHEST_PROTOCOL) pred = model.predict(x_test)[0][:, 0].reshape(-1) pred = scaler.inverse_transform(pred) y_test_price = scaler.inverse_transform(y_test_price.astype('float64')) y_test_price.reshape(-1,)}) plt.plot(pred, label="pred") plt.plot(y_test_price, label="y_test_price") plt.legend() return pred, y_test_price, x_test
精度はともかく、予測はしていそうな気がしますが、こちらの予測と別の.pyプログラムから呼び出した場合の予測結果が違うので、何かが間違っているのかなと思います。その別プログラムが↓
# モデルを外部からロードして使用するコード def read_data(): btcjpy = pd.read_csv("btcjpy_anx_hist.csv") btcjpy = btcjpy.dropna() btcjpy = btcjpy.sort_values("日付け") closes = btcjpy['終値'].values closes = closes.reshape(-1,1) return closes def main(): scaler = StandardScaler() with open('scaler.pkl', 'rb') as f: pickle_model = pickle.load(f) inputs = Input(shape=(5, 1)) x = LSTM(300, activation='relu')(inputs) price = Dense(1, activation='linear', name='price')(x) updown = Dense(1, activation='sigmoid', name='updown')(x) model = Model(inputs=inputs, outputs=[price, updown]) model.compile(loss={ 'price': 'mape', 'updown': 'binary_crossentropy', }, optimizer='adam', metrics={'updown': 'accuracy'}) # model = load_model("model.h5") data = read_data() x_data = [] for i in range(len(data) - 5): x_data.append(data[i:i + 5]) x_data = np.asarray(x_data).reshape((-1, 5, 1)) print(input_data) pred = pickle_model.predict(x_data)[0][:, 0].reshape(-1) # pred = scaler.finverse_transform(pred) return pred, data pred, data = main()
環境
python 3.6.3, keras 2.1.5
ディープラーニング初心者ですがよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。