Skip to content

View original

LowVolDefensiveWeeklyRotation8Majors

Hypotheses

Low-Volatility Defensive Weekly Rotation across Eight Major Crypto Perpetuals, Long-Only with Trend Gate (BINANCE USD-M, Hold the 3 LOWEST-Realized-Volatility Majors, Sit in Cash When Below Trend, Fresh Vol-Rank Signal, 3-Parameter)

Hypotheses

A LONG-ONLY weekly rotation over the 8 major USD-M perps (BTC/ETH/SOL/BNB/AVAX/LINK/ADA/XRP) whose SORT SIGNAL is realized VOLATILITY — deliberately the ORTHOGONAL, opposite-sign selector to the deployed relative-strength momentum basket (which holds the FASTEST movers). Per L24, a new majors basket must name a signal input no promoted basket uses: this uses inverse-realized-volatility ranking (the low-volatility / defensive anomaly), which neither the promoted momentum rotation (raw return) nor the promoted carry basket (funding) uses. It therefore selects a nearly DISJOINT set of names from the deployed momentum book most weeks — a genuine diversifier, not a re-weighting. It steers clear of every recent death: not a funding carry (alt/cross-venue carry just confirmed net-negative), not a single-name price bet (overfit/blowup), not options (trade-count wall), not liquidations (data wall), not a cointegration pair (SOL-AVAX -82%), not a market-neutral basket (L12 0/53 fee death — this is long-only, low-turnover). Only 3 parameters (vol lookback, top-K, trend MA) and no leverage (heeding the intraday-CM liquidation lesson). The low-vol names are stable, so rank turnover is low and fee drag minimal, while the weekly cadence over multi-year history yields a measurable sample.

Hypotheses

