Skip to content

View translation

CrossSectionalOneWeekMomentumRotationLongTop2ShortBottom2FourHour

Hypotheses

4H Cross-Sectional 1-Week Momentum Rotation Long-Top-2 Short-Bottom-2 on 5 Liquid Binance USD-M Perps (Daily Rebalance, 3-Parameter)

Hypotheses

A MULTI-INSTRUMENT CROSS-ASSET CROSS-SECTIONAL MOMENTUM rotation strategy on 5 liquid Binance USD-M perpetuals: BTCUSDT, ETHUSDT, SOLUSDT, AVAXUSDT, ADAUSDT. On each daily-rebalance event, ranks all 5 assets by their trailing 1-week (42 bars at 4H) return, then takes equal-dollar LONG positions in the top-2 ranked assets and equal-dollar SHORT positions in the bottom-2 ranked assets. Middle-ranked asset gets no position. This is the classic Jegadeesh-Titman (1993) cross-sectional momentum factor adapted to crypto perpetuals on the 4H/1-week timeframe. STRATEGIC RATIONALE: (1) PORTFOLIO QUOTA FILL — single-asset scope at 74.7% vs ≤55% target (severe over-representation), multi-instrument at 8.8% needs expansion. A 5-asset basket is STRUCTURALLY multi-instrument. Long_short at 12.6% vs heavy push to reduce 87.4% long_only. This single hypothesis fills BOTH under-represented buckets meaningfully. (2) MECHANISM IS STRUCTURALLY DIFFERENT FROM SINGLE-ASSET TIME-SERIES MOMENTUM (which already has 3 entries in the portfolio: BtcTimeSeriesMomentumLongShortSingleAsset1D + ETH + SOL): TS-momentum says 'long X when X has been going up'; CS-momentum says 'long the strongest and short the weakest REGARDLESS of absolute direction'. CS-momentum is direction-neutral and works in chop regimes where TS-momentum fails — this is the EXACT regime the factory has documented (BTC Donchian failed due to 2024-2026 chop; CS-momentum is robust to this). (3) FACTORY-RECOMMENDED DESIGN — the BTC Persistent Negative Funding Carry abandon notes explicitly recommend 'use 4H bars on a basket of crypto majors (BTC + ETH + SOL) where the conjunction probability is higher and individual asset noise is averaged'. This proposal directly implements that pattern. (4) DISTINCT FROM CrossSectional7DayReversalV3 (already in pipeline) — that strategy is REVERSAL (long losers, short winners); this is MOMENTUM (long winners, short losers). Opposite trading direction, different mechanism class, different theoretical basis. (5) AVOIDS ALL RECENT FAILURE PATTERNS: NOT Donchian-with-trend (regime decay across BTC/XRP/AVAX); NOT funding/premium/OI/skewness signals (different signal class entirely — pure return ranking); NOT pair MR (5-asset basket, not 2-leg pair); NOT cross-venue (single Binance venue, no execution complexity); NOT 1H (4H proven sleeve); NOT liquidations (data backfill gap); NOT BNB (post-2024 moratorium — BNB is intentionally NOT in the universe); NOT volatility compression breakout (regime decay). (6) ITERATION-SAFE DESIGN: only 3 hypothesis-declared tunable parameters (ranking_lookback_bars, rebalance_period_bars, per_asset_pct). NO stop-loss parameter to optimize — risk is bounded entirely by the daily rebalance which AUTO-STOPS losers (a losing long position rotates out of the top-2 when its 42-bar return drops). The optimizer CANNOT push extreme parameter values because there are no stop/exit parameters to push — explicit fix for the LINK/ETH iter-2 optimizer-reversal failure mode. (7) FEE-MATH EXPLICITLY VIABLE — shown in expected_edge below: gross CS momentum edge 20-35%/year historically, annual fee drag ~12.6% (252 days × 2-3 leg changes × 0.05% taker), net edge 7-22%/year.

Hypotheses

