本プロジェクトは研究・教育目的であり、投資助言・勧誘ではない。予測は将来の成果を保証しない。 投資判断は自己責任で行うこと。
日本株(東証大型・高流動性銘柄 約50 + 日経平均^N225 + TOPIX連動ETF 1306.T)の **翌営業日の騰落方向(上昇/下落)**を予測する研究プロジェクト。実際の売買は一切行わない。 予測精度の主張よりも、方法論の厳密さと結果報告の誠実さを最優先する。
- ユニバース: 日経225主要銘柄からハードコードした約50銘柄+指数(
src/universe.py)。 yfinanceで実際に取得できた銘柄のみを採用(取得失敗は自動除外)。 - データ: 2015-01-01以降の日足OHLCV(調整後終値)。無料ソース(yfinance)のみ、0円運用。
- 特徴量: ラグ付き対数リターン・ローリングボラティリティ・RSI・移動平均乖離率・
高安位置・出来高zスコア・カレンダー・市場(^N225)特徴・クロスセクショナルランク。
すべて時点tまでの情報のみで計算し、
tests/test_no_lookahead.pyで機械的に検証している (未来行を改変しても過去の特徴量が変化しないことをassert)。 - 検証プロトコル:
- ホールドアウト = 直近24ヶ月。この期間はハイパーパラメータ選択に一切使わない。
- それ以前の期間(検証期間)でウォークフォワード検証(拡張窓・月次再学習)によりモデル構成を選択。
全試行は
EXPERIMENTS.mdに記録(失敗・ベースライン未達も含め削除しない)。 - 選択済みの構成で、ホールドアウト期間をウォークフォワード予測(月次再学習)して最終評価。
- モデル: ベースライン3種(常に上昇/モメンタム/MA5>MA20)、ロジスティック回帰(L2)、 HistGradientBoostingClassifier(sklearn組み込み)。全銘柄プール学習に加え、^N225単独モデルも評価。
- 指標: 方向一致率(全体・年別・銘柄別)、二項検定p値と95%CI(対0.5・対ベースライン)、AUC、Brierスコア。
詳細は reports/backtest_report.md(v1)・
reports/backtest_report_v2.md(v2)を参照。
データ期間: 2015-03-31 〜 2026-07-10 / ホールドアウト(直近24ヶ月・チューニング未使用): 2024-07-10 〜 2026-07-10
検証期間内で選択された構成: HistGradientBoosting(max_iter=200, learning_rate=0.05, max_depth=6) (検証期間の方向一致率 50.63%)
検証期間内で選択された構成: 異種ランク平均(ロジスティック回帰 × LightGBM(optuna最適化)、
重みw_gbdt=0.4を検証期間で探索)(検証期間の方向一致率 51.91%。optuna探索30試行・
embargo 1営業日・v2拡張特徴量。全試行は EXPERIMENTS.md を参照)
| 手法 | n | 方向一致率 | 95%CI | p値(対0.5) | p値(対常に上昇) | AUC | Brier |
|---|---|---|---|---|---|---|---|
| ベースライン1: 常に上昇 | 25678 | 51.20% | [50.59%, 51.81%] | 0.000124 | 1 | N/A | N/A |
| ベースライン2: モメンタム | 25678 | 49.69% | [49.08%, 50.31%] | 0.3272 | 1.396e-06 | N/A | N/A |
| ベースライン3: MA5>MA20 | 25678 | 49.00% | [48.38%, 49.61%] | 0.001309 | 1.651e-12 | N/A | N/A |
| v1採用モデル(HGB, 全銘柄プール) | 26042 | 49.60% | [49.00%, 50.21%] | 0.204 | 2.763e-07 | 0.4950 | 0.2579 |
| v1採用モデル(HGB, ^N225単独) | 495 | 53.54% | [49.03%, 58.00%] | 0.1264 | 0.3015 | 0.5313 | 0.2648 |
| v2採用モデル(ランク平均, 全銘柄プール) | 26043 | 50.84% | [50.23%, 51.44%] | 0.007158 | 0.2414 | 0.5156 | 0.2945 |
|p_up - 0.5| がマージンを超える(=確信度が高い)日だけ予測した場合の一致率とカバレッジ:
| マージン | カバレッジ | n | 方向一致率 |
|---|---|---|---|
| 0.00 | 99.99% | 26041 | 50.83% |
| 0.02 | 94.18% | 24526 | 50.82% |
| 0.05 | 85.48% | 22261 | 50.90% |
| 0.08 | 76.61% | 19952 | 51.21% |
| 0.10 | 70.84% | 18450 | 51.36% |
マージンを上げてもカバレッジが下がるほどには一致率が伸びず(50.8%→51.4%程度)、
「確信度の高い予測に絞れば精度が大きく上がる」という単純な選択的予測の効果は限定的だった。
検証期間の同表は reports/backtest_report_v2.md を参照。
- v2はホールドアウトの方向一致率をv1の49.60%から50.84%へ改善したが、依然として ベースライン1(常に上昇、51.20%)を上回れていない(対ベースラインp=0.24、有意差なし)。
- v2は対0.5の二項検定でp=0.007と統計的に0.5から区別できる水準に達した(v1はp=0.204で 区別不能だった)。ただしこれは「上昇/下落を言い当てられる」ことを意味するのみで、 「儲かる」ことを意味しない(取引コスト非考慮、ベースライン1未達のため)。
- 改善に寄与したのは主に**異種アンサンブル(ランク平均)**で、単体モデル(HGB/LightGBM/
シード平均)はいずれも検証期間で50.1〜50.5%程度に留まりベースラインを上回れなかった
(
EXPERIMENTS.md参照)。2つの弱い予測器の順位相関の低さを利用した分散低減が効いたと考えられる。 - v1の^N225単独モデル(53.54%)は母数が小さく(n=495)統計的に有意ではなかった点は変わらず、 v2では全銘柄プールでの評価を主指標としている。
- 総じて、「日次方向はほぼ予測不能」という効率的市場仮説に近い結果は変わらないが、 v2のアンサンブル手法により0.5からの統計的乖離をわずかに検出できるようになった、という 限定的な改善として報告する。v1の数値は削除せず上表に残している。
src/daily.py により毎営業日、翌営業日の予測を生成し実績と突合している(launchd設置は未実施、
本リポジトリでは手動実行によるテストのみ)。累計成績は TRACK_RECORD.md を参照
(実行後に生成される)。
- 生存者バイアス: 現在の日経225採用銘柄でユニバースを構成し過去に遡って取得しているため、 過去に上場廃止・入替となった銘柄は含まれない。
- 取引コスト非考慮: 手数料・スリッページ・税金は一切考慮していない(実売買を行わないため)。
- 地合い変化: 学習期間と評価期間で市場のレジームが異なる可能性があり、将来の性能を保証しない。
- 翌営業日判定:
src/daily.pyの翌営業日推定は月〜金の平日判定のみで、日本の祝日カレンダーは 厳密には考慮していない(詳細はSPEC.md「実装からの質問」)。
python3 -m venv venv
./venv/bin/pip install -r requirements.txt# 1. ユニバース確認・データ取得・特徴量確認(先読み防止テスト。v2拡張特徴量を含む)
./venv/bin/python -m pytest tests/test_no_lookahead.py -v
# 2a. バックテストv1(ベースライン→モデル選択→ホールドアウト最終評価、reports/backtest_report.md 生成)
./venv/bin/python -u src/backtest.py
# 2b. バックテストv2(v2特徴量+LightGBM+optuna探索+アンサンブル+embargo、
# reports/backtest_report_v2.md 生成。selected_config.json を上書きする点に注意)
./venv/bin/python -u src/backtest_v2.py
# 3. 日次予測ジョブ(手動実行。本番運用のlaunchd設置は未実施)
./venv/bin/python -u src/daily.pySPEC.md / README.md / EXPERIMENTS.md / TRACK_RECORD.md(生成物)
requirements.txt
src/universe.py data.py features.py models.py backtest.py backtest_v2.py daily.py
tests/test_no_lookahead.py
data/(キャッシュ・.gitignore) predictions/ reports/ logs/(.gitignore)