Skip to content

View translation

CrossSectionalBettingAgainstVolatilityBetaNeutral30Perps

Hypotheses

Betting-Against-Volatility in Crypto Perps — Beta-Neutral Cross-Sectional LOW-realized-vol vs HIGH-realized-vol Long/Short Across a Fixed 30-Name Binance USD-M Universe, Weekly Rebalance on DAILY Bars, 20% Ex-Ante Vol Target

Hypotheses

A DOLLAR-SIZED, BETA-NEUTRAL, CROSS-SECTIONAL LONG/SHORT factor strategy on 30 Binance USD-M perpetuals. It is NOT a momentum, trend, reversal, funding-carry or supplementary-feed-gated design — the ranking variable is the RISK of each contract (30-day realized volatility of daily log returns), never its past return. Each week the strategy sorts the 30-name universe by trailing 30-day realized vol, goes LONG the 8 lowest-vol names and SHORT the 8 highest-vol names (equal weight inside each leg), and then LEVERS THE LOW-VOL LEG UP / THE HIGH-VOL LEG DOWN by the reciprocal of each leg's average 60-day beta to BTCUSDT so the book carries approximately zero BTC beta (Frazzini-Pedersen BAB construction). Total gross notional is then scaled to hit a 20% ex-ante annualized portfolio volatility target (gross capped at 2.0x equity, floored at 0.3x). Because volatility ranks are highly persistent, only ~18-25% of the 16 names change per weekly rebalance: the average position is held ~5 weeks, so fee drag is small relative to the per-trade move. MEASURED EVIDENCE (I ran this before proposing, on the factory's own catalog: 527 USD-M perps, daily bars decoded from data/catalog, 2021-01-01 to 2026-09-15, 0.10% round-trip charged on turned notional). On a FIXED 30-name universe selected by 2020 dollar volume among perps listed before 2021-01-01: net Sharpe 0.92 at a 20% vol target, +19.2% annualized, max drawdown 26.6%, weekly hit rate 58%, turnover 18% per rebalance, 5 of 6 years positive (2021 +21.3%, 2022 -7.6%, 2023 +29.4%, 2024 +33.5%, 2025 +40.8%, 2026 YTD +11.4% at 1x gross). Mean gross return per weekly decision 0.433% of equity on 1.65x gross notional = 0.262% per unit of leg notional per week; at a ~5-week average hold that is ~1.3% per completed trade against a 0.10% USD-M round trip — a 13x cost coverage, which is the single reason this design is not another fee-graveyard entry. ROBUSTNESS ALREADY CHECKED (all net of 0.10% RT, all positive): vol-rank lookback 14/30/60/90d -> Sharpe 0.81/1.16/1.07/0.96 (dynamic-universe version); rebalance 5/7/10/14 days -> 1.06/1.16/1.07/0.81; leg size K=4/6/8 -> 1.23/1.16/1.00; universe size 16/24/30/40/50 -> vol-targeted Sharpe 0.81/1.09/0.92/0.96/0.94. Dropping the 5 best weeks leaves Sharpe 0.85; excluding all of 2026 leaves 1.02. The edge also survives in every volatility tercile of BTC (calm/mid/stress weekly means all positive), which is the regime-attribution gate that kills most trend designs. Removing the beta-neutralization step drops Sharpe from 0.88 to 0.75 and turns 2021 from -13% to -53%, confirming the neutralization is doing the economic work rather than decorating it.

Hypotheses

