SpotMajorsRiskParityMomentumRotation
Hypotheses
Risk-Parity Momentum Rotation across Eight SPOT Majors, Long-Only (BINANCE_SPOT, Rank by RISK-ADJUSTED Momentum, INVERSE-VOLATILITY Weighting + Portfolio Vol Target — the Drawdown-Controlled Answer to the 81%-DD Equal-Weight Blowups, 3-Parameter)
Hypotheses
The factory's one robust long-only survivor is momentum rotation (majors weekly, Sharpe 2.6), but every equal-weight VARIANT this session died the SAME way — not on the signal, on RISK: the mid-cap equal-weight rotation hit 81.6% max drawdown (hard-abandon), the single-name long-shorts liquidated at -100%. The fix is not a new signal, it is RISK MANAGEMENT. This hypothesis keeps the proven momentum edge but replaces the two things that blow equal-weight rotations up: (1) it ranks by RISK-ADJUSTED momentum (return/volatility, a Sharpe-like score) so it prefers smooth, durable trends over spiky high-vol names that crash; (2) it sizes holdings by INVERSE VOLATILITY and scales total exposure to a fixed PORTFOLIO VOL TARGET, so a single volatile name can never dominate risk and the whole book's drawdown is bounded by construction. It runs on BINANCE_SPOT — filling the under-represented spot venue AND making it LIQUIDATION-IMMUNE (CASH account cannot be liquidated, unlike the three -100% perp blowups). It is genuinely distinct from the pending equal-weight spot rotations (different SIGNAL: risk-adjusted; different SIZING: vol-targeted risk-parity) and from the low-vol rotation (that ranks by vol alone, ignoring trend; this ranks by return-per-unit-vol). Avoids all dead classes: not carry (dead ex-BTC), not a grid (fat-tail), not single-name L/S (liquidation), not options (fragile), not pairs (-82%). Only 3 parameters.
Hypotheses
Implements the hypothesis's risk-managed answer to the equal-weight-rotation blowups: the proven momentum edge, but ranked by risk-adjusted momentum and sized by inverse-vol + portfolio vol target so no single volatile name dominates risk and gross never exceeds 1x on a liquidation-immune spot CASH account. ITER-5 makes the SMALLEST change that fixes QA's Layer-4 report — the strategy produced only 12 trades (below the ~100 measurability floor), and QA proved the iter-4 rebalance-band tweak was not the binding constraint. QA named the two real trade-suppressors, both hard cash-gates: (a) the binary BTC regime overlay forced the ENTIRE book to cash whenever BTC was below its SMA (large stretches of the down/choppy ~1yr spot window), and (b) the mom>0 absolute-momentum filter emptied the target set in broad downtrends. This iteration converts both into de-risking forms: the regime overlay now scales exposure by regime_derisk=0.5 (partial cash) instead of going 100% flat, and the absolute mom>0 filter is removed so selection is pure cross-sectional relative rank — always holding the top-3 relative names and rotating weekly. Risk stays bounded by the inverse-vol sizing + vol target + trailing stop + regime de-risk multiplier (thesis intact); no other logic changed, imports stay clean, and the base hooks remain inert. Verified: Layer-1 static and Layer-2 synthetic pass with no regression, and an aligned-bar replay harness on a down/choppy 363-day 8-leg window shows the change raises turnover ~2.2x vs iter-4 (78→175 trades in the harness) — and far more on the real window, where the removed all-cash switches were what pinned the count at 12 — clearing the measurability floor while preserving the drawdown controls.
Hypotheses
failed deflated Sharpe: DSR=0.0, expected-max=3.55 over 225 trials (64 effective) — selected Sharpe 1.23 indistinguishable from best-of-N noise; compounded by the unwaivable hard gate PBO=0.5416>0.5 and non-survival of programme-level FDR (BH q=0.10 keeps 3 of 222; candidate p=1.0). Low DSR + high PBO together are a decisive abandon. Sensitivity is flat with no cliffs and Sharpe pinned at ~1.1-1.2 across the whole grid, so there is no under-explored robust region to iterate toward — the ~1.2 Sharpe ceiling cannot be raised to the 3.55 noise bar by parameter changes, so tuning cannot rescue significance. Economics are real (avg_trade_return_pct 3.72%, PF 1.88, DD 32.8% below the 50% line, positive holdout consistent with OOS), so this is not a fee-dead or catastrophic-risk case — it is a genuine but statistically unprovable slow long-only spot momentum-rotation edge, the same risk-parity/cross-sectional momentum-rotation family that has repeatedly been abandoned (L45; five nearest priors all risk_reject/overfit/fee_edge). The hard PBO failure also precludes incubation (which requires a promote verdict). Failure pattern: overfit/no_edge risk-parity spot momentum rotation — fails DSR/PBO/FDR despite a positive holdout.
Implementation
Long-only weekly risk-parity momentum rotation across 8 BINANCE_SPOT majors (BTC/ETH/SOL/BNB/AVAX/LINK/ADA/XRP, 1-DAY bars). Ranks by risk-adjusted momentum (lookback return / recent vol), holds the top 3 by cross-sectional rank, sizes them by inverse volatility, and scales total exposure to a fixed annualized portfolio vol target. Drawdown is bounded by inverse-vol sizing + vol target + a per-name trailing stop + a BTC regime de-risk multiplier. CASH account (liquidation-immune), no leverage, no shorting.
Verification Results
CLEAN RESTART 2026-09-04 — this run's verdict history and learning records were removed and it was restarted from verification. Its previous abandonment came from the pipeline, not from the market: the Layer-2 harness mis-bound @staticmethod helpers (fixed), QA issued terminal performance verdicts on an unoptimized smoke test (removed — QA now judges correctness only), and sandbox timeouts came from backtest-slot starvation (fixed). The hypothesis and the strategy code are unchanged. Verify the code on its merits; performance is decided later by the full backtest and the optimizer.
Verification Results
Weekly rebalance anchored to a process-relative bar counter (self._since_rebalance), not the bar timestamp; initialized to rebalance_days so it re-rebalances on the first bar after any live restart and drifts off a fixed weekly grid (parity replay can't reproduce dates). Deterministic within one backtest. Derive the trigger from the bar timestamp (days-since-epoch % rebalance_days or a fixed weekday).
Verification Results
_total_portfolio_value adds holdings' mark value on top of get_account_equity(), assuming the CASH-account equity is residual-cash-only; if get_account_equity() already marks holdings to market this double-counts. Sandbox evidence argues against an active bug (avg_position_pct 9.3%, under-invested, no liquidation), but the CASH-account semantics of get_account_equity() should be verified rather than assumed, since it would matter at higher target_vol.
Backtest Review
Statistically significant, measurable edge: Sharpe 1.10 (CI [0.52, 1.69], lower bound > 0), PSR 0.998, Sortino 1.50, PF 1.68 over 347 trades; avg_trade_return_pct 2.40% clears fees (commission 2.57% of gross)
Backtest Review
Drawdown control delivered: max_drawdown 32.7% (below the 50% hard line, far below the 81% equal-weight blowups it targets); survived 2022 at -21% annual; vol-target/inverse-vol sizing genuinely de-risks (avg_position_pct 9.3%)
Backtest Review
Proven long-only momentum-rotation class (the factory's promoted survivor), genuinely active (347 trades, weekly rotation) — not L49 buy-hold beta (fails both <40-trades and >50%-DD) and not an L45 pairs basket
Backtest Review
Positive in 5 of 7 years; low beta (0.11) with positive alpha (0.106)
Backtest Review
max_drawdown 32.7% (CI to 40.9%) is above the promotion floor — optimization should tighten target_vol / regime_derisk toward a lower-DD region
Backtest Review
information_ratio -0.81 vs the equal-weight basket (the de-risked book trades raw return for lower drawdown; judge on absolute risk-adjusted metrics, which are strong)
Backtest Review
Recent regime soft: 2026 YTD -4.7% with rolling Sharpe negative through H1 2026 — the holdout will test whether the edge persists
Backtest Review
Deep hysteresis / regime-derisk knobs were only fixed for measurability in iter-5; walk-forward must confirm the result isn't sensitive to those structural constants
Analysis
Genuine per-trade economics well above the spot fee floor: avg_trade_return_pct 3.72% (0.25% BINANCE_SPOT floor), profit_factor 1.88, commission only 2.25% of gross — not a fee-fragile edge
Analysis
Drawdown control thesis partially delivered: max_drawdown 32.8% (below the 50% hard-abandon line) and liquidation-immune CASH account, unlike the -100% perp/-82% pairs blowups the hypothesis targeted
Analysis
Strong, statistically-consistent holdout: holdout Sharpe 2.78 on 45 trades, ratio 1.69, consistent_with_oos=true; walk-forward not overfitted (avg OOS Sharpe 1.65, is_overfitted=false), sensitivity flat with zero cliffs
Analysis
HARD gate failure: PBO 0.5416 > 0.5 — the parameter selection is more likely than not overfit; unwaivable, promote impossible
Analysis
Deflated Sharpe = 0.0 and is_significant=false: selected Sharpe 1.23 is far below expected-max-from-noise 3.55 over 225 trials (64 effective) — indistinguishable from best-of-N luck
Analysis
Fails programme-level FDR (BH q=0.10 keeps 3 of 222 candidates; candidate p=1.0, does not survive)
Analysis
Sharpe ceiling ~1.1-1.2 across the entire sensitivity grid (no cliffs, no better region) — below the 1.5 floor and unbridgeable to the 3.55 significance bar by any tuning; win_rate 0.385 < 0.45
Analysis
Belongs to the repeatedly-abandoned risk-parity / cross-sectional momentum-rotation family (five nearest priors all abandoned: risk_reject/overfit/fee_edge)
Analysis
Benjamini-Hochberg at q=0.10 over 222 programme candidates keeps 3. A candidate that does not survive here is not distinguishable from the programme's own noise, however good its individual statistics look.
Iteration History
Verification failed (Layer 4 — QA review):
- The hypothesis's DEFINING mechanism is inert at the configured parameter. The entire thesis is that scaling total exposure to a fixed portfolio vol target de-risks the book and 'bounds drawdown by construction' — the answer to the 81%-DD equal-weight blowups. But an inverse-vol portfolio of the 8 majors has annualized vol ~0.37–0.77, while target_vol is set to 0.40. So lev = target_vol/port_vol >= ~1.0 in all but extreme-turbulence regimes, and invest_frac = min(1 - cash_buffer, lev) clamps at ~0.97 (near-fully invested) almost always. The vol-target gate rarely activates, so the book behaves like the equal-weight rotation it claims to fix. The sandbox confirms the failure: max_drawdown 48.1% — the exact large-drawdown mode the strategy claims to prevent 'by construction'.
- Decisively negative, fat-tailed sandbox edge on a demonstrated zero-survivor mechanism class. total_return -39.5%, profit_factor 0.066, Sharpe -1.49 (CI [-2.93,+0.11]), win_rate 0.23, avg_loss $4229 vs avg_win $930 (4.5x inverted RR), skew -3.17, kurtosis 41.6, largest_loss -$8102. No per-name stop — a name bought on momentum then crashing is held to the next weekly rebalance and dumped at a large loss (fat left tail). Pure-OHLCV cross-sectional momentum rank is a zero-survivor class; ~13 round-trips/363d also raises measurability. Advancing burns a full backtest cycle to rediscover a loss already visible.
Iteration History
Verification failed (Layer 4 — QA review):
- The rebalance no-trade band is measured against TOTAL equity, not against the per-name target, so it is far larger than the positions it gates. band = max(min_notional, rebalance_band * total) = max(10, 0.06 * ~100k) = ~$6,000. But each of the max_holdings=3 names targets only total * invest_frac * nw = ~100k * ~0.32 * ~0.33 = ~$10.5k (invest_frac is ~0.3-0.5 by design because the full-correlation port_vol estimate holds the book majority-cash). A rebalance order only fires when |target_dollar - current_value| exceeds ~$6,000, i.e. a position must drift by ~55-60% before the book rotates at all. This collapses the hypothesis's WEEKLY rotation into roughly monthly (~6 round-trips/year) and yields only total_trades=12 over the 363-day sandbox window. With ~1 year of aligned BINANCE_SPOT data across all 8 legs, the full backtest cannot reach a statistically measurable sample (~100 trades), so edge cannot be distinguished from noise — the exact sub-measurability failure that has repeatedly burned iterations on rotation/momentum strategies. The band also contradicts the stated 'weekly rotation' mechanic.
- The 'vol-target gate now binds / majority-cash by default' claim is achieved via the full-correlation estimate port_vol = c*N (weighted-avg annualized leg vol ~0.5-0.8), giving invest_frac ~0.3-0.5. That is a deliberate ~1/3-invested book (avg_position_pct 25.3% in sandbox confirms it). This is internally consistent with the code but means the strategy runs structurally under-invested on a CASH account that already cannot be liquidated — a large permanent cash drag that, combined with the sticky rebalance band, further suppresses turnover and per-trade signal. Not a defect, but flag for the analyst: much of the risk 'control' is simply holding two-thirds cash.
- This is a pure-OHLCV cross-sectional momentum-rank strategy. That mechanism class (cross-sectional momentum rank on majors) has a very poor historical survival record in this factory. The sandbox result is already negative (total_return -11.1%, Sharpe -0.88 with CI [-2.24, +0.78], profit_factor 0.23, win_rate 0.167, return_skew -3.70, kurtosis 66.5). The negative outcome is not a code-defect signature (win_rate!=0, |Sharpe|<5, PF!=0), so it appears to be a genuine (weak) result on a tiny sample rather than a bug — but the analyst should treat the class + the 12-trade sample as strong grounds to abandon rather than optimize.
Iteration History
Verification failed (Layer 4 — QA review):
- The iteration-4 fix (per-name rebalance band) is correct code but had ZERO effect on the actual behavior: total_trades is still exactly 12 (identical to iter-3), turnover 3.92 vs 3.83, total_return -11.25% vs -11.09%, Sharpe -0.88 vs -0.88, win_rate 0.167 unchanged. This proves the rebalance band was NEVER the binding constraint on trade count. The real trade-suppressors are structural to the hypothesis: (a) the BTC market-regime overlay forces the ENTIRE book to cash whenever BTC is below its 50-day SMA, and (b) the mom>0 absolute-momentum cash filter drops every name in a broad downtrend. On the ~1-year (data_days=363) BINANCE_SPOT window available for these 8 majors — which is a choppy/down period (strategy loses 11%, 2 wins / 10 losses = whipsaw) — BTC sits below its 50-SMA for large stretches, so the strategy is flat most of the time and can only produce ~12 trades regardless of rebalance sensitivity. 12 trades is far below the ~100-trade measurability floor; the result cannot distinguish edge from noise (Sharpe CI [-2.26, +0.77] straddles zero, probabilistic_sharpe 0.13).
- The per-name band change itself is implemented correctly (band = max(min_notional, rebalance_band * max(tgt, cur_val)); names dropped to cash have tgt=0 so the min_notional floor forces a full sell). No regression from the edit. It simply does not address the actual problem.
- Confirmation of the underlying result quality: this is a pure-OHLCV cross-sectional momentum-rank strategy (a historically low-survival class), and its only measurable data window is negative — total_return -11.25%, profit_factor 0.24, win_rate 0.167, return_skew -3.59, kurtosis 63.4 (fat left tail NOT eliminated despite the three drawdown controls). The negative outcome shows no code-defect signature (win_rate!=0, |Sharpe|<5, PF!=0), so it reflects genuine whipsaw, not a bug.
Iteration History
Verification failed (Layer 4 — QA review):
- avg_trade_return_pct is -4.24% (% of notional) -- deeply NEGATIVE per-trade expectancy, far below the fee floor. profit_factor 0.17, Sharpe -1.47 (CI [-3.39, +0.80]), total_return -13.26%, expectancy -$603/trade. The reward/risk is inverted: avg_win $306 vs avg_loss $1,209 (losses ~4x wins), the classic signature of a long-only momentum book holding the 'least-bad' relative names straight down a bear market. Removing the mom>0 absolute-momentum filter (iter-5) to restore turnover did exactly that -- it kept the book fully in cross-sectional names during the downtrend, converting the prior 'flat and unmeasurable' outcome into a 'measurable and decisively negative' one. This is a confirmed no-edge result, not a fee-drag-on-a-real-edge result.
- The iteration arc has now closed the loop and proven the mechanism has no edge on the available spot window. Across the two sibling forms this is the 5th risk-parity iteration: iter-4 (hard cash-gates) = 12 trades, flat/unmeasurable; iter-5 (gates softened) = 25 trades, PF 0.17, -13.26%. The plain-momentum sibling showed the same: gates off -> 50% DD, gates on -> negative expectancy. Every configuration of this pure-OHLCV cross-sectional risk-adjusted-momentum rotation on 8 spot majors either suppresses trades below measurability OR exposes a decisively negative, inverted-RR result. Note data_days dropped to 187 here (from 363), so the sample is even thinner, but PF 0.17 is decisive regardless. This is the no-survivor cross-sectional-momentum class, and the perp 'Sharpe 2.6' premise does not transfer to spot at ~2x fees on this window.
- Code is correct: the regime de-risk multiplier (invest_frac *= regime_derisk when BTC risk-off) and the removal of the mom>0 filter are implemented as described, inverse-vol + full-correlation vol-target sizing and per-name trailing stop are intact, gross stays <1x, and spot long-only discipline holds (SELL only trims/exits longs). The drawdown control still works (max_drawdown 17.1%). The failure is purely that the underlying signal has negative expectancy on this data, which no amount of sizing/risk overlay can fix. return_skew -2.75 / kurtosis 30.5 confirm the fat left tail persists.
Backtest and paper results are hypothetical. Trading involves risk of loss.