EthDeribitWeeklyDeltaNeutralShortStrangleVrp
Hypotheses
ETH Deribit Weekly Delta-Neutral Short-Strangle — Volatility-Risk-Premium Harvest (Options, IV>RV + IV-Percentile Gated, Defined-Risk Strike-Breach Stops, 3-Parameter)
Hypotheses
A SHORT-VOLATILITY, delta-neutral options strategy on DERIBIT ETH weekly expiries that harvests the crypto Volatility Risk Premium (VRP) — the persistent structural gap where option-implied vol exceeds subsequently-realized vol. Once per weekly cycle (front expiry ~5-7 DTE), and ONLY when implied vol is genuinely rich (ATM IV > trailing realized vol AND ATM IV in an elevated percentile of its own trailing history), it SELLS a ~20-delta strangle: short one OTM call + one OTM put, opened delta-neutral. It collects premium and lets theta/vega decay over the week. This abandons the ETH-BTC pairs-reversion family entirely (that family just died on fee_edge — the relative move at 2σ nets only ~0.01%/trade, below two-leg costs). Instead the P&L source is a structural INSURANCE premium: a weekly ETH 20-delta strangle collects ~1.5-3% of underlying notional in credit, an order of magnitude above the ~0.06% round-trip Deribit fee, so it does not have the fee-edge problem that kills tight-spread relative-value trades. It fills the factory's single largest portfolio gap (options 5.0% vs a ≥15% quota) and is market-neutral-at-entry (helping the 86%-long-only book). Only 3 parameters. Implementation is deliberately timeout-safe: evaluated once per weekly cycle on daily bars with INCREMENTAL rolling IV/RV stats and a single strike-pair lookup by delta — NO per-bar full-chain rescans (the exact fault that timed out the recent ETH put-credit-spread).
Hypotheses
Straight answer first: the Layer-4 blocker cannot be fixed in strategy code, and this iteration does not pretend otherwise. Measurable cycles are capped by CATALOG QUERIES, not by any parameter: BacktestRunner issues one catalog.bars() call per bar type at a fixed ~8.9s of fsspec directory-walk, a strangle needs exactly 2 option legs per weekly period, so queries = 2*cycles + 1 and the 300s cap allows at most ~16 cycles. I verified every escape route and none exists — daily or bi-weekly rolls do not help (queries scale with cycles, 2 per cycle, regardless of calendar spacing), coarser timeframes do not help (cost is per query, not per bar), 105 days buys only 2 extra cycles for a real SIGKILL risk and still misses 30, and the only way to halve the per-cycle query cost is to drop to ONE leg — which turns the structure into a naked directional short, i.e. a different hypothesis. I therefore deliberately LEFT lookback_days at 91 rather than gamble a passing Layer 3 for +2 unhelpful cycles: raising it cannot clear the ~30-cycle bar and could only regress the run to a timeout. The real fix is platform-level (cache/reuse the globbed file list across catalog.bars() calls within one run, or glob only the requested leg's directory), after which lookback_days goes to 365+ with ZERO change to this file; my recommended verdict is abandon-pending-that-platform-fix, matching the reviewer's own conclusion. What I did change is fidelity hardening in the parts the reviewer will read as the strategy's claims, all low-risk and strictly inside already-passing layers (no import, class-hierarchy, or signal changes): (1) strikes are now parsed from the Deribit symbol when the chain row omits them — previously a missing 'strike' field silently disabled BOTH the ~20-delta band check (it returned True for every leg) AND the defined-risk breach stop (short strikes recorded as 0.0 can never breach), so the two protections that define this hypothesis could both be inert with nothing in the log to say so; (2) the delta band no longer stacks with the ungated fall-through — when the DVOL series is entirely absent the vol gate still degrades open (never an edge substitution), but the band check stays active using trailing realized vol purely as a strike-distance yardstick and blocks when spot, expiry or any vol estimate is unmeasurable; (3) on_stop now reports gated vs ungated entries, which vol source measured each band check, legs without a parseable strike, and breach-stop count, so the traded sample is auditable against the 'IV>RV + IV-percentile gated, ~20-delta' characterization instead of taken on trust. The 13-cycle metrics still must not be read as edge — a short strangle's risk lives in the tail that 13 weeks cannot sample, and avg_trade_return_pct is meaningless against option-premium notional.
Hypotheses
Structurally unmeasurable short-vol options book with a suspected-artifact Sharpe — not worth 2 hours of optimization, and the developer pre-registers this. A 2-leg weekly Deribit strangle is capped at ~13-16 cycles by a hard infrastructure ceiling (300s / ~8.9s per catalog.bars() query), so the option legs only span ~2026-05 → 2026-09 (data_days 93, 11 strangles, effective_daily_obs 11) in ONE calm ETH regime; the developer explicitly states this ~13-cycle sample 'cannot sample the tail that dominates a short strangle's risk and must NOT be read as edge,' and that reaching the ~30+ cycles needed requires a PLATFORM fix (cache the globbed file list across queries) — not reachable from strategy code at any parameter setting. The 3-phase walk-forward/holdout therefore cannot populate. The headline Sharpe 5.03 (CI [2.90, 6.59]) on 22 trades over 3 months is a suspected artifact of a short-vol pick-up-pennies book (short_win_rate 91%, net vega -215) whose crash tail — the entire risk of a short strangle — is un-sampled in the calm window, and avg_trade_return_pct 57.6% is meaningless for option-premium notional. No parameter change adds the regime coverage or cycle count the option history and sandbox budget lack. This is the L67/L23 Deribit short-vol options family. Failure pattern: structurally unmeasurable single-regime option history (infra query ceiling) + short-vol under-sampled crash tail, implausible Sharpe (L67/L23).
Implementation
Weekly delta-neutral short strangle on Deribit ETH options harvesting the volatility risk premium: when DVOL (forward 30d ETH IV) exceeds trailing 10-day realized vol by min_iv_rv_spread AND sits at/above iv_rank_floor of its own trailing 180-day percentile distribution, it sells one ~6%-OTM call and one ~6%-OTM put on the front weekly expiry in equal size (symmetric offsets -> delta-neutral at inception, with each leg's Black-Scholes delta verified inside [0.10, 0.40] before the cycle is written), holds through the week for theta/vega decay, and closes 24h before European cash settlement. A defined-risk strike-breach stop closes the whole structure when the underlying closes 2% beyond either short strike, and the period is latched against re-entry. Three tunables: min_iv_rv_spread, iv_rank_floor, breach_buffer_pct.
Verification Results
Verification failed (Layer 4 — QA review) [class=not_measurable]:
- [edge_concern] The flattering sandbox is a premium-collection MIRAGE, not evidence of edge: Sharpe 5.03, win_rate 0.91, PF 7.8, max_drawdown 0.17%, avg_trade_return_pct +57.6% over just 22 legs / ~13 weekly cycles / 93 days. A short strangle earns a small premium almost every quiet week and loses catastrophically when the underlying gaps through a short strike — its risk-adjusted return is set by a tail that 13 cycles cannot contain. metrics_reliable=true refers to the arithmetic, not to whether the sample represents the strategy's risk (it doesn't).
- UNMEASURABLE SAMPLE (L26). Weekly-expiry short strangle whose runnable sample is infrastructure-capped at ~13-16 cycles: 2 catalog queries/cycle × ~8.9s fixed fsspec walk vs the 300s cap → ~16 cycles max; lookback_days=365 SIGKILLs, and the config's lookback_days=91 bounds even the full backtest to ~13 cycles. A short-vol strategy's risk lives in the tail, so ~13 cycles is far below the ~30+ needed. Not fixable in strategy code (2 legs/cycle irreducible) — needs the platform per-query-cost fix. Park pending that fix; do not optimize or promote on the ~13-cycle metrics.
- Residual tail risk the small sample hides: the strike-breach stop keys off the daily CLOSE, so an overnight/intrabar gap through a short strike isn't stopped until the next close — unbounded loss on that bar. 13 cycles are unlikely to include such an event, inflating apparent safety. Flag for the Risk Officer; true defined-risk needs bought wings (which worsens the query ceiling).
Backtest Review
Carefully built delta-neutral structure with genuine protections (BS-delta band verification, strike-parse fix, breach stop, IV>RV + IV-percentile double gate, paired-leg atomic entry) and the DVOL gate is real
Backtest Review
On the sample it looks clean: max_drawdown 0.17%, omega 12, win_rate 91%
Backtest Review
Structurally unmeasurable by the developer's own analysis: a 2-leg weekly strangle is capped at ~13-16 cycles by a hard infrastructure ceiling (300s / ~8.9s per catalog query), so the option legs only span ~2026-05 → 2026-09 (data_days 93, 11 strangles, effective_daily_obs 11) in ONE calm ETH regime — the 3-phase walk-forward and holdout cannot populate, and the developer explicitly states these metrics 'must NOT be read as edge' and that reaching ~30+ cycles needs a PLATFORM fix
Backtest Review
Implausible Sharpe = suspected artifact: sharpe_ratio 5.03 (realized-trades, CI [2.90, 6.59]) on 22 trades over 3 months — a short-vol pick-up-pennies book (short_win_rate 91%, net vega -215, theta +896) whose crash tail — the whole risk of a short strangle — is entirely un-sampled
Backtest Review
avg_trade_return_pct 57.6% is meaningless for option-premium notional (developer flags this)
Backtest Review
L67/L23 Deribit short-vol options family — repeatedly abandoned on thin single-regime option history
Iteration History
Verification failed (Layer 4 — QA review):
- UNMEASURABLE TRADE SAMPLE -- the same infrastructure ceiling that killed the sibling Deribit VRP options strategies applies here. lookback_days=56 resolves 8 weekly cycles / 16 legs; the sandbox returned total_trades=16, data_days=8, metrics_reliable=FALSE, and the small-sample Sharpe of 14.1 (CI [4.0, 46.7]) is explicitly unreliable. The author's docstring concedes the ~8-cycle window is a hard catalog-query-cost ceiling (each catalog.bars() call costs ~10s regardless of payload; a 365-day two-leg chain = ~105 queries ~= 1050s -> SIGKILL) and only ASSERTS -- without evidence -- that 'the real backtest stage expands the same spec over its own window'. Per learning L26, that assertion is empirically false for this family: recent Deribit weekly VRP/IV-gated options strategies in THIS pipeline died unmeasurable at single-digit FULL-backtest trade counts (weekly put-write 4 trades, monthly put-writes 1/5 trades), because the same per-query catalog cost throttles the window downstream AND the IV>RV + IV-percentile double gate cuts an already-small cycle count further. A short strangle's risk is dominated by the rare tail; 8 (or even ~13-16, the absolute pipeline max) gated cycles cannot sample it, so no metric from this run -- return 3.05, PF 5.74, win_rate 0.875 -- can distinguish edge from noise. Estimate: even a generously-sized full-backtest window that survives the query budget yields well under the ~30 measurable cycles this tail-dominated strategy needs.
- The hypothesis specifies a '~20-delta strangle', but the code writes a FIXED +/-6% moneyness strangle with NO per-cycle delta verification. The docstring justifies 6% as the 20-delta distance at ETH's median ~50-60% IV, but the delta actually written drifts with the vol regime -- and the double vol gate opens PRECISELY in high-IV weeks, where a fixed 6% strike sits much closer to ATM (materially higher than 0.20 delta, e.g. ~0.30-0.35 at elevated ETH IV). So in exactly the weeks it trades most, the structure carries more directional/tail exposure than the '~20-delta' the hypothesis describes. Notably, the BTC sibling was dinged for this same issue and added a per-cycle Black-Scholes delta-band check ([0.10,0.40]) to stand down when the strike drifts out of band; this ETH version omits that guard entirely despite already importing DVOL IV, spot, and strikes -- everything the check needs.
Iteration History
Verification failed (Layer 4 — QA review):
- UNMEASURABLE TRADE SAMPLE at a hard, code-unfixable infrastructure ceiling -- the sole remaining blocker, and it is NOT a code defect. lookback_days=91 resolves 13 weekly cycles / 26 legs; the sandbox returned total_trades=26, data_days=13, and although metrics_reliable is now true, the Sharpe of 17.8 carries a CI of [8.1, 51.5] -- a 6x-wide band that cannot pin down the true value, and PF 8.36 / win_rate 0.885 over just 13 cycles is fully consistent with a benign 13-week window rather than a real edge. Per learning L26 and my two prior reviews of this exact family, ~13 gated cycles cannot establish a short-vol edge, and the sibling Deribit VRP options strategies died unmeasurable at single-digit FULL-backtest trade counts. Critically, the developer has now confirmed in the rationale what my prior reviews argued: the full backtest stage expands the SAME lookback_days spec and inherits the same ~8.9s-per-catalog-query ceiling (365 days ~= 105 queries ~= 935s -> SIGKILL), so the ~30+ cycles this strategy needs are UNREACHABLE by any parameter or structure change here. The fix is platform-level (cache/reuse the globbed file list across catalog.bars() calls, or glob only the requested leg's directory), after which lookback_days can go to 365+ with ZERO change to this strategy.
Iteration History
Verification failed (Layer 4 — QA review):
- UNMEASURABLE SAMPLE at the same code-unfixable infrastructure ceiling -- and this run is WORSE than the prior iteration, not better. This sandbox produced total_trades=18 (9 strangles), data_days=9, metrics_reliable=FALSE, whereas the immediately-prior iteration returned 26 legs / metrics_reliable=true. The iteration-3 fidelity hardening (strike-parsing + delta-band now blocking when unmeasurable) evidently rejected a few more cycles, pushing the already-thin sample below the reliability threshold. The headline metrics (Sharpe 16.1 with CI [4.75, 49.19], PF 6.69, win_rate 0.889) are pure small-sample artifacts over 9 weekly cycles and, as the developer states outright, must NOT be read as edge -- a short strangle's risk lives in the tail that 9 weeks cannot sample (L26). The developer has now independently confirmed what my two prior reviews of this family concluded: measurable cycles are capped by catalog QUERIES (2 legs/cycle x ~8.9s fixed fsspec walk => ~16 cycles max under the 300s cap), the ceiling applies to the full backtest stage too, and NO parameter, roll cadence, timeframe, or structure change can reach the ~30+ cycles needed without either a SIGKILL or turning the strangle into a naked directional short (a different hypothesis). The fix is platform-level (cache/reuse the globbed file list across catalog.bars() calls).
Backtest and paper results are hypothetical. Trading involves risk of loss.