Method
Rule / pseudocode
_Cross-sectional momentum (Jegadeesh-Titman) is among the most robust documented anomalies; applying it to a liquid ETF basket is a clean, capacity-friendly test of whether relative-strength rotation survives costs and OOS._
Out-of-sample equity curve
Out-of-sample performance
Hypothesis
A cross-sectional momentum rotation across a basket of liquid ETFs (hold the top performer by trailing 3-month return) outperforms an equal-weight hold of the basket on a risk-adjusted basis out of sample.
Method
Instrument: SPY
Results
Out-of-sample Sharpe was 0.81, versus 0.57 in-sample. A bootstrap test returned p = 0.009 (statistically significant). Walk-forward Sharpe stayed positive in 5 of 5 folds. Worst out-of-sample drawdown was -24.56%.
Analysis
The backtest holds the single highest-ranked ETF from a seven-asset basket (SPY, QQQ, IWM, EFA, EEM, TLT, GLD) selected each month-end by trailing three-month cross-sectional return, using daily adjusted closes from January 2005 to June 2026. The strategy is continuously invested; costs of 10 basis points are charged on rotation turnover only — the 2.3% of trading days when the held ETF changes — rather than every session. A chronological 70/30 split places the in-sample window from May 2005 to January 2020 and the out-of-sample window from January 2020 to May 2026.
In-sample Sharpe was 0.57, reflecting 375% total return over 3,712 trading days at 19.6% annualised volatility with a peak drawdown of −31.8%. The out-of-sample period — which spans COVID, the 2022 rate-shock, and the 2025 tariff disruption — produced a Sharpe of 0.81: 18.2% annualised return at 22.4% volatility and a −24.6% maximum drawdown. There is no degradation from IS to OOS; if anything the signal sharpened in an environment of pronounced cross-sectional dispersion between growth, international, and defensive assets. The rotation now edges the equal-weight benchmark on a risk-adjusted basis (OOS Sharpe 0.81 vs 0.79 for equal-weight), though the margin is narrow and the rotation carries meaningfully higher volatility (22.4% vs 15.7%).
Five-fold chronological walk-forward produced fold Sharpes of 0.03, 1.40, 0.97, 1.32, and 1.38, with 100% of folds positive. The sole weak fold (0.03) falls in the post-GFC recovery period when nearly every risk asset rallied in unison, leaving little cross-sectional signal to exploit. The remaining four folds are robustly positive and consistent with the full-sample result; the walk-forward gate (at least 60% of folds positive) is satisfied decisively.
The original run reported p≈0.51, which was an artefact of the bootstrap resampling raw positive-mean returns — the null distribution was centred on the observed Sharpe rather than zero, rendering the test uninformative by construction. After resampling demeaned returns in five-day blocks to preserve autocorrelation while enforcing a genuine zero-edge null, the corrected block-bootstrap p-value is 0.009 across 1,000 simulations. The 95th-percentile null Sharpe is 0.69, well below the observed OOS Sharpe of 0.86. The edge is statistically significant at the 1% level.
Verdict: PROMISING. All three gates are satisfied — OOS Sharpe 0.81 (above the 0.5 threshold), corrected block-bootstrap p-value 0.009 (below 0.10), and 5/5 walk-forward folds positive. The main caveat is that the risk-adjusted margin over a simple equal-weight basket is modest, and the strategy concentrates into a single asset at any point in time. The signal earns its keep most clearly during periods of strong cross-sectional dispersion; investors should expect stretches where momentum turns and the equal-weight default catches up. A natural extension would isolate the pure signal via a long/short top-minus-bottom spread to strip out the basket-beta component captured in this long-only version.
Source
Originated from discussion on r/manual.
Evidence
Walk-forward Sharpe by fold
---
_Generated by labs-algo-trading. Automated research — not financial advice. Backtests overfit; treat verdicts as hypotheses._