PyTorchによるLSTMモデルと、カルマンフィルタによるデータ同化を組み合わせた日経平均株価予測システムです。
- 学習期間: 2016年1月12日 ~ 2025年10月11日(約10年間)
- 検証期間: 2025年10月12日 ~ 2026年1月12日(93日間)
- 手法: LSTM(PyTorch) + カルマンフィルタ(観測値補正版)
- データソース: Yahoo Finance(CSVで1回ダウンロード)
| 手法 | MAE | RMSE | 改善率 |
|---|---|---|---|
| LSTM単独 | 746.93円 | 919.01円 | - |
| カルマンフィルタ補正 | 539.56円 | 665.81円 | 27.76% |
- ✅ LSTMで過去30日間のデータから次の日の株価を予測
- ✅ カルマンフィルタで予測値と実績値の誤差を補正
- ✅ 1日ずつデータを追加しながらシミュレーション
- ✅ 予測精度が約28%向上
.
├── data/ # データディレクトリ
│ ├── nikkei_raw.csv # 日経平均生データ
│ ├── train_data.csv # 学習用データ(正規化済み)
│ └── test_data.csv # 検証用データ(正規化済み)
├── models/ # モデル保存ディレクトリ
│ ├── lstm_model.pth # 学習済みLSTMモデル
│ └── scaler.pkl # MinMaxScaler
├── results/ # 結果保存ディレクトリ
│ ├── training_loss.csv # 学習曲線
│ ├── data_assimilation_results.csv # データ同化結果
│ ├── training_loss.png # グラフ1: LSTM学習曲線
│ ├── prediction_comparison.png # グラフ2: 予測値 vs 実績値 vs 補正値
│ ├── prediction_error_comparison.png # グラフ3: 予測誤差の比較
│ ├── kalman_gain.png # グラフ4: カルマンゲインの推移
│ └── kalman_error_covariance.png # グラフ5: 推定誤差共分散の推移
├── src/ # ソースコードディレクトリ
│ ├── download_data.py # データダウンロード
│ ├── preprocess_data.py # データ前処理
│ ├── train_lstm.py # LSTM学習
│ ├── kalman_filter.py # カルマンフィルタ実装
│ ├── data_assimilation.py # データ同化検証
│ └── visualize_results.py # 結果可視化
├── requirements.txt # 依存ライブラリ
└── README.md # このファイル
pip install -r requirements.txtpython src/download_data.pypython src/preprocess_data.pypython src/train_lstm.pypython src/data_assimilation.pypython src/visualize_results.pyこのコマンドで5つの独立したグラフが生成されます:
- LSTM学習曲線
- 予測値 vs 実績値 vs 補正値
- 予測誤差の比較
- カルマンゲインの推移
- 推定誤差共分散の推移
- 入力: 過去30日間の株価データ
- 構造: 2層LSTM(隠れ層50ユニット)+ 全結合層
- 損失関数: MSE(平均二乗誤差)
- 最適化器: Adam(学習率0.001)
- エポック数: 50
- バッチサイズ: 32
- 状態: 予測値
- 観測: 実績値
- プロセスノイズ分散(Q): 0.0001
- 観測ノイズ分散(R): 0.001
カルマンフィルタは以下の式で予測値を補正します:
ここで:
-
$x_{k|k-1}$ : LSTM予測値 -
$z_k$ : 実績値 -
$K_k$ : カルマンゲイン(0~1、観測値への信頼度) -
$x_{k|k}$ : 補正後の推定値
- 手法: MinMaxScaler(0~1に正規化)
- 基準: 学習データの統計量で正規化
LSTM学習の進行状況を表示します。損失が減少していることで、モデルが正しく学習されていることを確認できます。
3つの系列を重ねて表示:
- 黒線(実績値): 実際の株価
- 赤線(LSTM予測値): LSTMが生成した予測値
- オレンジ線(カルマンフィルタ予測値): カルマンフィルタの予測ステップ
- 緑線(カルマンフィルタ補正値): 実績値で補正した最終推定値
LSTM予測誤差(赤棒グラフ)とカルマンフィルタ補正誤差(緑棒グラフ)を比較。 緑棒の方が小さいほど補正がうまく機能しています。
カルマンゲイン(K_k)の推移を表示します:
- 0に近い:予測値を信頼
- 1に近い:観測値(実績値)を信頼
平均値も赤点線で表示されます。
推定誤差共分散(P_k)の推移を表示します。通常、観測を重ねるごとに減少し、 カルマンフィルタの信頼度が向上していきます。
src/train_lstm.py を編集:
model = LSTMModel(input_size=1, hidden_size=50, num_layers=2, output_size=1)
num_epochs = 50
batch_size = 32
seq_length = 30 # シーケンス長kf = KalmanFilter(
process_variance=0.0001, # Q: 小さいほど予測を信頼
measurement_variance=0.001, # R: 小さいほど観測を信頼
initial_value=recent_data[-1, 0],
initial_estimate_error=0.001
)- YahooFinanceのデータは市場休業日(土日祝日)は含まれません
- 学習データとテストデータで同じスケーラー(MinMaxScaler)を使用しています
- GPUが利用可能な場合は自動的にGPUで学習します
MIT License
GitHub Copilot