見出し画像

chatGPTを使いディープラーニングで予測ができるのか?


ドル円を予測するためのプログラムを作成してもらう。

と、いうことで今回はディープラーニングを使って予測するとどうなるか検証をしてみました。特徴量としては、ドル円、日経平均、米国金利10年の2020年9月1日から2020年12月31日までのデータを使用し、2021年1月のドル円のデータを予測してもらうものというものです。

以下、コード

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import numpy as np

# データセットを読み込む
data = pd.read_csv('closing_prices.csv')
data['Date'] = pd.to_datetime(data['Date'])
filtered_data = data[(data['Date'] >= '2020-09-01') & (data['Date'] <= '2020-12-31')]

# 特徴量を選択
features = filtered_data[['USDJPY=X', '^N225', '^TNX']]

# 特徴量を正規化
scaler = MinMaxScaler(feature_range=(0, 1))
normalized_features = scaler.fit_transform(features)

# LSTMに入力するデータを準備
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset)-look_back):
        a = dataset[i:(i+look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

look_back = 1
X, Y = create_dataset(normalized_features, look_back)
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

from keras.models import Sequential
from keras.layers import Dense, LSTM
from sklearn.model_selection import train_test_split

# データをトレーニングセットとテストセットに分割
# トレーニングデータとテストデータのインデックスを決定
train_size = int(len(X) * 0.9)
test_size = len(X) - train_size

# トレーニングデータとテストデータを分割(時系列の順序を保持)
X_train, X_test = X[0:train_size], X[train_size:len(X)]
Y_train, Y_test = Y[0:train_size], Y[train_size:len(Y)]

# LSTMモデルを構築
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(LSTM(units=50))
model.add(Dense(1))

# モデルをコンパイル
model.compile(loss='mean_squared_error', optimizer='adam')
# モデルをトレーニング
model.fit(X_train, Y_train, epochs=100, batch_size=1, verbose=2)

# テストセットでモデルを評価
test_score = model.evaluate(X_test, Y_test, verbose=0)
# 2020年12月のデータを準備
december_data = data[(data['Date'] >= '2020-12-01') & (data['Date'] <= '2020-12-31')]
december_features = december_data[['USDJPY=X', '^N225', '^TNX']]
normalized_december_features = scaler.transform(december_features)

# LSTMに入力する形式に変換
X_december, _ = create_dataset(normalized_december_features, look_back)
X_december = np.reshape(X_december, (X_december.shape[0], 1, X_december.shape[1]))

# 2021年1月のUSDJPYの値を予測
predicted_january_values = model.predict(X_december)
import matplotlib.pyplot as plt

# 2021年1月の実際のUSDJPYの値を取得
january_actual = data[(data['Date'] >= '2021-01-01') & (data['Date'] <= '2021-01-31')]['USDJPY=X']

# 予測値を元のスケールに戻す
predicted_january_values = scaler.inverse_transform(np.concatenate((predicted_january_values, np.zeros((predicted_january_values.shape[0], 2))), axis=1))[:,0]

# チャートで比較
plt.figure(figsize=(12,6))
plt.plot(january_actual.values, label='Actual')
plt.plot(predicted_january_values, label='Predicted')
plt.title('USDJPY January 2021 Actual vs Predicted')
plt.xlabel('Date')
plt.ylabel('USDJPY=X')
plt.legend()
plt.show()


結果


と、いうことで結果はこのようなグラフになりました。オレンジが予測データで青いのが実際のデータとなります。なんともコメントしづらいものとなりましたが、まだまだ調整の余地がありそうなので、具体的にどのような修正がいるのかchatGPTに確認をしてみます。

見直すべき箇所とそれに対する改善の提案

  1. データの特性の理解:

    • 予測対象のデータ(この場合は、USDJPYの為替レート)がどのような特性を持っているかを理解することが重要です。短期間のトレンドやニュースイベントの影響を受けやすいか、それとも長期的な経済的傾向により影響を受けるかを分析します。

  2. モデルの複雑さの調整:

    • LSTMモデルの層の数やユニットの数を調整して、モデルの複雑さを増減させます。モデルが過学習している場合は、層を減らすか、正則化(例:ドロップアウト)を追加することを検討します。

  3. ハイパーパラメータの最適化:

    • 学習率、バッチサイズ、エポック数などのハイパーパラメータを調整します。ハイパーパラメータのチューニングは、モデルの性能に大きな影響を与えることがあります。

  4. 特徴量の選択と前処理:

    • 使用する特徴量を見直し、データの前処理方法(正規化、トレンドの除去、季節性の調整など)を改善します。関連性の高い追加の特徴量(例えば、経済指標、政治的イベント)の組み込みも検討します。

  5. データ量の見直し:

    • トレーニングに使用するデータの期間を調整します。短期間のデータに重点を置くか、長期間のデータを使用するかを検討し、それに基づいてデータ量を調整します。

  6. 交差検証の実施:

    • モデルの性能を検証するために、時間に基づく交差検証(time series cross-validation)を実施します。これにより、モデルの一般化能力をより適切に評価できます。

とのことでしたので、今度は上記の修正案をもとにコードを見直してみようと思いますので、ご興味ある方はまたとうブログを覗きに来てみてくださいね!

この記事が気に入ったらサポートをしてみませんか?