qbuntuqbuntu
rejectedregime_dependent· equity· dispersion· regime· timing

Cross-Sectional Dispersion Trading (JP Growth Stocks)

slug: dispersion-jp-growth

Cross-Sectional Dispersion Trading (JP Growth Stocks) backtest. Median Sharpe across 384 parameter sets is -0.25. p-value is 0.49. Max DD is -34.7%. Period: 2022-03-01 to 2026-09-01. Best Sharpe +0.49 is not the representative figure.

Verdict: rejected. The median reaches neither promising (Sharpe > 0.5 and p-value < 0.05) nor marginal (Sharpe > 0.05 and best p-value < 0.10). Results split across up, flat, and down markets, so the median is not stable.

Performance summary

Sharpe (median)
-0.25
Max DD
-34.7%
Win rate
—
Alpha (ann.)
—
p-value
0.49
backtest period: 2022-03-01 → 2026-09-01
Sharpe across 384 grid runs:median -0.25best 0.49 (not representative)worst -1.31p25–p75 -0.53–0.02

Hypothesis

Stivers (2010), Jiang (2010): cross-sectional return dispersion as a market timing signal. High dispersion favors momentum; low dispersion favors mean reversion. Switches between base signals based on dispersion regime.

Why it didn't work

Across 384 grid combinations, median Sharpe=-0.25, best=0.49. Primary failure mode: regime_dependent.

Facts (5)

Best grid Sharpe ratio is 0.49 (p=0.29).
period 2022-03-01–2026-09-01; cost=5bps
sharpe_ratio0.49
Median Sharpe across 384 grid runs is -0.25.
Full grid of 384 parameter combinations.
sharpe_ratio-0.25
Median Sharpe in DOWN regime is -1.32 across 384 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
sharpe_ratio-1.32
Median Sharpe in FLAT regime is -0.08 across 384 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
sharpe_ratio-0.08
Median Sharpe in UP regime is -0.39 across 384 runs.
Regime=UP, N225 SMA20/SMA60 classification.
sharpe_ratio-0.39

Runs (30)

