こちらのUdemyのコースでTensorflowを使ったビットコインの予測が紹介されていました。それを参考にドル円の予測をやってみました。
前回は直近7日間の終値から次の日の終値を予測するというモデルで、以下のハイパーパラメータを使いました。結果はMAEが48ということで、ベースラインとして作ったナイーブモデルより悪い結果になりました。
- 128個の隠れ層とReLUアクティベーションを持つ1つのレイヤー
- リニアアクティベーションを持つ出力層
- AdamオプティマイザーとMAE損失関数
- バッチサイズは128
- エポック数100
今回はハイパーパラメータは変更せずに、直近30日の終値を使って予測してみようと思います。
以前7日分のデータを使って次の日の予測するための学習データを作りました。今回もそれを流用し、30日に変更して作成します。
window_size=30
horizon=1
window_step = np.expand_dims(np.arange(window_size+horizon), axis=0)
window_step
record_step = np.expand_dims(np.arange(len(closes)-(window_size+horizon-1)), axis=0).T
record_step
window_step + record_step
windowed_array = closes[window_step + record_step]
windowed_array
windows, labels = windowed_array[:, :-1], windowed_array[:, -1:]
windows, labels
test_split = 0.2
split_size = int(len(windows) * (1-test_split))
train_windows = windows[:split_size]
train_labels = labels[:split_size]
test_windows = windows[split_size:]
test_labels = labels[split_size:]
train_windows[:5], train_labels[:5]
学習データが作成できました。
では、前回と同じようにモデルを構築していきます。名前はmodel_2とします。
import tensorflow as tf
from tensorflow.keras import layers
tf.random.set_seed(1)
model_2 = tf.keras.Sequential([
layers.Dense(128, activation="relu"),
layers.Dense(1, activation="linear")
], name="model_2_dense")
model_2.compile(loss="mae",
optimizer=tf.keras.optimizers.Adam(),
metrics=["mae"])
model_2.fit(x=train_windows,
y=train_labels,
epochs=100,
verbose=1,
batch_size=128,
validation_data=(test_windows, test_labels),
callbacks=[create_model_checkpoint(model_name=model_2.name)])
model_2 = tf.keras.models.load_model("model_experiments/model_2_dense")
model_2.evaluate(test_windows, test_labels)
確かに、7日分のデータを使った時よりも大きくはずしているところがたくさんあるようです。
次回はさらに実験を進めていこうと思います。