Iteration-3 fixes address every point from the semantic auditor while preserving the signal/sizing scaffolding that already passed earlier layers: (1) UNIVERSE — config now contains exactly the 5 hypothesis assets (BTCUSDT primary + ETH/SOL/AVAX/ADA extras); the earlier 12-symbol widening was removed, so _top_n resolves to 2 and every rebalance holds 2 long + 2 short + 1 flat (full 5-asset participation). (2) DAILY REBALANCE — rebalance_period_bars default is now 6 (24h / 4h = 1 day), not 12 (48h). (3) THREE PARAMS ONLY — the undisclosed 4th tunable rank_hysteresis_band and its hysteresis retention logic were deleted; _select_books is now a strict top-2/bottom-2 split, leaving exactly the 3 declared tunables. (4) MECHANISM UNCHANGED — Jegadeesh-Titman cross-sectional momentum (long winners, short losers, direction-neutral), single-Binance venue, netting delta orders, inert should_enter/should_exit/position_size. leverage=1.0 and sizing does not multiply by an unused leverage factor (per_asset_pct*leverage with leverage=1.0 is a no-op), so no leverage_set_but_unused gate risk.

Hypotheses

optimization_error: RuntimeError: Funding data unavailable for perp leg 'ADAUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass) Traceback (most recent call last): File "/opt/strategy-factory/src/agents/backtest_agent.py", line 301, in _run_optimization await self._ensure_funding_for_perp_legs(instrument_id, extra_instrs) File "/opt/strategy-factory/src/agents/backtest_agent.py", line 406, in _ensure_funding_for_perp_legs raise RuntimeError( RuntimeError: Funding data unavailable for perp leg 'ADAUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass)

Implementation

Cross-sectional 1-week momentum rotation on exactly 5 liquid Binance USD-M perps (BTC, ETH, SOL, AVAX, ADA) using 4H bars. Every day (6 x 4H bars) it ranks all 5 assets by trailing 42-bar (1-week) return, goes LONG the top-2 and SHORT the bottom-2 with equal dollar per leg (dollar-neutral), leaving the middle-ranked asset flat. Positions are moved to target with single netting delta orders. Exactly 3 tunable parameters (ranking_lookback_bars, rebalance_period_bars, per_asset_pct); no stop/exit params — risk is bounded by the daily rotation itself.

Backtest Review

Strategy is functioning exactly as hypothesized: 1892 trades with near-balanced legs (957 long / 935 short), genuine dollar-neutral long-top-2/short-bottom-2 daily-rebalance basket — the Jegadeesh-Titman CS-momentum mechanism, not a bugged signal.

Backtest Review

Ample sample for optimization: ~1892 trades over 6.5 years, plenty to populate a 3-window walk-forward without fitting to noise.

Backtest Review

Structurally different from existing single-asset time-series momentum and fills the under-represented multi-instrument / long_short portfolio buckets.

Backtest Review

A concrete tunable improvement path exists: lengthening rebalance_period_bars directly reduces the 291x turnover that is causing the dominant cost drag, and ranking_lookback_bars can be tuned for signal quality.

Backtest Review

Base edge is marginal: Sharpe 0.233 with sharpe_ci_low -0.505 (CI straddles 0), profit_factor 1.054 — fees+impact consume almost all gross edge at default params.

Backtest Review

impact_cost_pct 30.5% (already folded into PnL) with capacity_usd only ~$1.07M — the daily-rebalance turnover makes the edge real only at toy scale; this is the single biggest structural risk.

Backtest Review

Return concentration in bull regimes (2021 +99%, 2023 +60%) with weak/negative recent years (2024 -2.8%, 2025 +6.8%, 2026 -12.5%) — recent-regime decay risk into the holdout window.

Backtest Review

benchmark_meaningful=false so ignore the negative information_ratio vs buy-hold, but absolute risk-adjusted metrics (Sortino 0.40, 30.7% max DD, 799d DD duration) are unimpressive.

Backtest Review

Pre-optimization gate — not scored against promotion thresholds. Sanity metrics only.