Implements the hypothesis mechanism exactly. (1) Ranking variable is 30d realized vol of daily log returns, computed per name from its own aligned daily closes -- never a return/momentum measure. (2) K=8 per leg, equal weight, dollar-sized off get_account_equity(). (3) Beta neutralization is done at LEG level via the reciprocal of each leg's average 60d beta to BTCUSDT (the primary instrument, which is also the beta reference), which is the step the hypothesis identifies as doing the economic work. (4) 20% ex-ante vol target computed from the candidate weights' own realized portfolio return series (so correlations are included, not assumed), gross clamped to [0.3, 2.0] and to config.leverage=2.0 -- gross notional can therefore never exceed 2x equity, which is the margin the venue is configured for (learning L114: per-leg fractions are derived from a single gross budget divided across 16 concurrent legs, not 16 independent equity fractions). (5) Rebalance cadence is anchored to CALENDAR time -- (bar.ts_init // ns_per_day) // rebalance_days -- never to a process-relative bar counter, so restarts and replays produce identical rotation dates. (6) Turnover control: existing legs are left alone unless the target moves more than rebalance_band (25%) of leg notional, reproducing the measured ~18%/week turnover and ~5-week hold that give the 13x cost coverage over the 0.10% USD-M round trip. Universe: the 30 pre-2021-listed USD-M perps with the largest 2020 dollar volume that are STILL actively trading today (verified against the catalog: all 30 have complete, timestamp-aligned daily bars from 2020-12-26 to 2026-09-15, 2084 common days, so the multi-leg alignment barrier never stalls); it contains all 20 instruments declared on the hypothesis. Delisted pre-2021 names that would abandon the run as data_unavailable (EOS, SXP, WAVES, OMG, MKR, MATIC, DEFI, BAL, REN, FTM) were excluded. Signal: calculate_signal() returns the CONTINUOUS cross-sectional vol spread (avg vol of the top-K minus avg vol of the bottom-K, annualized natural units) every bar; the entry decision lives in the rebalance, since the tradeable unit is a 16-leg book rather than a single-instrument entry, so should_enter/should_exit/position_size are intentionally inert. Performance: per-bar cost is O(30) with pre-trimmed return lists; the full 30-name rank/beta/vol-target pass runs only once per week (~300 times over the whole history).

Hypotheses

abandon_class=artifact. The risk metrics this run produces cannot be handed to the optimizer, and the optimizer's objective IS one of them. VERIFIED SYMPTOM (mechanism deliberately not asserted): the daily MTM series carries lag-1 autocorrelation -0.44 over the traded window (-0.388/-0.474/-0.457 in 2022/2023/2024), prints 426 days beyond ±4%, and its annualized vol collapses from 61.2% (daily) to 28.2% (7-day blocks) to 22.6% (30-day blocks) — a large mean-reverting component that cancels within a week. The book is capped near 1.0-1.3x gross across 16 dollar-neutral legs, so genuine -5%/+6% reversing pairs every 3-4 days are not plausible price action. Corroborating internal contradiction: max_drawdown 25.85% is BELOW its own bootstrap CI low of 30.21%. sharpe_ratio (sharpe_basis=mtm_equity_curve), annualized_volatility, sortino, var_95/cvar_95, calmar, regime_performance and every stress_window derive from that series; Phase 2 Optuna maximizes that Sharpe and Phase 3's DSR/PSR/CI machinery is computed from the same daily returns, so a 3-phase run would select parameters that minimize marking noise rather than maximize edge. HONEST QUALIFIER: this artifact DEPRESSES the result rather than flattering it — realized PnL ties out, and aggregating the oscillation away gives Sharpe ~0.70-0.82 at ~23-28% vol with ~29% drawdown, broadly consistent with the pre-registered 0.92 / 26.6%. The premise is NOT falsified here; it is unmeasured. Independently arguing against the two hours even after a fix: 2021 (the only clean year) delivered -1.66% vs a pre-registered +21.3%; 2024 supplies +47.7% of the +86.4% total and 5 legs supply 72.8% of realized PnL; 2 of 4 full years positive vs '5 of 6' claimed; and the short high-vol leg is a -$29,448 drag, so the delivered edge is the low-vol long leg riding the 2023-24 alt rally rather than the neutralized spread. Not negative_expectancy (1.09%/trade vs a 0.10% round trip) and not broken_mechanism (the trades do implement the hypothesis; funding is credited at -$7,662, disproving QA's tailwind guess). FOR ENGINEERING, not as the abandon ground and with no mechanism asserted: this is the FOURTH consecutive multi-leg book to show daily-MTM marking symptoms (VenueSegmentationFundingSpreadHarvest, AltPerpCrossSectionalFundingCarry, ExtremeFearFlightToQuality); unlike those, the leg accounting here is coherent and only the mark-to-market path is affected. Recommend a review of multi-instrument daily equity marking; this hypothesis is worth reviving on a clean engine, since its cleaned estimate roughly meets its own pre-registration.

Implementation

Beta-neutral cross-sectional Betting-Against-Volatility factor on a fixed 30-name BINANCE USD-M perpetual universe, daily bars, weekly calendar-anchored rebalance. Each week the 30 names are ranked ASCENDING by trailing 30-day realized volatility of daily log returns (risk, never past return): LONG the 8 lowest-vol names, SHORT the 8 highest-vol names, equal weight inside each leg. The low-vol leg is levered UP by 1/beta_L and the high-vol leg DOWN by 1/beta_S (Frazzini-Pedersen), where beta_L/beta_S are the legs' average 60-day OLS betas to BTCUSDT, so the book carries ~zero BTC beta. Gross notional is then scaled so the candidate book's ex-ante annualized volatility (stdev of its own weighted daily return series over the beta window) equals 20%, clamped to [0.3x, 2.0x] equity and hard-capped by config.leverage. Only the DIFFERENCE to the current book is traded, and only when it exceeds 25% of the target leg notional (or the $5 exchange minimum), so vol-rank persistence keeps weekly turnover low and the average hold at several weeks. Pure OHLCV -- no supplementary data.

Verification Results

Not fixable from strategy code today (delisted symbols have no catalog data and would abort the run). Record the substitution explicitly in the backtest report so the analyst prices the bias in, and if the run reaches optimization, re-check leg-size sensitivity (K=4/6/8) since a survivorship-clean short leg is the most exposed parameter.

Verification Results

Universe is survivorship-filtered relative to the hypothesis. The hypothesis pre-registers a FIXED 30-name universe ranked by 2020 dollar volume among perps listed before 2021-01-01; the config's 30 names are that list minus every constituent that has since delisted, with replacements that are still live in 2026. The mechanism, K, timeframe and venue all match the hypothesis exactly and all 20 hypothesis-declared instruments are present, so this is not a mechanism swap - but the composition is chosen with information from the end of the sample, and delisted coins skew high-vol (the short leg).

Verification Results

Record the primary bar's close from an on_bar-independent path (e.g. a small override that feeds _record_close for the primary before the warm-up gate, or raise nothing and simply accept the delay) - at minimum make min_bars_required() return max(vol,beta)+2 only if the primary history is seeded elsewhere, otherwise return 2 and let _rebalance's own data guards do the gating.

Verification Results

The beta reference (BTCUSDT, the primary instrument) only starts accumulating returns once the base template's warm-up is satisfied: _record_close for the primary is called from calculate_signal, which _maybe_process_primary gates behind len(self._bars) >= min_bars_required() = 62. The 29 extra legs record from bar 1 via on_extra_bar. _rebalance then requires len(market_hist) >= beta_lookback_days (60), so the first rebalance cannot fire until roughly bar 122 - about four months of daily bars with no book, instead of the ~62 the warm-up implies. BTC is also absent from the rank until it has 30 of its own returns.

Verification Results

Set gross_cap to ~0.9 x config.leverage (e.g. 1.8 against leverage 2.0) so the vol target can never consume the whole margin budget, and/or log a warning when the cap binds so a partially-built book is visible in the report.

Verification Results

Gross is capped at min(gross_cap=2.0, config.leverage=2.0) x equity, i.e. exactly the venue leverage the engine is configured with. At the cap, required initial margin equals 100% of equity and leaves zero headroom, so a rebalance that lands on the cap can have individual legs rejected for insufficient margin and the book would be silently built only partially (submissions are fire-and-forget, nothing re-tries). The sandbox never got close (avg_position_pct 7.74% x 16 legs = ~1.24x gross, no liquidation), so this is latent rather than active.

Verification Results

No change needed for correctness. If rebalance_band and vol_target_annual are optimized jointly, check the interaction explicitly (a wide band makes vol_target look insensitive for the wrong reason).

Verification Results

The 25% rebalance band is applied per leg to the notional delta, so the 20% ex-ante vol target is only loosely enforced between rebalances: a target gross change of up to 25% on every leg produces no trades at all, and the realised ex-ante vol can therefore sit materially away from 20% for weeks. This is a deliberate turnover/precision trade-off consistent with the hypothesis's ~18%/week turnover claim (and the sandbox's 38-day average hold reproduces the stated ~5-week hold), but the optimizer will be tuning vol_target_annual against a band that partially defeats it.

Verification Results

No action.

Verification Results

Static analysis flags min_bars_required() as shadowing a framework method. This is a false positive - the base template documents the override ('Override as needed') and calls it via self, and many shipped strategies override it. Noted only so the warning is not re-raised on the next iteration.

Verification Results

Two things the analyst should weigh against the hypothesis's pre-registered claims, neither of which is a code fault. (1) REGIME: the hypothesis states the edge 'survives in every volatility tercile of BTC (calm/mid/stress weekly means all positive)'. The sandbox says the opposite at the top of the distribution - calm +69.96% / Sharpe 1.35, normal +35.44% / 0.81, stressed -16.64% / Sharpe -0.40, regime_spread 1.75, and the LUNA window is -16.2% with Sharpe -3.82. Shorting the highest-vol names is exactly the leg that gets run over in a vol spike, so this asymmetry is mechanically plausible rather than a bug; it is also a soft gate later, so it should be confirmed on full history and pre-registered honestly before optimization. (2) UNIVERSE SURVIVORSHIP: the hypothesis specifies a fixed universe of the largest-2020-dollar-volume perps listed before 2021-01-01; the developer deliberately dropped the ten of those that have since delisted (EOS, SXP, WAVES, OMG, MKR, MATIC, DEFI, BAL, REN, FTM) because they would abandon the run as data_unavailable, and backfilled with names that are still trading today. The 30 names are therefore chosen with hindsight. Dead names are disproportionately HIGH-vol, i.e. exactly the short leg, so the removal likely flatters the short side; discount the headline accordingly and do not treat the delivered Sharpe as a clean out-of-universe number. (3) Minor: the sandbox reports funding_folded=false / funding_events_available=0, so the ~5-week-hold perp long/short book was measured with no funding P&L at all. On a low-vol-long / high-vol-short book funding is usually a tailwind, but the full backtest should fold it before the number is trusted either way.

Backtest Review

Mechanism is implemented as specified: 594 leg round-trips, ~38d average hold, 16-name book, weekly clock, funding credited (-$7,662, a HEADWIND, so QA's concern #3 resolves the other way).

Backtest Review

Not a fee problem: avg_trade_return_pct 1.09% vs a 0.10% USD-M round trip; commission 1.09% of gross, impact 2.49%.

Backtest Review

Adequate sample (1,418 trading days, 4 years, 594 legs) and realized PnL ties out to the headline ($86,618 vs 86.45%, end_unrealized -0.17%).

Backtest Review

Daily MTM series contaminated: lag-1 autocorrelation -0.44 over the traded window (2022 -0.388, 2023 -0.474, 2024 -0.457), 426 of 1,418 days beyond ±4%, and annualized vol collapsing 61.2% (1d) → 31.7% (4d) → 28.2% (7d) → 22.6% (30d). A book capped near 1.0-1.3x gross across 16 dollar-neutral legs cannot genuinely swing -5%/+6% every 3-4 days and reverse.

Backtest Review

Internal contradiction: max_drawdown 25.85% sits BELOW its own bootstrap CI low of 30.21%.

Backtest Review

2021 is the only clean year (vol 26.6%, lag1 -0.13) and delivered -1.66% against a pre-registered +21.3%.

Backtest Review

Concentration: 2024 = +47.7% of the +86.4% total; top 5 of 594 legs = 72.8% of realized PnL (top 10 = 119%, so the other 584 are net negative); only 2 of 4 full years positive vs '5 of 6' claimed.

Backtest Review

The short high-vol leg — the half that defines BAB — is a -$29,448 drag (mean -0.72%/trade) vs the long leg's +$116,067, even on the hindsight-selected survivor universe QA flagged.

Outcome Summary

CrossSectionalBettingAgainstVolatili-fba3262ffc

Outcome Summary

CrossSectionalBettingAgainstVolatilityBetaNeutral30Perps implemented a Frazzini-Pedersen BAB factor on 30 Binance USD-M perpetuals, ranking names by 30-day realized volatility, beta-neutralizing the two legs against BTCUSDT and targeting 20% ex-ante portfolio vol on a weekly clock. Its one backtest produced +86.45% total return, 17.55% CAGR, Sharpe 0.489 and 594 trades at 1.09% average per-trade return — comfortably above fee costs, but with 61.2% realized volatility against a 20% target and a max drawdown that fell below its own bootstrap confidence interval. The backtest-review gate abandoned it as an artifact rather than a failed premise: the daily mark-to-market series carried -0.44 lag-1 autocorrelation, contaminating every risk metric the 3-phase optimizer would have maximized, so optimization and all later stages never ran. The reviewer noted the cleaned estimate (~0.70-0.82 Sharpe at ~23-28% vol) would roughly meet the pre-registration, but also that the delivered edge came from the low-vol long leg during the 2023-24 alt rally while the defining short high-vol leg lost money.

Outcome Summary

Multi-instrument books marked daily need their MTM series sanity-checked (autocorrelation, vol-vs-target, drawdown-vs-CI) before any metric is trusted — this was the fourth consecutive multi-leg book to show the same marking symptoms, and here it depressed rather than flattered the result.

Outcome Summary

The backtest-review gate returned abandon with abandon_class=artifact: the daily mark-to-market series showed lag-1 autocorrelation of -0.44, 426 days beyond ±4%, vol collapsing from 61.2% (daily) to 22.6% (30-day blocks), and max_drawdown 25.85% sitting below its own bootstrap CI low of 30.21% — so Sharpe, vol, Sortino, VaR/CVaR, Calmar, regime and stress metrics were all unreliable and the optimizer would have maximized marking noise. Optimization, analyst, risk-officer and later stages were never reached.

Outcome Summary

A beta-neutral, cross-sectional Betting-Against-Volatility factor on a fixed 30-name Binance USD-M perp universe: weekly on daily bars it went long the 8 lowest 30-day-realized-vol names and short the 8 highest, levered each leg by the reciprocal of its 60-day beta to BTCUSDT, and scaled gross notional to a 20% ex-ante vol target.

Outcome Summary

The single backtest (2020-01-01 to 2025-01-11, 1,838 daily bars) returned +86.45% total / 17.55% CAGR with Sharpe 0.489, max drawdown 25.85%, profit factor 1.179, 594 trades and avg_trade_return_pct 1.09% (well above the 0.10% USD-M round trip). Reported annualized volatility was 61.2% against the 20% target, only 2 of 4 full years were positive, 2024 supplied +47.7% of total PnL, the top 5 legs supplied 72.8% of realized PnL, and the short high-vol leg was a -$29,448 drag versus the long leg's +$116,067.
Strategy report

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