「機械学習で株価予測なんてできるの?」──多くの個人投資家が一度は通る疑問です。今回は時系列データに強いLSTM(Long Short-Term Memory)を使って、日経平均株価の翌日終値を予測するモデルをPythonで実装します。Kerasベースの最小コードなので、Google Colabにそのまま貼って動かせます。
なぜLSTMが株価予測に使われるのか
LSTMはRNN(再帰型ニューラルネット)の改良版で、長期の依存関係を学習できるのが特徴です。株価のような「直近の値動きが次の値動きに影響する」時系列データに自然にマッチします。ただし株価は本質的にランダムウォークに近いため、過信は禁物。あくまで補助的なシグナルとして活用しましょう。
データの準備
yfinanceで日経平均の過去5年分の終値を取得し、MinMaxScalerで0〜1にスケーリングしたあと、60日分の窓を入力、翌日終値を出力としてデータセットを作成します。シンプルですが、これがLSTM入門の鉄板パターンです。
Pythonコード
import yfinance as yf
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# データ取得
df = yf.download("^N225", period="5y", interval="1d", progress=False)
close = df[["Close"]].dropna().values
# スケーリング
scaler = MinMaxScaler()
scaled = scaler.fit_transform(close)
# 窓データ作成
WINDOW = 60
X, y = [], []
for i in range(WINDOW, len(scaled)):
X.append(scaled[i-WINDOW:i, 0])
y.append(scaled[i, 0])
X, y = np.array(X), np.array(y)
X = X.reshape((X.shape[0], X.shape[1], 1))
# 学習・検証分割
split = int(len(X) * 0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
# モデル定義
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(WINDOW, 1)),
Dropout(0.2),
LSTM(32),
Dropout(0.2),
Dense(1)
])
model.compile(optimizer="adam", loss="mse")
model.fit(X_train, y_train, epochs=20, batch_size=32, verbose=1)
# 予測
pred = model.predict(X_test)
pred = scaler.inverse_transform(pred)
print(f"予測終値(最新): {pred[-1][0]:.0f}円")
運用上のポイント
このモデルは「終値を当てる」回帰タスクですが、実運用ではむしろ「明日上がるか下がるか」の分類タスクの方が安定します。さらに精度を高めるには、以下のような工夫が有効です。
- 出来高・為替・他指数など特徴量を増やす
- Walk-Forward検証で時間軸を考慮した評価をする
- EarlyStoppingで過学習を抑える
- シード固定で再現性を確保する
よくある失敗パターン
初心者がやりがちなのが、「テストデータをスケーリング時に混ぜてしまう」リーク事故。scaler.fit_transformはtrainだけに対して行い、testにはtransformのみを適用するのが正解です。回帰モデル全体の精度を大きく左右するポイントなので要注意。
まとめ
LSTMは初学者でも触りやすいディープラーニングの入り口です。重要なのは「予測精度」よりも「再現可能なパイプラインを作ること」。データ取得→前処理→学習→検証の流れを自分の手で組めるようになると、機械学習×トレードの世界が一気に広がります。バックテストで検証し、少額運用から段階的にスケールするのが、安全な始め方の鉄則です。