Analysis

Code↔hypothesis misalignment found by the semantic auditor — the code does NOT implement the hypothesis. Re-code the strategy to implement the hypothesis EXACTLY (instrument, timeframe, direction, the named edge/mechanic, sizing). Concrete issues: Hypothesis specifies a 5-asset universe (BTCUSDT, ETHUSDT, SOLUSDT, AVAXUSDT, ADAUSDT), but config.instrument_id + extra_instruments contain 12 symbols (adds LINKUSDT, LTCUSDT, DOGEUSDT, DOTUSDT, NEARUSDT, UNIUSDT, XRPUSDT); the code ranks/trades the full 12-symbol universe. | Hypothesis title and body state 'Daily Rebalance', but config.parameters.rebalance_period_bars=12 at 4H bars rebalances every 48h (2 days), not daily. | Hypothesis claims exactly 3 tunable parameters (ranking_lookback_bars, rebalance_period_bars, per_asset_pct), but the code adds a 4th tunable rank_hysteresis_band, read from parameters and used in _select_books to alter leg selection/retention, undisclosed in the hypothesis text. | Hypothesis implies near-full participation (2 long + 2 short + 1 middle flat out of 5), but with the 12-asset universe _top_n resolves to 2, so only 4 of 12 names ever hold a position and 8 are always flat.

Outcome Summary

This strategy implemented classic cross-sectional momentum on a 5-asset Binance perp basket, long the two strongest and short the two weakest names on a daily rebalance, explicitly designed to fill under-represented multi-instrument and long-short portfolio buckets with only 3 tunable parameters and no stop for an optimizer to abuse. The mechanism worked as intended across 6.5 years and 1892 balanced trades, returning +252% in total, but its risk-adjusted edge was thin (Sharpe 0.233, PF 1.054) and heavily eroded by turnover-driven fees and 30.5% impact cost that capped capacity near $1M. The backtest reviewer nonetheless saw a concrete tuning path (lengthening the rebalance period to cut turnover) and passed it to optimization. There the run aborted with a funding-data error on the ADAUSDT leg, so the strategy was abandoned on an infrastructure failure before the analyst could render any promote/iterate/abandon verdict.

Outcome Summary

A multi-leg perp basket is only optimizable if every leg has complete funding history — a single asset (ADAUSDT) with a funding-data gap halts the whole strategy before its edge can even be validated out-of-sample.

Outcome Summary

It cleared the pre-optimization backtest-review gate with an 'optimize' verdict, but the 3-phase optimization crashed before any analyst decision — a RuntimeError that funding data was unavailable for the ADAUSDT perp leg (on-demand collection failed), which blocked the backtest for accuracy.

Outcome Summary

A dollar-neutral cross-sectional (Jegadeesh-Titman) momentum rotation on 5 liquid Binance USD-M perps (BTC, ETH, SOL, AVAX, ADA), ranking each by trailing 1-week return on 4H bars and going long the top-2 / short the bottom-2 with a daily rebalance.

Outcome Summary

The base backtest ran over 2096 days and 1892 near-balanced trades (957 long / 935 short) for a +252% total return and 19.4% CAGR, but risk-adjusted quality was marginal: Sharpe 0.233 (CI -0.505 to 0.83), profit factor 1.054, 30.7% max drawdown, with 30.5% impact cost and only ~$1.07M capacity from the 291x turnover.

Abandon Reason

optimization_error: RuntimeError: Funding data unavailable for perp leg 'ADAUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass) Traceback (most recent call last): File "/opt/strategy-factory/src/agents/backtest_agent.py", line 301, in _run_optimization await self._ensure_funding_for_perp_legs(instrument_id, extra_instrs) File "/opt/strategy-factory/src/agents/backtest_agent.py", line 406, in _ensure_funding_for_perp_legs raise RuntimeError( RuntimeError: Funding data unavailable for perp leg 'ADAUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass)
Strategy report

Backtest and paper results are hypothetical. Trading involves risk of loss.