Cross-Sectional Momentum on 1d Crypto — Backtest Report
Date: 2026-06-10
Analyst: Claude (for Jacques)
Data: crypto_cross.db, 1d candles, June 2024 → 2026-06-09
Engine: /root/backtest_xsmom_PY-00027_100626.py
Helpers: /root/xsmom_finals_100626.py (finalist cross-eval), /root/xsmom_robust_100626.py (robustness sweep)
Outputs: /root/xsmom_tune_leaderboard_100626.csv, /root/clean_universe_1d_100626.txt
1. Goal & why
Project mission: find a trading strategy with positive expectancy after costs. The prior lead (flag breakouts) was shelved — its edge was a single month and died under the 8-position cap. The next lead on the list was cross-sectional momentum: each week, rank coins by recent performance and trade the extremes (long strongest / short weakest), gated by the BTC regime. This report tests that idea under the project's mandatory validation rules.
Validation rules applied (CLAUDE.md): - Costs: 0.055% fee/side + 0.03% slippage/side = 0.085%/side → 0.17% round-trip. Charged on every position-week (no turnover netting) → slightly conservative. - Max 8 concurrent positions. Equal weight, 1/8 of equity per slot, gross ≤ 1.0 (no leverage). - Tune on data before 2026-01-01 only. 2026 held back as untouched out-of-sample (OOS). - Report trades, win rate, avg R, profit factor, max drawdown, monthly table, last-14-day. - Beware survivorship bias. Be honest.
2. Building a clean, bias-free universe
Before any strategy logic, I checked the data for survivorship bias — critical for a ranking strategy, where a coin appearing or vanishing mid-test distorts the ranks.
- 309 symbols have 2026 daily data; 0 delisted mid-period (no vanishing coins — the safer direction).
- 60 symbols are late 2026 listings — almost all tokenized stocks/ETFs (NVDA, TSLA, QQQ, SOXL…) and metals (XAU, XAG). A different asset class; excluded.
- Requiring continuous daily history from before 2026-01-01 through today automatically drops every late listing, leaving 249 coins. Removing two gold-pegged tokens (PAXG, XAUT) → 247.
- Scanned for stablecoins (price pinned near $1.00): none present — nothing to exclude there.
Result: clean_universe_1d_100626.txt, 247 coins, continuous and crypto-only.
Top-100 selection — and a deliberate bias experiment
We have no market-cap field, so "top 100" uses average daily dollar volume (close × volume) as the proxy — which also doubles as the right liquidity screen. Ordering sanity-checks correctly (BTC > ETH > SOL > HYPE > XRP…).
Two ways to pick the top 100, run as a controlled comparison: - FIXED — today's top-100 applied across all history. This has look-ahead/survivorship bias (it pre-selects coins that grew large later). Jacques chose this as the primary view. - POINT-IN-TIME (PIT) — recompute the top-100 each week from trailing volume known at that time. No look-ahead. This is the honest test, run as a bias check.
3. Method
- Weekly rebalance (every 7 days). Signal and execution on the daily close.
- Momentum signal =
close[t-skip] / close[t-skip-L] - 1, ranked across the universe. - Position modes tested: pure long/short, long-only, and three BTC-regime-gated variants (BTC vs its 50-day MA decides whether to be long, short, or flat).
- 120-variant grid across lookback {14,21,30,45,60,90}, skip {0,7}, mode {5}, n_side {3,4} — scored on the tune set (pre-2026) only. Finalists then evaluated once on OOS and under PIT.
4. Results
4a. Tune-set leaderboard (pre-2026, FIXED universe)
Best risk-adjusted variant: regime-gated long/short, 21d lookback, 3 per side —
PF 1.55, +176%, max DD −9.2%, Sharpe 2.25. A useful sanity signal: the skip=7 long/short
variants lose money (momentum inverts to reversal at a 1-week skip), so the engine is
measuring something real.
4b. Finalists across all four cells (tune/OOS × fixed/PIT)
The bias check was decisive. Headline survivor — regime_ls, L21, N3:
| Universe | Period | Trades | Win | PF | Return | Max DD | Sharpe |
|---|---|---|---|---|---|---|---|
| FIXED | Tune | 252 | 56.3% | 1.55 | +176.5% | −9.2% | 2.25 |
| FIXED | OOS | 66 | 45.5% | 1.13 | +5.5% | −25.3% | 0.51 |
| PIT | Tune | 258 | 51.6% | 1.24 | +61.7% | −31.8% | 0.88 |
| PIT | OOS | 66 | 59.1% | 1.26 | +19.8% | −20.9% | 1.07 |
Under the honest PIT universe it is positive and consistent in both periods — the same ~1.25 profit factor in and out of sample.
The look-ahead trap, caught explicitly: the long-only / fast-lookback variant (L14, N4) showed +831% OOS on the FIXED universe — and −56% OOS under PIT. Pre-loading 2026's winners and going long-only trivially "predicts" them; rerun honestly, it collapses. Variants C and D also looked great in one cell but failed either the tune set or the bias check, so we could not claim we'd have selected them. The fixed/biased universe is unreliable, not merely optimistic.
4c. Robustness (PIT, neighbourhood sweep around the survivor)
- 29 / 36 parameter combos profitable (PF > 1) in both tune and OOS.
- Median OOS PF 1.59, median OOS Sharpe 1.24.
- Robust band: lookback 21–35d. Lookback 14d overfits (strong tune, fails OOS) — avoid.
- A plateau, not a spike → the edge is not a single lucky parameter.
4d. OOS 2026 monthly (PIT, headline variant)
Jan +18.5% · Feb +0.0% (flat — BTC regime off) · Mar +22.1% · Apr −20.9% · May +4.7% · Jun ~0% (partial). Last ~14 days: −4.2% (currently in a drawdown).
5. Honest conclusion
A modest, real-looking edge: regime-gated long/short 21-day momentum, ~1.25 profit factor net of full costs, consistent across tune and OOS, robust to parameter choice. This is the first strategy in the project to pass validation rather than fail it.
Caveats I won't bury: 1. OOS is statistically thin. 66 trades / ~23 weeks; OOS-only t-stat ≈ 0.7 (not significant alone). Confidence comes from tune+OOS agreement and the parameter plateau, not 2026 by itself. 2. The +100%+ figures in some neighbour cells are inflated by a short, momentum-friendly 2026 window. Treat the conservative center (PF ~1.25) as the expectation. 3. It is really a bull-market alt-dispersion strategy — flat in BTC downtrends (no edge, no loss). Its worst month (Apr −21%) was a bull-regime whipsaw the filter did not catch.
Recommendation: worth a forward paper-trade (log weekly picks, track live) before any capital. Two open questions for next time: (a) what caused the April whipsaw and whether a second filter fixes it without overfitting; (b) whether a volatility-scaled position size lifts the risk-adjusted return.
Status: PASS (provisional, pending forward test).