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

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

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

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

機械学習

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

Python

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

Q&A

解決済

1回答

1727閲覧

Python で Keras を使い RNN の LSTM による FX チャートの予測結果が実際のデータと乖離してしまいます

s_heigen

総合スコア5

Keras

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/04/12 10:00

前提・実現したいこと

Keras を使った LSTM で、FXチャートの予測を行おうとしています。

発生している問題・エラーメッセージ

予測結果が実際のデータと乖離しており、その原因が不明な状態です。

該当のソースコード

データ構造

入力データがチャートの値(価格の変化率)を表し、それを24個まとめたものを一つの学習データとしています
それを一時間づつずらし、合計 15000 個のデータを作っています

# input_data_list_train[0] array([[0.62224413], [0.66206642], [0.6454561 ], [0.61505502], [0.62129441], [0.62455067], [0.61315435], [0.60636639], [0.63473543], [0.60595753], [0.61952831], [0.63188613], [0.62686003], [0.6337822 ], [0.6303857 ], [0.64639128], [0.64555965], [0.62278596], [0.60192606], [0.61492496], [0.6166857 ], [0.62427806], [0.62102386], [0.62495597]]) # input_data_list_train[1] array([[0.66206642], [0.6454561 ], [0.61505502], [0.62129441], [0.62455067], [0.61315435], [0.60636639], [0.63473543], [0.60595753], [0.61952831], [0.63188613], [0.62686003], [0.6337822 ], [0.6303857 ], [0.64639128], [0.64555965], [0.62278596], [0.60192606], [0.61492496], [0.6166857 ], [0.62427806], [0.62102386], [0.62495597], [0.6320059 ]]) # input_data_list_train[14999] array(・・・

上のデータに対するラベルは次のような構造で、
例えば input_data_list_train[0] が 0時から24時の価格を表した場合、
そのラベル(=予測したい値)label_data_list_train[0] は 25時 の価格を表しています。

# label_data_list_train[0] array([0.6320059]) # label_data_list_train[1] array([0.62942768]) # label_data_list_train[14999] array(・・・

モデル構築

python

1from keras.layers import Dense, Activation, SimpleRNN, LSTM 2from keras.optimizers import Adam 3from keras.models import Sequential 4 5CHUNK_LENGTH = 24 6HIDDEN_SIZE = 128 7BATCH_SIZE = 64 8NUM_ITERATIONS = 1 9NUM_EPOCHS_PER_ITERATION = 5 10NUM_PREDS_PER_EPOCH = 1 11INPUT_SIZE = 1 12OUTPUT_SIZE = 1 13 14model = Sequential() 15model.add(LSTM(HIDDEN_SIZE, stateful=False, batch_input_shape=(None, CHUNK_LENGTH, INPUT_SIZE))) 16model.add(Dense(OUTPUT_SIZE)) 17model.add(Activation('linear')) 18optimizer = Adam(lr=1e-5) 19model.compile(loss='mean_squared_error', optimizer=optimizer)
from keras.callbacks import EarlyStopping for iteration in range(NUM_ITERATIONS): print('=' * 20) print('Iteration #: %d' % (iteration)) model.fit( input_data_list_train, label_data_list_train, batch_size=BATCH_SIZE, epochs=NUM_EPOCHS_PER_ITERATION, shuffle=False )

未来予測

# 未来予測 import numpy as np # 学習データの末尾より、24時間分の価格を予測します FUTURE_PREDICTION_NUM = 24 predicted = [] input_data_list_prediction = input_data_list_test[len(input_data_list_test) - 1:] for i in range(FUTURE_PREDICTION_NUM): _predict_data = input_data_list_prediction[i : i + 1] _predicted = model.predict(_predict_data, batch_size=BATCH_SIZE) # 入力データの先頭を除き、末尾に予測を加え、新たな入力データを作成 next_chunk = np.append(input_data_list_prediction[i][1:], np.array(_predicted[0])).reshape(CHUNK_LENGTH, 1) # numpyArray を list に戻し、多次元配列同士を結合、その後 numpyArray に戻す _tmp_list = input_data_list_prediction.tolist() _tmp_list.append(next_chunk) input_data_list_prediction = np.array(_tmp_list) predicted.append(_predicted)

次のような流れになっています

  • 末尾の学習データ(0時~24時のチャートの値)の、一時間後の価格を予測
  • 予測した結果を学習データの末尾に加える
  • 一時間後ろにずらしたデータを作る(1時~25時分のデータを作る)(25時のデータは予測で取れた値)
  • 1時~25時のチャートの値の、一時間後の価格を予測
  • 予測した結果を学習データの末尾に加える

これを24回繰り返す

結果

以下の画像は末尾の学習データより24時間以降のチャート変化率をプロットしたものです。

実際のデータ

予測データ
イメージ説明

求める結果

実際のデータに近くなくとも、はっきりと価格の上下が表れるような結果を求めています。
(現状は価格の上下がほぼ無いに等しい真っ直ぐな線にしかならないため)

試したこと

Keras 公式や同じようなことを行っている人の記事などを見てハイパーパラメータの調整などを行っていましたが、一向に改善が見られない状態です。

補足情報(FW/ツールのバージョンなど)

  • Google Colaboratory
  • Python 3.6
  • Keras 2.3.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際のデータに近くなくとも、はっきりと価格の上下が表れるような結果を求めています。
(現状は価格の上下がほぼ無いに等しい真っ直ぐな線にしかならないため)

本当にそうであればKerasなど使わず
一つ前の値を次の予測値として出力
で出せますが、そうでなないですよね

学習データ領域では予測とグラフが重なっているのでしょうか。

予測値がほぼ真ん中に来てしまっているのは実際のデータの特徴をほぼ学習出来ていないため
平均値を出してしまっているからです(逆にいうとこれで正解かもしれません。以上にぶれた予測値よりも誤差が小さければ)

時系列予測ですと正しく実施しても往々にしてこういうことはあります。

深層学習だからといって何でも予測できるわけではないです。

投稿2020/07/01 07:52

aokikenichi

総合スコア2240

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

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

s_heigen

2020/07/01 07:58

なるほど…勉強になります…! ありがとうございます!!
aokikenichi

2020/07/01 08:11

まずは同じ周期が繰り返されているような学習しやすいものから練習されるとよろしいかと。 あとはコード付きの記事等をたくさん試すですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問