runparamssharpeUPFLATDOWN
dispersion_window=10, holding_days=5, base_signal=momentum_20, n_stocks=5, cost_bps=5
r-dispersion-jp-growth-0000
cost_bps: 5
n_stocks: 5
base_signal: "momentum_20"
-1.24-1.43-1.07-2.70
dispersion_window=10, holding_days=5, base_signal=momentum_20, n_stocks=5, cost_bps=10
r-dispersion-jp-growth-0001
cost_bps: 10
n_stocks: 5
base_signal: "momentum_20"
-1.31-1.52-1.13-2.75
dispersion_window=10, holding_days=5, base_signal=momentum_20, n_stocks=10, cost_bps=5
r-dispersion-jp-growth-0002
cost_bps: 5
n_stocks: 10
base_signal: "momentum_20"
-1.12-1.76-0.86-1.72
dispersion_window=10, holding_days=5, base_signal=momentum_20, n_stocks=50, cost_bps=5
r-dispersion-jp-growth-0006
cost_bps: 5
n_stocks: 50
base_signal: "momentum_20"
-0.51-1.16-0.14-1.51
dispersion_window=10, holding_days=5, base_signal=momentum_60, n_stocks=5, cost_bps=5
r-dispersion-jp-growth-0008
cost_bps: 5
n_stocks: 5
base_signal: "momentum_60"
-0.86-1.66-0.60-2.33
dispersion_window=10, holding_days=5, base_signal=mean_reversion, n_stocks=5, cost_bps=5
r-dispersion-jp-growth-0016
cost_bps: 5
n_stocks: 5
base_signal: "mean_reversion"
-0.37-1.47+0.07+1.45
dispersion_window=10, holding_days=5, base_signal=mean_reversion, n_stocks=50, cost_bps=5
r-dispersion-jp-growth-0022
cost_bps: 5
n_stocks: 50
base_signal: "mean_reversion"
-0.09-0.60-0.01+1.17
dispersion_window=10, holding_days=10, base_signal=momentum_60, n_stocks=50, cost_bps=10
r-dispersion-jp-growth-0039
cost_bps: 10
n_stocks: 50
base_signal: "momentum_60"
-0.08+0.13-0.08-1.06
dispersion_window=10, holding_days=20, base_signal=momentum_60, n_stocks=5, cost_bps=5
r-dispersion-jp-growth-0056
cost_bps: 5
n_stocks: 5
base_signal: "momentum_60"
-0.70+0.22-0.99-1.53
dispersion_window=10, holding_days=60, base_signal=momentum_20, n_stocks=5, cost_bps=5
r-dispersion-jp-growth-0072
cost_bps: 5
n_stocks: 5
base_signal: "momentum_20"
-0.24-0.05-0.19-1.73
dispersion_window=10, holding_days=60, base_signal=momentum_20, n_stocks=10, cost_bps=5
r-dispersion-jp-growth-0074
cost_bps: 5
n_stocks: 10
base_signal: "momentum_20"
-0.04-0.28+0.02-0.32
dispersion_window=10, holding_days=60, base_signal=mean_reversion, n_stocks=10, cost_bps=10
r-dispersion-jp-growth-0091
cost_bps: 10
n_stocks: 10
base_signal: "mean_reversion"
+0.01-0.47+0.20-0.90
dispersion_window=20, holding_days=5, base_signal=momentum_60, n_stocks=20, cost_bps=5
r-dispersion-jp-growth-0108
cost_bps: 5
n_stocks: 20
base_signal: "momentum_60"
-0.53-0.45-0.50-1.16
dispersion_window=20, holding_days=10, base_signal=momentum_20, n_stocks=20, cost_bps=10
r-dispersion-jp-growth-0125
cost_bps: 10
n_stocks: 20
base_signal: "momentum_20"
-0.06-0.36+0.15-2.64
dispersion_window=20, holding_days=10, base_signal=mean_reversion, n_stocks=50, cost_bps=5
r-dispersion-jp-growth-0142
cost_bps: 5
n_stocks: 50
base_signal: "mean_reversion"
-0.43-0.99-0.36+0.77
dispersion_window=20, holding_days=20, base_signal=momentum_60, n_stocks=50, cost_bps=10
r-dispersion-jp-growth-0159
cost_bps: 10
n_stocks: 50
base_signal: "momentum_60"
-0.50-0.51-0.37-1.67
dispersion_window=20, holding_days=60, base_signal=momentum_60, n_stocks=5, cost_bps=5
r-dispersion-jp-growth-0176
cost_bps: 5
n_stocks: 5
base_signal: "momentum_60"
+0.01-0.15+0.10-1.35
dispersion_window=40, holding_days=5, base_signal=momentum_20, n_stocks=5, cost_bps=10
r-dispersion-jp-growth-0193
cost_bps: 10
n_stocks: 5
base_signal: "momentum_20"
-1.31-1.52-1.13-2.75
dispersion_window=40, holding_days=5, base_signal=mean_reversion, n_stocks=10, cost_bps=5
r-dispersion-jp-growth-0210
cost_bps: 5
n_stocks: 10
base_signal: "mean_reversion"
-0.27-0.60-0.19+1.14
dispersion_window=40, holding_days=10, base_signal=momentum_60, n_stocks=10, cost_bps=10
r-dispersion-jp-growth-0227
cost_bps: 10
n_stocks: 10
base_signal: "momentum_60"
0.00-0.27+0.18-1.28
dispersion_window=40, holding_days=20, base_signal=momentum_20, n_stocks=20, cost_bps=5
r-dispersion-jp-growth-0244
cost_bps: 5
n_stocks: 20
base_signal: "momentum_20"
-0.50+0.24-0.62-2.41
dispersion_window=40, holding_days=20, base_signal=mean_reversion, n_stocks=20, cost_bps=10
r-dispersion-jp-growth-0261
cost_bps: 10
n_stocks: 20
base_signal: "mean_reversion"
+0.10-1.14+0.33+2.84
dispersion_window=40, holding_days=20, base_signal=mean_reversion, n_stocks=50, cost_bps=5
r-dispersion-jp-growth-0262
cost_bps: 5
n_stocks: 50
base_signal: "mean_reversion"
+0.49+0.76+0.39+2.73
dispersion_window=40, holding_days=60, base_signal=momentum_60, n_stocks=50, cost_bps=10
r-dispersion-jp-growth-0279
cost_bps: 10
n_stocks: 50
base_signal: "momentum_60"
+0.10-0.10+0.31-2.13
dispersion_window=60, holding_days=5, base_signal=momentum_20, n_stocks=5, cost_bps=5
r-dispersion-jp-growth-0288
cost_bps: 5
n_stocks: 5
base_signal: "momentum_20"
-1.24-1.43-1.07-2.70
dispersion_window=60, holding_days=5, base_signal=momentum_60, n_stocks=5, cost_bps=10
r-dispersion-jp-growth-0297
cost_bps: 10
n_stocks: 5
base_signal: "momentum_60"
-0.92-1.75-0.65-2.38
dispersion_window=60, holding_days=10, base_signal=momentum_20, n_stocks=10, cost_bps=5
r-dispersion-jp-growth-0314
cost_bps: 5
n_stocks: 10
base_signal: "momentum_20"
-0.25-0.34-0.16-1.64
dispersion_window=60, holding_days=10, base_signal=mean_reversion, n_stocks=10, cost_bps=10
r-dispersion-jp-growth-0331
cost_bps: 10
n_stocks: 10
base_signal: "mean_reversion"
-0.55-1.63-0.15-2.21
dispersion_window=60, holding_days=20, base_signal=momentum_60, n_stocks=20, cost_bps=5
r-dispersion-jp-growth-0348
cost_bps: 5
n_stocks: 20
base_signal: "momentum_60"
-0.30+0.49-0.40-2.85
dispersion_window=60, holding_days=60, base_signal=momentum_20, n_stocks=20, cost_bps=10
r-dispersion-jp-growth-0365
cost_bps: 10
n_stocks: 20
base_signal: "momentum_20"
-0.16-0.52-0.04-2.34

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-09-24T02:22:19

Related strategies