このコードは、ダミーの株価データを生成し、それを使用して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を使用して、株価の時系列データをグラフ化します。
仮想の株価データ(ボラティリティに基づいたダミーの株価チャート)
仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
仮想の株価データを使用してLSTMモデルをトレーニングし、株価を予測するシュミレータ
仮想の株価データを使用して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回実行するとうまくフィットする 結果が出ることがありますね