BtcEthSolDailyCrossSectionalMomentumRotationLong
Hypotheses
BTC/ETH/SOL Daily Cross-Sectional Momentum Rotation Long with 200-SMA Safety Filter
Hypotheses
A long-only MULTI-INSTRUMENT N-ASSET MOMENTUM-ROTATION strategy that selects the strongest-performing crypto major (BTC, ETH, or SOL) and holds it long for the next allocation period. This is the FIRST 3-asset rotation strategy in the portfolio and extends the multi-instrument mechanism class beyond pairs trading: existing multi-instrument strategies trade the SPREAD between 2 assets (ETH/BTC ratio trend, SOL/ETH ratio mean-rev). This strategy SELECTS which of N=3 assets to hold based on relative momentum ranking. Cross-sectional momentum is fundamentally different from both pairs trading (which trades the spread) and single-asset trend following (which trades absolute price). The mechanism is grounded in Jegadeesh & Titman's seminal momentum research ('Returns to Buying Winners and Selling Losers', Journal of Finance 1993) — the equity-market finding that 'past 3-12 month winners continue to outperform' translates to crypto as 'the asset with the strongest recent momentum continues to outperform peers over the next allocation period.' The trigger: at each daily close, compute the 30-day return for BTC, ETH, and SOL. The asset with the HIGHEST 30-day return is the 'top performer.' If currently flat OR holding a different asset, exit the current position (if any) and enter long on the new top performer — but ONLY if that top performer is also above its own 200-day SMA (safety filter prevents allocating to a bear-regime asset just because it's 'less bad' than the others). Hold until ranking changes or safety filter breaks. This naturally tilts portfolio exposure toward whichever major asset is currently leading the cycle: BTC during BTC-led rallies, ETH during ETH-cycles, SOL during alt-rotation phases. The 3-asset basket captures roughly 70-80% of total crypto market cap among smart-contract platforms. Only 4 explicit parameters (momentum lookback window, safety SMA period, stop-loss pct, rebalance frequency) — minimum-parameter rotation strategy.
Hypotheses
Iteration-2 edits address the QA findings without touching the ranking, safety filter, or the order state machine that already passed Layers 1-3. (1) CODE DEFECT — uptime-anchored schedule: the rebalance clock no longer uses self._bar_count vs a -(10**9) sentinel. The period index is now bucket = (bar.ts_event // 86_400_000_000_000) // rebalance_days — a fixed epoch-anchored grid — and a re-rank fires only when the bucket changes. This is a pure function of the bar timestamp, so a live crash-restart no longer re-anchors the grid and immediately churns the 95%-of-equity book, and backtest/paper/live replay produce identical rotation dates. (2) VENUE: moved to BINANCE_SPOT (CASH, leverage 1.0) per the routing rule — the strategy is long-only, single-leg, no shorts, no funding edge, so futures at 1x was paying perp fees for no margin benefit. I verified this cannot regress Layer 1.5: this hypothesis's market_context is NULL in the DB and its description contains no SYMBOL.VENUE tokens, so nothing is declared to contradict; all three *.BINANCE_SPOT-1-DAY bar sets exist in the catalog. Sizing only ever happens when every leg is flat, so on a CASH account the USDT balance is the whole portfolio at that instant and get_account_equity() remains exact. (3) SIZING PRECISION: the hardcoded 3-decimal floor is replaced by _size_for(), which reads each leg's own instrument.size_precision (BTC 5, ETH 4, SOL 3) and floors with an exact Decimal quantum, plus a post-rounding min-notional check. The drawdown / information-ratio observation is explicitly not a block and is the analyst's call at backtest_review; I have not changed the mechanism to chase it, since doing so would be tuning against an unoptimized single draw.
Hypotheses
Catastrophic-drawdown, artifact-contaminated long-only cross-sectional momentum rotation — decisive abandon, not worth 2 hours. max_drawdown is 72.2% with CI to 93.6%, far past the L19 50% hard line (the 200-SMA safety filter did not prevent it). The backtest is also contaminated: 2024-01-25 shows +297.9% in a single day (plus 2021-10-07 +104%, 2021-05-13 +77.7%), physically impossible at 95% long spot since a day cannot return more than the underlying's move — a suspected sizing/mark or data-spike artifact (return_kurtosis 9.3) that single-handedly creates the 2024 +336.5% year. Strip it and the strategy loses in most years (2022 -24.6%, 2023 -19.3%, 2025 -25.3%), so the last-20% holdout is negative. It is also below measurability (73 trades over 9 years) and not significant: Sharpe 0.505 with bootstrap CI [-0.102, 1.119] straddling zero, PSR 0.839, and it is the L45/L52 exhausted cross-sectional momentum-basket family (stressed regime -66%, Sharpe -0.48). No parameter tuning fixes a 72% drawdown or conjures significance from 73 outlier-driven trades, and the +298% artifact makes the metrics untrustworthy on top of that. Failure pattern: risk_reject/overfit long-only cross-sectional momentum rotation, >50% DD, suspected backtest artifact (L19/L45/L52).
Implementation
Long-only daily cross-sectional momentum rotation across BTCUSDT/ETHUSDT/SOLUSDT spot. On a fixed calendar grid of rebalance_days-long blocks, rank the three majors by their mom_lookback (30)-day return and hold the single strongest one long at 95% of equity — but only if that winner is also above its own 200-day SMA, otherwise stay flat. A 15% stop-loss on the held asset forces flat and blocks re-entry until the next rebalance. All order flow runs through a durable four-state intent machine (FLAT/ENTERING/HOLDING/EXITING) that submits at most one order per bar and only trusts filled-position state, structurally guaranteeing at most one open leg with no quantity accumulation.
Verification Results
Verification failed (Layer 4 — QA review) [class=code_defect]:
- [edge_concern] Sandbox max_drawdown 68.66% (CI to 94.3%) on this unoptimized draw — high even for 1x long-only crypto — and information_ratio vs the equal-weight BTC/ETH/SOL basket is -0.41 with benchmark_correlation 0.46, so the rotation may not clearly beat holding the basket. Not a block (analyst's call at backtest_review), flagged for the >50%-DD / added-value lens.
- The rebalance cadence uses a process-relative bar counter with a -(10**9) sentinel (self._last_rebalance = -10**9; if (self._bar_count - self._last_rebalance) >= self.rebalance_days) — the uptime-anchored scheduling anti-pattern from checklist #18. The weekly rotation grid is anchored to process start, not the bar timestamp. Because the strategy holds 95% of equity in one asset and re-ranks the whole book each rebalance: (1) any live crash-restart resets _bar_count to 0 and immediately fires a full re-rank, re-anchoring the grid — a restart loop churns the entire position; (2) rotation dates depend on start offset, so backtest/paper/live replay can never reproduce the same decisions (parity failure). The backtest is deterministic (valid sandbox), but the schedule is not live-safe or replay-stable.
- Venue is BINANCE USD-M futures at leverage 1.0, but the strategy is long-only, single-leg, no shorts, no funding edge — per the routing rule such strategies belong on BINANCE_SPOT. Futures at 1x is not incorrect but pays no margin benefit.
- position_size floors qty to 3 decimals for all legs; BTC size precision is 5, ETH is 4, so sizing is coarsened on those legs. Harmless at ~95%-equity notional but lossy.
Backtest Review
Clean long-only spot construction with a durable fill-latency-safe FSM; correct venue routing (BINANCE_SPOT)
Backtest Review
avg_trade_return_pct 5.97% clears fees (long multi-day holds), no liquidation
Backtest Review
max_drawdown 72.2% with CI to 93.6% — far past the L19 50% hard-abandon line; the 200-SMA filter did not prevent it
Backtest Review
Impossible single-day return (2024-01-25 +297.9%, plus +104% and +77.7% days) at 95% long spot — suspected sizing/mark or data-spike artifact (kurtosis 9.3); it creates the entire 2024 +336.5% year
Backtest Review
Ex-artifact the strategy loses: 2022 -24.6%, 2023 -19.3%, 2025 -25.3%; the last-20% holdout is negative
Backtest Review
Below measurability (73 trades/9yr) and not significant: Sharpe 0.505 with CI [-0.102, 1.119] straddling zero, PSR 0.839; L45/L52 exhausted momentum-rotation family; stressed regime -66%
Backtest and paper results are hypothetical. Trading involves risk of loss.