DeribitEthWeeklyBullPutSpreadShortVolCarry
Hypotheses
Binance Options ETH Weekly Bull Put Spread on Elevated IV (Defined-Risk Short Volatility Carry)
Hypotheses
A defined-risk, weekly-cycle, short-volatility carry strategy on Binance ETH European-style cash-settled options. Implements a BULL PUT SPREAD (sell short-strike put + buy long-strike put, both same weekly expiry) collecting net credit when ETH implied volatility is elevated and ETH spot is not in active drawdown. Profits when ETH stays above the short-strike at expiry (most weeks) by capturing time-decay (theta) and IV mean-reversion (vega). Tail risk is BOUNDED by the long-put leg — max loss per spread is (strike_width - net_premium) × contract_size, completely defined at entry. Addresses the SECOND-LARGEST quota gap precision-targeting BINANCE_OPTIONS specifically (currently 0/660 = 0.0%, vs combined-options ≥15% target). Also adds: (1) multi-instrument scope; (2) ETH coverage (vs BTC-heavy portfolio); (3) NEW mechanism class — short volatility / theta harvesting — which is orthogonal to the long-volatility DeribitBtcStraddle strategy I previously proposed (that one BUYS vol; this one SELLS vol). These two complement each other and form a vol-trading book. CRITICALLY DIFFERENT from failure patterns this session: (a) NOT a 4H bar pattern; (b) defined-risk structure means NO 'single trade dependency' (no one trade can win >+1×premium nor lose >-(width-premium)); (c) NOT a directional bet on ETH — works in flat/up markets, only loses in sharp down moves > short-strike; (d) NOT a regime-fragile breakout strategy — vol mean-reversion is more reliable than price-trend continuation in crypto.
Hypotheses
Implements the hypothesis's defined-risk short-vol carry: a same-expiry two-put bull put spread collecting net credit, with the long wing bounding the tail (no single trade can lose more than width - credit). Iteration 5 fix: removed the banned underlying 'smoke path' (the Layer-3 sandbox now expands the rolling chain, so periods are non-empty and the smoke path was gated off, leaving zero trades) and pulled the long-put wing from ~10% OTM into Deribit's liquid weekly band (-8%) so both legs have hourly bars and the atomic period-ready gate can fire, following the proven pattern from the passing EthDeribitWeeklyDefinedRiskShortPutSpreadVrp strategy. Venue overridden to DERIBIT because the rolling-chain expander supports only Deribit BTC/ETH and a weekly-rolling spread cannot be expressed as fixed Binance contracts; ETH also routes to Deribit by the venue rules.
Hypotheses
Duplicate of hypothesis 13091a1d (identical DeribitEthWeeklyBullPutSpreadShortVolCarry code and backtest) — same L67 defined-risk Deribit options verdict. The headline (Sharpe 2.17, PF 1.23, +9.8%) is undercut by a NEGATIVE avg_trade_return_pct of -2.29% measured against the defined-risk wing notional; per L67 this positive-Sharpe/PF-but-negative-per-notional combination is structural for credit spreads and cannot clear the viability floor, so the Sharpe must not trigger optimize. It is single-regime — the ETH option legs only span 2025-09 → 2026-09 (~1 year, effective_daily_obs 53) — so the 3-phase walk-forward and holdout cannot populate across regimes, the short-vol crash tail the long wing is meant to cover is under-sampled (return_skew -1.94, kurtosis 7.1, largest_loss -$8,840 vs avg_win $1,028), and sharpe_ci_low is only 0.06. The stated purpose (fill the BINANCE_OPTIONS 0% quota) is void because the strategy was overridden to DERIBIT, duplicating the existing ETH weekly put-spread family. Failure pattern: fee_edge/no_edge defined-risk Deribit options VRP, negative per-notional edge, single-regime history (L67).
Implementation
Weekly defined-risk BULL PUT SPREAD on Deribit ETH options: each weekly expiry, sell the ~4% OTM put and buy the ~8% OTM put (same expiry) for a net credit. Profits from theta decay + IV mean-reversion while ETH stays above the short strike; max loss is hard-capped by the long-put wing. Built on the RollingOptionsStrategy framework, which resolves the historical weekly ETH chain and roll schedule; this subclass assigns per-leg sides by strike (higher-strike put = short, lower = long), sizes contracts so the defined max loss is ~2% of equity, and enters both legs atomically once each has live hourly bars. A light 7-day trend filter (degrade-open) skips only confirmed sharp downtrends.
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.
Backtest Review
Cleanly built, genuinely defined-risk (long wing caps tail), fee-light, adequate trade count (106 legs / 53 spreads)
Backtest Review
L67 defined-risk Deribit options signature: positive Sharpe 2.17 / PF 1.23 but NEGATIVE avg_trade_return_pct -2.29% per defined-risk wing notional — structural for credit spreads and cannot clear the viability floor
Backtest Review
Single-regime ~1-year option history (legs 2025-09 → 2026-09, effective_daily_obs 53); walk-forward/holdout cannot populate across regimes; sharpe_ci_low 0.06 barely positive
Backtest Review
Short-vol fat left tail under-sampled: return_skew -1.94, kurtosis 7.1, largest_loss -$8,840 vs avg_win $1,028
Backtest Review
Venue premise void: hypothesis targets BINANCE_OPTIONS (0% quota) but overridden to DERIBIT, duplicating the existing ETH weekly put-spread family
Iteration History
Verification failed (Layer 1 — static analysis):
- Required method not implemented: should_enter (line None)
- Required method not implemented: calculate_signal (line None)
- Required method not implemented: should_exit (line None)
- Required method not implemented: position_size (line None)
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['leg_sides', 'risk_frac', 'min_notional', 'rolling_options', 'roll_buffer_hours']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735690740000)
- steady_downtrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735690740000)
- flat_ranging: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735690740000)
- volatility_spike: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735690740000)
- zero_volume: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735690740000)
- price_gap: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735690740000)
Iteration History
Verification failed (Layer 3 — sandbox backtest): No trades produced
Bar type used: ETH-PERPETUAL.DERIBIT-1-HOUR-LAST-EXTERNAL, Bars processed: 63501
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.
Iteration History
Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit. This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).
Backtest and paper results are hypothetical. Trading involves risk of loss.