LightGBM Factor Model (JP All Stocks)
slug: ml-factor-lgbm-9f-jp-all
performance summary
Sharpe (median)
-1.19
Max DD
-55.5%
Win rate
—
Alpha (ann.)
—
p-value
0.02
backtest period: 2022-02-01 → 2026-02-20
Sharpe across 1536 grid runs:median -1.19best 0.38 (not representative)worst -2.12p25–p75 -1.44–-0.84
Hypothesis
A LightGBM model trained on cross-sectional factor features can predict next-period stock returns. Testing the same model on the full Japanese stock universe.
Why it didn't work
Across 1536 grid combinations, median Sharpe=-1.19, best=0.38. Primary failure mode: no_edge.
Facts (7)
Average monthly return correlation with other strategies in DOWN regime: 0.04
Pairwise Pearson correlation of monthly returns across 42 strategies, filtered to DOWN regime months (N=3, N225 < SMA20 < SMA60)
Average monthly return correlation with other strategies (full period): -0.06
Pairwise Pearson correlation of monthly returns across 42 strategies, full backtest period
Best grid Sharpe ratio is 0.38 (p=0.45).
period 2022-02-01–2026-02-20; cost=5bps
cite ↗ /cite/ml-factor-lgbm-9f-jp-all-fact-best-sharpevia r-ml-factor-lgbm-9f-jp-all-1044
Median Sharpe across 1536 grid runs is -1.19.
Full grid of 1536 parameter combinations.
Median Sharpe in DOWN regime is -1.22 across 1536 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
Median Sharpe in FLAT regime is -0.75 across 1536 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
Median Sharpe in UP regime is -2.15 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-all-0000 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | -0.96 | -1.43 | -0.81 | -0.46 |
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-all-0001 | num_leaves: 7 feature_set: "9f-base" regime_gate: true | -1.26 | -2.84 | -0.81 | -0.46 |
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-all-0002 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | -1.44 | -2.06 | -1.19 | -1.24 |
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-all-0006 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | -1.33 | -1.68 | -1.07 | -1.83 |
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-all-0024 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | -1.20 | -2.29 | -0.68 | -1.04 |
num_leaves=7, learning_rate=0.1, n_estimators=200, feature_set=9f-base, walk_forward_window=60, regime_gate=True r-ml-factor-lgbm-9f-jp-all-0029 | num_leaves: 7 feature_set: "9f-base" regime_gate: true | -2.12 | -3.82 | -1.43 | -2.61 |
num_leaves=31, learning_rate=0.03, n_estimators=200, feature_set=9f-base, walk_forward_window=60, regime_gate=True r-ml-factor-lgbm-9f-jp-all-0077 | num_leaves: 31 feature_set: "9f-base" regime_gate: true | -1.40 | -3.26 | -0.64 | -1.90 |
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-all-0096 | num_leaves: 63 feature_set: "9f-base" regime_gate: false | -1.23 | -1.60 | -1.02 | -1.41 |
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-all-0150 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | -1.19 | -1.91 | -0.91 | -0.88 |
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-all-0222 | num_leaves: 31 feature_set: "9f-base" regime_gate: false | -1.33 | -2.19 | -1.05 | -0.39 |
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-all-0256 | num_leaves: 7 feature_set: "9f-base" regime_gate: false | -0.15 | -0.32 | -0.10 | +0.18 |
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-all-0295 | num_leaves: 15 feature_set: "9f-base" regime_gate: true | -1.04 | -2.09 | -0.75 | -0.18 |
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-all-0367 | num_leaves: 63 feature_set: "9f-base" regime_gate: true | -1.22 | -1.88 | -0.98 | -0.93 |
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-all-0384 | num_leaves: 7 feature_set: "15f-swing" regime_gate: false | -0.49 | -0.67 | -0.62 | +0.95 |
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-all-0440 | num_leaves: 15 feature_set: "15f-swing" regime_gate: false | -1.50 | -2.55 | -1.15 | -0.54 |
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-all-0512 | num_leaves: 7 feature_set: "15f-swing" regime_gate: false | -0.40 | -0.81 | -0.08 | -1.22 |
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-all-0584 | num_leaves: 31 feature_set: "15f-swing" regime_gate: false | -1.11 | -1.07 | -1.23 | -0.39 |
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-all-0656 | num_leaves: 7 feature_set: "15f-swing" regime_gate: false | -0.44 | +0.02 | -0.93 | +1.50 |
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-all-0728 | num_leaves: 31 feature_set: "15f-swing" regime_gate: false | -0.86 | -0.23 | -1.01 | -1.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-all-0800 | num_leaves: 15 feature_set: "8f-no-volume" regime_gate: false | -1.43 | -2.49 | -1.17 | +0.32 |
num_leaves=63, learning_rate=0.03, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=60, regime_gate=False r-ml-factor-lgbm-9f-jp-all-0872 | num_leaves: 63 feature_set: "8f-no-volume" regime_gate: false | -1.62 | -3.15 | -0.96 | -0.97 |
num_leaves=15, learning_rate=0.05, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=120, regime_gate=False r-ml-factor-lgbm-9f-jp-all-0944 | num_leaves: 15 feature_set: "8f-no-volume" regime_gate: false | -1.13 | -1.37 | -0.66 | -3.23 |
num_leaves=63, learning_rate=0.1, n_estimators=50, feature_set=8f-no-volume, walk_forward_window=120, regime_gate=False r-ml-factor-lgbm-9f-jp-all-1016 | num_leaves: 63 feature_set: "8f-no-volume" regime_gate: false | -1.24 | -1.74 | -0.75 | -2.68 |
num_leaves=7, learning_rate=0.05, n_estimators=200, feature_set=8f-no-volume, walk_forward_window=250, regime_gate=False r-ml-factor-lgbm-9f-jp-all-1044 | num_leaves: 7 feature_set: "8f-no-volume" regime_gate: false | +0.38 | +0.69 | +0.23 | +0.35 |
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-all-1089 | num_leaves: 31 feature_set: "8f-no-volume" regime_gate: true | -1.18 | -2.89 | -0.55 | -0.93 |
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-all-1161 | num_leaves: 7 feature_set: "7f-no-mrs" regime_gate: true | -0.76 | -3.58 | -0.01 | +1.07 |
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-all-1233 | num_leaves: 31 feature_set: "7f-no-mrs" regime_gate: true | -1.87 | -4.45 | -0.90 | -2.04 |
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-all-1305 | num_leaves: 7 feature_set: "7f-no-mrs" regime_gate: true | -1.52 | -3.02 | -0.92 | -1.73 |
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-all-1377 | num_leaves: 63 feature_set: "7f-no-mrs" regime_gate: true | -1.74 | -2.97 | -1.04 | -3.60 |
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-all-1449 | num_leaves: 15 feature_set: "7f-no-mrs" regime_gate: true | -1.30 | -2.45 | -0.61 | -2.78 |
Target universe
Tokyo Stock Exchange all listed (Prime/Standard/Growth), ~3747 stocks
source: qbuntu-analysis · kabu STATION REST API + J-Quants daily bars
computed asof: 2026-08-06T01:50:20