Iteration 2 fixes the exact Layer-3 failure ("No trades produced"). Root cause: _extract_symbol_from_bar read bar.instrument_id, which does not exist on Bar in this NautilusTrader version — it raised AttributeError that the bare except swallowed, so _ingest_bar stored NO closes for any symbol; with empty price buffers no realized vol could be computed, candidates stayed below top_k, and _maybe_rebalance returned early every bar → zero trades. The minimal fix reads bar.bar_type.instrument_id.symbol (the same path the base template's on_bar uses at line 276), verified to return 'BTCUSDT' etc. Nothing else changed — imports remain clean, the continuous calmness-spread signal and all multi-instrument/rebalance logic (which already passed Layers 1–2) are untouched, and the config declares all 8 instruments on 1-DAY bars so the sandbox loads the full universe. This keeps every earlier passing layer green while enabling the weekly rotation to actually place trades.

Hypotheses

failed deflated Sharpe: DSR=0.0899, expected-max=1.44 over 225 trials — the selected Sharpe (1.006) is below the noise-expected maximum, i.e. indistinguishable from best-of-N noise. This is a textbook overfit, not a fixable-premise case: walk-forward IS avg +1.47 inverts to OOS avg -0.742 (is_overfitted=TRUE), PBO=0.70>0.5, holdout Sharpe only 0.178, and the full-sample headline (+1319%) is carried by the 2021 bull (2022 -24%, 2026 -19%). The low-vol / betting-against-beta majors-rotation mechanism has already been abandoned multiple times in the outcome store for the same overfit signature (siblings at similarity 0.81/0.80), so reframing it onto another majors set would only overfit again, and the sweep exposes no robust parameter region to tune toward (OOS negative across windows, no cliff-free island of genuine OOS edge). No iteration can convert a negative out-of-sample edge into a real one. Note this is a genuine robustness verdict — the strategy trades correctly; it simply has no generalizable edge.

Implementation

Long-only weekly low-volatility defensive rotation over 8 major Binance USD-M perps (BTC/ETH/SOL/BNB/AVAX/LINK/ADA/XRP) on 1-DAY bars. Each week (rebalance_days=7) it ranks the universe by trailing realized volatility (sample std of daily log returns over vol_lookback_days) ASCENDING and targets the top_k=3 CALMEST names, then applies a per-name trend gate — a selected name is only held while its close is above its own trend_ma_days SMA, otherwise that sleeve goes to cash. It exits held names that leave the target basket and enters new target names equal-weighted at allocation_per_position of equity per leg. Long-only, leverage=1, capital-relative sizing via get_account_equity(). Three core parameters (vol_lookback_days, top_k, trend_ma_days) plus structural knobs.

Verification Results

Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: BTCUSDT.BINANCE-1-DAY-LAST-EXTERNAL, Bars processed: 364 Diagnostics: should_enter() returned a side 0 times over 0 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.

Verification Results

Analyst: evaluate on the full multi-year backtest; don't optimize until the sign of the edge is established on the longer window.

Verification Results

Negative but thin, regime-limited sample: PF 0.41, total_return -18.1%, win_rate 0.238, avg_trade_return_pct -2.97% over only 21 trades in one year. RR is favorable (avg_win 2486 = 1.3× avg_loss 1890); the low win rate is the sole drag, and Sharpe -1.16 CI [-2.77, +0.36] still touches positive. The low-vol anomaly is a long-horizon effect a one-year alt-selloff window can't adjudicate.

Verification Results

Confirm a materially larger sample in the full multi-year backtest.

Verification Results

Low trade count (21 over 363 days, below the ~100 floor) — expected for a low-turnover weekly rotation (turnover 8.1), but the negative result rests on few samples.

Verification Results

Consider deriving extra-bar handling from the base rather than re-implementing dispatch, to avoid silent drift.

Verification Results

on_bar is fully overridden, hand-reimplementing base dispatch and referencing base internals. Works (passed Layers 1-3, traded across all legs) but is fragile to future base-template changes.

Backtest Review

Statistically significant edge: Sharpe 1.0 with 95% CI [0.42, 1.61] EXCLUDING zero (probabilistic_sharpe 0.9995) — the only strategy in the recent batch that clears this bar

Backtest Review

profit_factor 1.72 (well above the 1.2 no-edge line), Sortino 1.43, expectancy +$8.3k/trade

Backtest Review

Regime-distributed: positive in 5 of 7 years (2020/2021/2023/2024/2025), down years moderate (-24%, -19%); max_drawdown 35% under the hard-abandon line, no liquidation, 1x leverage

Backtest Review

Fee-light as designed: avg_trade_return_pct ~11% on low-turnover weekly rotation, impact_cost_pct only 1.3% of gross, capacity $613M

Backtest Review

Grounded in the real, documented low-volatility/defensive anomaly; orthogonal signal to the deployed momentum basket

Backtest Review

Outlier/bull-concentration: return_skew 2.59, kurtosis 38, with 2020/2021 carrying a large share — optimization must confirm the edge holds in non-bull OOS windows

Backtest Review

information_ratio -0.24 vs the equal-weight-basket benchmark and benchmark_correlation 0.58 / beta 0.27 — standalone alpha is +0.20 but diversification value over just holding the basket is marginal

Backtest Review

end_unrealized_pct 180 (~14% of headline) is open-position mark-to-market — judge on realized track (still strong)

Analysis

Strategy executes correctly across the full window (349 trades optimized / 138 base) — the prior zero-trade bar-symbol bug is fixed.

Analysis

In-sample point metrics look attractive (PF 1.72, Sortino 1.43, positive full-sample Sharpe ~1.0) — which is exactly why the multiple-testing correction matters.

Analysis

Sensitivity shows no cliffs; parameters are individually stable in-sample.

Analysis

Walk-forward overfit: IS avg Sharpe +1.47 collapses to OOS avg -0.742 (windows -1.21, -1.46, +0.44). The edge does not generalize.

Analysis

Deflated Sharpe 0.0899 << 0.95, and the optimized Sharpe (1.006) is BELOW expected_max_sharpe_annualized (1.44) — the selection is indistinguishable from best-of-225-trials noise.

Analysis

PBO 0.70 > 0.5 — the parameter selection is more likely overfit than not; is_significant = false.

Analysis

Holdout Sharpe only 0.178; win_rate 0.149 and max_drawdown 32.4% both fail floors.

Analysis

Return is 2021-concentrated (annual 2021 +251%/+204%; 2022 -24%, 2026 -19%) — single-regime bull dependence.

Analysis

Matches a repeatedly-abandoned failure class: low-vol majors rotation (similarity 0.81 'overfit', 0.80 'verification_loop').

Analysis

0.7x WF OOS

Outcome Summary

This strategy tried to diversify the book with a long-only weekly rotation into the three calmest major perpetuals, exploiting the documented low-volatility anomaly with only three core parameters, no leverage, and a trend gate to sit in cash during down-regimes. Its initial backtest was the standout of its batch — a Sharpe near 1.0 whose confidence interval cleanly excluded zero, profit factor 1.72, and a +1319% net-of-fees return — which earned an 'optimize' verdict from the pre-optimization review. Optimization, however, exposed the edge as illusory: walk-forward out-of-sample Sharpe averaged -0.742 against an in-sample +1.47, the deflated Sharpe of 0.09 sat far below the best-of-225-trials noise expectation, PBO was 0.70, and the returns proved to be a single 2021 bull-market artifact. After two iterations the analyst abandoned it as a genuine robustness failure — the strategy traded correctly but simply had no generalizable edge, matching a low-vol majors-rotation failure class already retired several times over.

Outcome Summary

An attractive full-sample Sharpe means nothing when it is bull-regime-concentrated and fails walk-forward — the low-vol / betting-against-beta majors-rotation mechanism has now overfit with the same signature multiple times, so reframing it onto another majors set is not worth re-attempting.

Outcome Summary

The Strategy Analyst abandoned it after optimization on a robustness verdict: the selected Sharpe (1.006) fell below the noise-expected maximum (1.44 over 225 trials), OOS was negative across every walk-forward window, PBO exceeded 0.5, and the headline return was carried by the 2021 bull (2022 -24%, 2026 -19%) — a textbook overfit with no robust parameter region to tune toward.

Outcome Summary

A long-only weekly rotation across 8 major Binance USD-M perpetuals that held the 3 lowest-realized-volatility majors (the defensive/low-vol anomaly) behind a per-name trend gate, deliberately orthogonal to the deployed momentum basket.

Outcome Summary

The initial backtest showed a statistically significant edge (Sharpe ~1.0 with 95% CI [0.42, 1.61] excluding zero, profit factor 1.72, Sortino 1.43, +1319% total return over 138 trades, avg per-trade return ~11%, max drawdown 35%, 1x leverage). But under optimization the walk-forward IS Sharpe of +1.47 inverted to an OOS average of -0.742, with PBO 0.70, deflated Sharpe 0.0899, holdout Sharpe only 0.178, and win rate 0.149.
Strategy report

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