SpotCrossSectionalMomentumRotationLong
Hypotheses
Spot Cross-Sectional Momentum Rotation Long-Only (Wide Cross-Sector Universe, Weekly Rebalance, Top-K Equal-Weight, Dual-Momentum Filter)
Hypotheses
A long-only, MULTI-INSTRUMENT cross-sectional MOMENTUM rotation strategy on BINANCE_SPOT (CASH account, hard leverage-1 cap) across a WIDE, cross-sector universe of liquid spot majors, rebalanced WEEKLY using daily bars and OHLCV-ONLY data. This is engineered around two hard lessons from this session: (1) cross-sectional REVERSAL (buy losers) on the 6 tightly-correlated majors repeatedly failed (net-negative, regime-fragile), but cross-sectional MOMENTUM rotation (buy winners) is the regime-aligned side that succeeded in the portfolio — so this buys the strongest assets, not the weakest; and (2) multi-leg baskets CANNOT cap summed exposure <=100% on a FUTURES venue in this engine (the BTC-ETH-SOL basket hit 265% exposure across three genuine fixes), but on BINANCE_SPOT (CASH) exposure is capped at 100% BY CONSTRUCTION — the analyst's explicit prescription. The universe deliberately spans SECTORS to maximize cross-sectional dispersion (the analyst's 'wider, less-correlated universe' recommendation), reducing the all-correlated problem that limited the failed majors-only book: store-of-value (BTC), smart-contract L1s (ETH, SOL, ADA), exchange token (BNB), payments (XRP, LTC), and meme (DOGE). Each week it ranks the universe by trailing momentum and holds the top-K equal-weight, applying an ABSOLUTE-momentum (dual-momentum, Antonacci) filter that refuses to hold any asset whose own trailing return is negative — moving that sleeve to cash — which structurally cuts the bear-market drawdowns that crush long-only crypto. Simple (4-5 parameters), OHLCV-only, deep multi-year spot history on all constituents, no options/HL/COIN-M/cross-venue/supplementary dependencies (all confirmed unvalidatable). Fills three under-represented buckets simultaneously: multi-instrument scope (9.9%), BINANCE_SPOT venue (11.8%), and the long/macro horizon (~0.3%).
Hypotheses
Fixes exactly the QA-reported defect and nothing else. (1) CROSS-SECTIONAL RANKING: the ranking loop previously required `_last_day_index[sym] == current_day`, but since the 14 daily bars arrive sequentially, the first-arriving symbol pushed current_day to D while the other 13 were still at D-1, so the ranked set was always a single symbol (BTC) — i.e. single-asset absolute momentum. The universe is now ranked as of `rank_day = current_day - 1`, the last day EVERY listed symbol has already reported, so all 14 legs enter the cross-section. To compare symbols with different listing dates and possible missing days, each symbol now carries a day-index list aligned 1:1 with its close list (trimmed together, preserving the multi-instrument alignment rule) and trailing returns are computed by DAY lookup (`_ret_as_of`) rather than by list position; a `stale_tol` of 3 days bounds how stale an observation may be, and a `min_universe` of 3 makes the strategy stand aside rather than rank a degenerate set. (2) CADENCE: rebalance_days is now 7 (a week on 24/7 daily bars, as the hypothesis states) and the schedule is CALENDAR-ANCHORED — it fires when `current_day % rebalance_days == 0`, a pure function of the bar timestamp, identical across restarts and backtest/paper replay, replacing the uptime-relative `current_day - _last_rebalance_day` counter. (3) The static-analyzer division flags QA marked as false positives, the spot/CASH venue, the exposure cap, the two-bar exit/entry split, the MTM subscriptions, sizing and the continuous primary-asset signal are all untouched so Layers 1-3 stay green. The headline sandbox number will now change (it was 'hold BTC while 30d momentum is positive'); the top-K rotation edge can finally be judged on its own terms.
Hypotheses
Long-only cross-sectional momentum basket carried by crypto beta with NEGATIVE alpha over its own baseline — not worth 2 hours of optimization. benchmark_meaningful is true and information_ratio is -0.29 versus the equal-weight-basket benchmark: the momentum sort does not add risk-adjusted value over a naive equal-weight hold of the same 14 names, so the +3265% headline is long-crypto beta (beta 0.41, benchmark_correlation 0.59), not skill. It carries a 46% max drawdown (CI to 91%) despite the dual-momentum cash filter that was supposed to cut exactly that (2022 -30%, 2025 -20%), and the return is concentrated in bull years (2021 +616%, 2020/2024 large) while 2018/2022/2025/2026 are all negative — with rolling Sharpe deeply negative from 2025-09 through 2026, placing the 20% holdout in the losing regime. Sharpe 0.64 with bootstrap CI [0.043, 1.28] barely clears zero. This is the L45/L49/L36 long-only multi-instrument cross-sectional basket family (0/84 survivors), the same beta-carried / negative-IR-vs-benchmark signature as the LowVol rotation abandoned this session; optimization would curve-fit the sort to the bull regimes. Failure pattern: no_edge/risk_reject long-only cross-sectional momentum basket, beta-carried, negative IR vs benchmark, 46%+ drawdown (L45/L49/L36/L19).
Implementation
Long-only cross-sectional momentum rotation across 14 liquid cross-sector Binance SPOT majors (BTC, ETH, SOL, ADA, BNB, XRP, LTC, DOGE, LINK, AVAX, DOT, ATOM, BCH, TRX) on daily bars, CASH account, leverage 1.0. Every 7 days (calendar-anchored: the bar's epoch day index divisible by rebalance_days) the strategy ranks the ENTIRE universe by trailing 30-day return measured as of the last fully-observed day, holds the top 4 equal-weight (~24% each, summed gross capped at 99% and by CASH construction at 100%), and applies an absolute-momentum (dual-momentum) filter that moves any top-K sleeve whose own trailing return is non-positive to cash instead of buying it. Exits for dropped names are submitted on the rebalance bar and new entries on the following bar so no bar carries both realized exit PnL and new-entry mark-to-market. OHLCV only, no funding/supplementary dependencies.
Verification Results
Verification failed (Layer 4 — QA review) [class=code_defect]:
- [edge_concern] The sandbox's headline 238% / PF 3.46 is an artifact of the bug below: it is effectively 'hold BTC while its 30d momentum is positive,' not cross-sectional rotation. Real edge cannot be judged until the ranking sees the full universe.
- The cross-sectional ranking never sees the full universe, so the core edge (rank N instruments, hold top-K) is not implemented. `_maybe_rebalance()` runs once per symbol-bar and uses current_day = max(_last_day_index). Because the 14 daily bars arrive sequentially, when the FIRST symbol's bar for a new day D arrives, current_day jumps to D while the other 13 are still at D-1. The rebalance fires on that first bar, and the ranking loop skips every symbol whose _last_day_index != current_day, so `returns` holds ONLY the first-arriving symbol. The _last_rebalance_day and _pending_entries gates then block any re-rank for the rest of day D. Net: each rebalance ranks a 1-element set (BTC), i.e. single-asset absolute momentum, not the wide-universe top-K rotation the hypothesis requires. Confirmed by the sandbox: 37 trades / 2398 days, 33-day avg hold, avg_position_pct ~24% (one leg), benchmark_correlation 0.46.
- Hypothesis says WEEKLY rebalance but rebalance_days=5; on 24/7 crypto daily bars a week is 7 bars. Non-blocking cadence difference.
Verification Results
Have engineering confirm how exposure_pct is computed for a multi-leg CASH book (cumulative vs point-in-time gross) and that peak point-in-time gross/equity never exceeds max_gross. No strategy code change indicated.
Verification Results
Sandbox exposure_pct 215% superficially contradicts the premise that BINANCE_SPOT CASH caps summed exposure at 100%. Evidence indicates the code is correct (avg_position_pct 20.69% x 4 legs ~83% gross; explicit committed<=equity*max_gross guard; CASH cannot borrow), so this reads as a metric-definition artifact rather than real over-allocation — a warning, not a critical. But since it touches the exact risk-control claim the strategy is built around, verify before promotion.
Verification Results
None required.
Verification Results
Synthetic tests report a frozen 0.0 signal across all 6 scenarios. Expected/non-fatal: calculate_signal returns the primary asset's trailing daily return, which needs many DAILY closes, but the Layer-2 synthetic feed is a short single-day 1-minute series so per-day closes never accumulate. Real trading routes through _maybe_rebalance/_submit_entry_instrument, not the verifier signal.
Backtest Review
Momentum (winners) is the survivor side, on spot CASH (100% cap, no funding), with the iter-5 cross-sectional ranking bug genuinely fixed (310 trades, real top-K rotation)
Backtest Review
Large sample (310 trades / 9 years), positive alpha (0.23), avg_trade_return_pct 8.0% clears fees, PSR 0.964
Backtest Review
Negative information_ratio (-0.29) vs its own equal-weight-basket benchmark — the momentum sort does NOT add risk-adjusted value over a naive equal-weight hold of the 14 names; the headline is long-crypto beta (beta 0.41, benchmark_correlation 0.59)
Backtest Review
Brutal drawdown for a strategy whose premise was cutting them: max_drawdown 46% (CI to 91%); the dual-momentum cash filter did not prevent -30% in 2022 or the deep 2025 bleed
Backtest Review
Edge concentrated in bull years: 2021 +616%, 2020/2024 big — while 2018 -27%, 2022 -30%, 2025 -20%, 2026 -6% are all negative; rolling Sharpe deeply negative from 2025-09 through 2026, so the holdout sits in the losing regime
Backtest Review
Sharpe 0.64 with bootstrap CI [0.043, 1.28] barely clearing zero; return_kurtosis 9.0, end_unrealized_pct -117
Backtest Review
L45/L49/L36 long-only multi-instrument cross-sectional basket family (0/84), beta-carried, negative IR vs benchmark — same signature as the LowVol rotation abandoned this session
Backtest and paper results are hypothetical. Trading involves risk of loss.