LightGBM Factor Model (JP Growth Stocks)
slug: ml-factor-lgbm-9f-jp-growth
performance summary
Sharpe (median)
+1.75
Max DD
-32.4%
Win rate
—
Alpha (ann.)
—
p-value
0.00
backtest period: 2022-02-01 → 2026-06-10
Sharpe across 1536 grid runs:median 1.75best 3.62 (not representative)worst -0.77p25–p75 1.19–2.43
Hypothesis
A LightGBM model trained on cross-sectional factor features (momentum, volatility, volume, mean-reversion signals) can predict next-period stock returns. Walk-forward validation ensures no lookahead bias. Tests multiple feature sets (9f-base, 15f-swing, 8f-no-volume, 7f-no-mrs) and hyperparameters.
Facts (5)
Best grid Sharpe ratio is 3.62 (p=9.7e-14).
period 2022-02-01–2026-06-10; cost=5bps
cite ↗ /cite/ml-factor-lgbm-9f-jp-growth-fact-best-sharpevia r-ml-factor-lgbm-9f-jp-growth-0098
Median Sharpe across 1536 grid runs is 1.75.
Full grid of 1536 parameter combinations.
Median Sharpe in DOWN regime is 3.05 across 1536 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
Median Sharpe in FLAT regime is 2.22 across 1536 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
Median Sharpe in UP regime is 0.26 across 1536 runs.
Regime=UP, N225 SMA20/SMA60 classification.
Runs (30)
| run | params | sharpe | UP | FLAT | DOWN |
|---|---|---|---|---|---|
num_leaves=7, learning_rate=0.01, n_estimators=50, feature_set=9f-base, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0000 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | +3.10 | +3.70 | +2.90 | +1.92 |
num_leaves=7, learning_rate=0.01, n_estimators=50, feature_set=9f-base, walk_forward_window=60, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-0001 | num_leaves: 7 feature_set: "9f-base" regime_gate: true | +1.82 | -1.27 | +2.90 | +1.92 |
num_leaves=7, learning_rate=0.01, n_estimators=100, feature_set=9f-base, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0002 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | +2.95 | +2.85 | +3.05 | +2.66 |
num_leaves=7, learning_rate=0.01, n_estimators=500, feature_set=9f-base, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0006 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | +2.57 | +2.57 | +2.57 | +2.62 |
num_leaves=7, learning_rate=0.1, n_estimators=50, feature_set=9f-base, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0024 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | +2.09 | +2.37 | +2.19 | +0.18 |
num_leaves=31, learning_rate=0.03, n_estimators=200, feature_set=9f-base, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0076 | num_leaves: 31 feature_set: "9f-base" regime_gate: false | +2.19 | +3.29 | +1.69 | +1.50 |
num_leaves=63, learning_rate=0.01, n_estimators=50, feature_set=9f-base, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0096 | num_leaves: 63 feature_set: "9f-base" regime_gate: false | +3.45 | +3.97 | +3.37 | +1.73 |
num_leaves=63, learning_rate=0.01, n_estimators=100, feature_set=9f-base, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0098 | num_leaves: 63 feature_set: "9f-base" regime_gate: false | +3.62 | +4.07 | +3.54 | +2.28 |
num_leaves=7, learning_rate=0.05, n_estimators=500, feature_set=9f-base, walk_forward_window=120, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0150 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | +1.75 | +2.23 | +1.43 | +2.19 |
num_leaves=31, learning_rate=0.1, n_estimators=500, feature_set=9f-base, walk_forward_window=120, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0222 | num_leaves: 31 feature_set: "9f-base" regime_gate: false | +1.18 | +1.08 | +1.05 | +2.49 |
num_leaves=7, learning_rate=0.01, n_estimators=50, feature_set=9f-base, walk_forward_window=250, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0256 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | +3.01 | +3.00 | +2.70 | +5.66 |
num_leaves=15, learning_rate=0.01, n_estimators=500, feature_set=9f-base, walk_forward_window=250, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-0295 | num_leaves: 15 feature_set: "9f-base" regime_gate: true | +2.04 | -1.62 | +3.02 | +3.99 |
num_leaves=63, learning_rate=0.03, n_estimators=500, feature_set=9f-base, walk_forward_window=250, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-0367 | num_leaves: 63 feature_set: "9f-base" regime_gate: true | +0.98 | -2.06 | +1.84 | +3.12 |
num_leaves=7, learning_rate=0.01, n_estimators=50, feature_set=15f-swing, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0384 | num_leaves: 7 feature_set: "15f-swing" regime_gate: false | +2.85 | +3.53 | +2.48 | +2.75 |
num_leaves=15, learning_rate=0.1, n_estimators=50, feature_set=15f-swing, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0440 | num_leaves: 15 feature_set: "15f-swing" regime_gate: false | +2.00 | +2.75 | +1.66 | +1.53 |
num_leaves=7, learning_rate=0.01, n_estimators=50, feature_set=15f-swing, walk_forward_window=120, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0512 | num_leaves: 7 feature_set: "15f-swing" regime_gate: false | +2.98 | +3.43 | +2.32 | +6.03 |
num_leaves=31, learning_rate=0.03, n_estimators=50, feature_set=15f-swing, walk_forward_window=120, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0584 | num_leaves: 31 feature_set: "15f-swing" regime_gate: false | +2.41 | +2.92 | +1.95 | +3.72 |
num_leaves=7, learning_rate=0.05, n_estimators=50, feature_set=15f-swing, walk_forward_window=250, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0656 | num_leaves: 7 feature_set: "15f-swing" regime_gate: false | +2.88 | +3.50 | +2.18 | +5.47 |
num_leaves=31, learning_rate=0.1, n_estimators=50, feature_set=15f-swing, walk_forward_window=250, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0728 | num_leaves: 31 feature_set: "15f-swing" regime_gate: false | +2.48 | +2.08 | +2.28 | +5.99 |
num_leaves=15, learning_rate=0.01, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-growth-0800 | num_leaves: 15 feature_set: "8f-no-volume" regime_gate: false | +2.73 | +3.69 | +2.24 | +2.36 |
num_leaves=31, learning_rate=0.1, n_estimators=500, feature_set=8f-no-volume, walk_forward_window=60, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-0863 | num_leaves: 31 feature_set: "8f-no-volume" regime_gate: true | -0.77 | -1.95 | -0.29 | -0.63 |
num_leaves=63, learning_rate=0.03, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=60, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-0873 | num_leaves: 63 feature_set: "8f-no-volume" regime_gate: true | +1.02 | -1.01 | +1.67 | +1.63 |
num_leaves=15, learning_rate=0.05, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=120, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-0945 | num_leaves: 15 feature_set: "8f-no-volume" regime_gate: true | +1.74 | -1.45 | +2.63 | +3.82 |
num_leaves=63, learning_rate=0.1, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=120, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-1017 | num_leaves: 63 feature_set: "8f-no-volume" regime_gate: true | +0.92 | -2.74 | +1.99 | +2.23 |
num_leaves=31, learning_rate=0.01, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=250, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-1089 | num_leaves: 31 feature_set: "8f-no-volume" regime_gate: true | +1.72 | -2.51 | +2.75 | +4.14 |
num_leaves=7, learning_rate=0.03, n_estimators=50, feature_set=7f-no-mrs, walk_forward_window=60, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-1161 | num_leaves: 7 feature_set: "7f-no-mrs" regime_gate: true | +1.32 | -2.01 | +2.36 | +2.27 |
num_leaves=31, learning_rate=0.05, n_estimators=50, feature_set=7f-no-mrs, walk_forward_window=60, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-1233 | num_leaves: 31 feature_set: "7f-no-mrs" regime_gate: true | +1.93 | -1.13 | +3.16 | +2.07 |
num_leaves=7, learning_rate=0.1, n_estimators=50, feature_set=7f-no-mrs, walk_forward_window=120, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-1305 | num_leaves: 7 feature_set: "7f-no-mrs" regime_gate: true | +1.22 | -1.73 | +2.03 | +3.09 |
num_leaves=63, learning_rate=0.01, n_estimators=50, feature_set=7f-no-mrs, walk_forward_window=120, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-1377 | num_leaves: 63 feature_set: "7f-no-mrs" regime_gate: true | +1.76 | -2.81 | +2.80 | +5.16 |
num_leaves=15, learning_rate=0.03, n_estimators=50, feature_set=7f-no-mrs, walk_forward_window=250, regime_gate=True r-ml-factor-lgbm-9f-jp-growth-1449 | num_leaves: 15 feature_set: "7f-no-mrs" regime_gate: true | +1.74 | -1.88 | +2.52 | +4.82 |
Target universe
Tokyo Stock Exchange Growth Market, ~495 stocks, tv >= 30M JPY
source: qbuntu-analysis · kabu STATION REST API + J-Quants daily bars
computed asof: 2026-08-14T04:11:19