LoginSignup
0
0

仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ。

Last updated at Posted at 2024-05-01

187b7833-7e13-4264-a019-1ab54aebe3f3.png

このコードは、ダミーの株価データを生成し、それを使用してLSTM(Long Short-Term Memory)モデルをトレーニングして株価の予測を行います。

パラメーターを変更すると色々な条件で シュミレーションが行えます。

以下はコードの簡単な説明です。

ダミーの株価データの生成 (generate_dummy_stock_prices):
generate_dummy_stock_prices関数は、指定された初期株価、ボラティリティ、および取引日数に基づいて、ダミーの株価データを生成します。ここでは、毎日の株価変動が正規分布に従うと仮定しています。

データの前処理:
ダミーの株価データをMinMaxScalerを使用して正規化します。これにより、データが0から1の範囲に収まるようになります。

入力データとラベルの作成:
create_dataset関数は、入力となる過去の株価データと、それに対応する次の日の株価を作成します。過去の株価データはシーケンスとして取得され、ラベルはその次の日の株価となります。

トレーニングデータとテストデータの分割:
全体のデータセットをトレーニングデータとテストデータに分割します。ここでは、トレーニングデータが80%、テストデータが20%となるように分割しています。

LSTMモデルの構築:
LSTM(Long Short-Term Memory)モデルを構築します。ここでは、1つのLSTM層と1つの全結合層(Dense層)を使用しています。活性化関数としては、デフォルトのReLU関数が使用されます。

トレーニング:
モデルをトレーニングします。ここでは、Adamオプティマイザを使用して平均二乗誤差を最小化します。トレーニングデータの一部が検証データとして使用され、早期停止(Early Stopping)コールバックが適用されます。

予測:
テストデータを使用して株価の予測を行います。トレーニング済みのモデルを使用して、テストデータに対する株価の予測値を取得します。

結果のプロット:
実際の株価と予測された株価をプロットします。ここではMatplotlibを使用して、株価の時系列データをグラフ化します。

仮想の株価データ(ボラティリティに基づいたダミーの株価チャート)
image.png

仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
image.png

仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
image.png

仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
image.png

仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
image.png

仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ。⓵

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.callbacks import EarlyStopping

# ダミーの株価データを生成
def generate_dummy_stock_prices(start_price, volatility, days):
    prices = [start_price]  # 初日の株価は指定した初期株価とする

    for _ in range(1, days):
        # 前日の株価を取得
        prev_price = prices[-1]
        # ボラティリティに基づいて当日の株価を計算
        price_change = np.random.normal(0, volatility)
        today_price = prev_price * (1 + price_change)
        prices.append(today_price)
    
    return np.array(prices)

# LSTMモデルの定義
def build_lstm_model(input_shape):
    model = Sequential()
    model.add(LSTM(150, input_shape=input_shape))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mean_squared_error')
    return model

def main():
    # ダミーの株価データを生成
    start_price = 100
    volatility = 0.02  # 例として 2% のボラティリティ
    days = 365 * 5  # 5年分の取引日数
    dummy_stock_prices = generate_dummy_stock_prices(start_price, volatility, days)

    # データの前処理
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_prices = scaler.fit_transform(dummy_stock_prices.reshape(-1, 1))

    # トレーニングデータとテストデータに分割
    train_size = int(len(scaled_prices) * 0.8)
    train_data = scaled_prices[:train_size]
    test_data = scaled_prices[train_size:]

    # 入力データとラベルの作成
    def create_dataset(data, time_steps):
        X, y = [], []
        for i in range(len(data) - time_steps):
            X.append(data[i:(i + time_steps)])
            y.append(data[i + time_steps])
        return np.array(X), np.array(y)

    time_steps = 1
    X_train, y_train = create_dataset(train_data, time_steps)
    X_test, y_test = create_dataset(test_data, time_steps)

    # LSTMモデルの構築
    input_shape = (X_train.shape[1], 1)
    model = build_lstm_model(input_shape)

    # トレーニング
    early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
    model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2, callbacks=[early_stopping])

    # テストデータで予測
    predicted_data = model.predict(X_test)

    # 予測結果を元のスケールに戻す
    predicted_data = scaler.inverse_transform(predicted_data)
    y_test = scaler.inverse_transform(y_test)

    # 結果のプロット
    plt.figure(figsize=(10, 5))
    plt.plot(dummy_stock_prices, label='Actual')
    plt.plot(np.arange(train_size + time_steps, len(dummy_stock_prices)), predicted_data, label='Predicted')
    plt.xlabel('Day')
    plt.ylabel('Price')
    plt.title('Dummy Stock Prices Prediction')
    plt.legend()
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    main()

仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ。⓶

time_steps = 3 # 入力は過去3日間の株価 (ここを変更してみた。)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.callbacks import EarlyStopping

# ダミーの株価データを生成
def generate_dummy_stock_prices(start_price, volatility, days):
    prices = [start_price]  # 初日の株価は指定した初期株価とする

    for _ in range(1, days):
        # 前日の株価を取得
        prev_price = prices[-1]
        # ボラティリティに基づいて当日の株価を計算
        price_change = np.random.normal(0, volatility)
        today_price = prev_price * (1 + price_change)
        prices.append(today_price)
    
    return np.array(prices)

def main():
    # ダミーの株価データを生成
    start_price = 100
    volatility = 0.02  # 例として 2% のボラティリティ
    days = 365 * 5  # 5年分の取引日数
    dummy_stock_prices = generate_dummy_stock_prices(start_price, volatility, days)

    # データの前処理
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_prices = scaler.fit_transform(dummy_stock_prices.reshape(-1, 1))

    # 入力データとラベルの作成
    def create_dataset(data, time_steps):
        X, y = [], []
        for i in range(len(data) - time_steps):
            X.append(data[i:(i + time_steps)])
            y.append(data[i + time_steps])
        return np.array(X), np.array(y)

    time_steps = 3  # 入力は過去5日間の株価
    X, y = create_dataset(scaled_prices, time_steps)

    # データをトレーニングデータとテストデータに分割
    train_size = int(len(X) * 0.8)
    X_train, X_test = X[:train_size], X[train_size:]
    y_train, y_test = y[:train_size], y[train_size:]

    # LSTMモデルの構築
    model = Sequential()
    model.add(LSTM(150, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mean_squared_error')

    # トレーニング
    early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
    history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2, callbacks=[early_stopping])

    # テストデータで予測
    predicted_data = model.predict(X_test)

    # 予測結果を元のスケールに戻す
    predicted_data = scaler.inverse_transform(predicted_data)
    y_test = scaler.inverse_transform(y_test)

    # 結果のプロット
    plt.figure(figsize=(10, 5))
    plt.plot(dummy_stock_prices[train_size+time_steps:], label='Actual')
    plt.plot(predicted_data, label='Predicted')
    plt.xlabel('Day')
    plt.ylabel('Price')
    plt.title('Dummy Stock Prices Prediction')
    plt.legend()
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    main()

上手くいきすぎているような気もします。
予測が大きくずれる時はコードをもう1回実行するとうまくフィットする 結果が出ることがありますね

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0