EthDeribitMonthlyIronCondorVrpIvRankTrendFiltered
Hypotheses
ETH Deribit Monthly Defined-Risk Iron Condor VRP Harvester (IV-Rank Gated, Trend-Filtered, Delta-Neutral Short Vol)
Hypotheses
A delta-neutral, defined-risk SHORT-VOLATILITY strategy on ETH options at Deribit (most liquid crypto ETH options, greeks/IV in catalog). Each cycle it sells an out-of-the-money strangle (short OTM put + short OTM call) and buys further-OTM wings (long put below short put, long call above short call) to form an IRON CONDOR with capped tail risk. The structural edge harvested is the volatility risk premium (VRP): Deribit ETH implied vol persistently trades above subsequently-realized vol, so a systematically-sold, theta-positive, defined-risk condor collects net credit that, on average, exceeds eventual payout. This is the ETH short-vol complement to the factory's BTC VRP family (BtcDeribitWeeklyShortStrangleVrpHarvest, BtcDeribitMonthlyDefinedRiskIronCondorVrpIvRankGated both reached backtest_review) — ETH currently has only a long-call Deribit expression, so the ETH short-vol VRP slot is open. Monthly tenor keeps trade frequency low (≈12 cycles/yr) so the ~0.06% RT × 4 legs fee is trivial versus premium collected. Sizing is defined-risk-relative: max loss per condor (wing width minus net credit) is capped at a fixed fraction of equity, so a tail event cannot exceed a known, pre-sized loss.
Hypotheses
Two changes, both aimed squarely at the zero-trade Layer-3 result. (1) The banned underlying smoke path is DELETED: the previous version opened a long ETH-PERPETUAL round-trip whenever the roll schedule was empty. That degenerates an options strategy into a delta-1 perp position with no theta or vega, it is explicitly prohibited, and the backtest pipeline abandons any options run whose trades are not option legs (options_no_option_trades). It is also obsolete now that Layer 3 expands the rolling chain itself -- an empty schedule means the chain genuinely did not resolve, and the correct behaviour is to trade nothing rather than fake a fill. With it gone, the four option legs are the only instruments this strategy can trade. (2) Atomicity is now PER VERTICAL rather than per condor, which is the most likely cause of every monthly cycle being skipped: entry previously required all FOUR sparse OTM legs to be loaded with a live bar on the same bar, so one leg without a print inside the entry window blocked the entire cycle. An iron condor is two verticals and each is independently defined-risk, so readiness is evaluated per kind -- the put spread enters when both put legs are live, the call spread when both call legs are live, and when both kinds are live the result is the identical full condor. A short is still never submitted without its own protective wing. I verified the data side too: the catalog holds ETH Deribit 1-HOUR option bars across many strikes for every recent monthly expiry (e.g. 24APR26 has 10 puts / 9 calls), so 4-leg resolution is feasible and the missing-leg block was about per-bar liveness, not about the chain being unavailable. Everything else -- the DVOL-first IV source with the precomputed O(log n) as-of lookups, the VRP/IV-rank gates, the trend filter, the continuous VRP signal, and the defined-risk sizing -- is unchanged.
Hypotheses
The claimed VRP edge (ETH implied vol persistently rich enough for a ~5%-OTM monthly condor to net credit exceeding payout) is measurably absent on an adequate-for-review sample: profit_factor 1.007, Sharpe 0.16, PSR 0.516, Sharpe CI straddling zero, and 2026 (-3.50) wiping out 2024+2025 gains. The realized per-trade expectancy of +$15.37 against ±$4,300 trade swings is statistically zero. The low win_rate (0.488) for an OTM condor is the tell: ETH moves >5%/month often enough that the short strikes get run through, so net VRP capture is structurally ~breakeven at this strike geometry — a premise/structure problem, not a mis-tuned parameter. Monthly options cadence caps the sample at ~21 cycles, so optimization cannot add statistical power and gate-tuning over 21 cycles would overfit noise. Not worth 2 hours of optimization. (Note: this is the positive-avg_trade_return_pct case, so unlike the L67 defined-risk-options signature it is not fee-floor-disqualified — it is edge-absent.)
Implementation
Delta-neutral, defined-risk monthly short IRON CONDOR on ETH Deribit options. Each monthly roll, if implied vol is rich relative to trailing realized vol AND its own IV-rank is elevated AND the ETH tape is range-bound, the strategy sells the ~5%-OTM put and ~5%-OTM call and buys the ~10%-OTM put and call wings, harvesting the volatility risk premium with a hard-bounded tail. The primary ETH-PERPETUAL bar is only a clock and a data source (realized vol + trend filter); no order is ever placed on the underlying. Each vertical is established atomically -- a short leg is never submitted without its own wing -- and contracts are sized so the condor's max loss (wing width minus credit) equals a fixed 3% of equity. Positions are closed 24h before expiry and rolled into the next monthly.
Verification Results
Verification failed (Layer 3 — sandbox backtest): No trades produced
Bar type used: ETH-PERPETUAL.DERIBIT-1-HOUR-LAST-EXTERNAL, Bars processed: 19995
Diagnostics: calculate_signal() was never evaluated (0 evaluated bars) -> no primary bar reached the base template's signal path -> if you override on_bar(), call super().on_bar(bar); check bar_type matches the instrument's data. Do NOT loosen entry thresholds — the entry logic never ran.
Ensure your strategy produces trades with the given data and parameters.
Verification Results
Confirm DVOL/book_summary coverage spans the full backtest so the ungated fall-through is truly dead; otherwise consider requiring IV presence before entering, or logging the fraction of ungated entries so the analyst can see it.
Verification Results
In _enter_leg the 'no_iv' branch records the block reason but falls through (does not return False), so a condor is entered UNGATED when IV data is unavailable at the bar. This is documented as intentional (preserve the short-vol mechanism, dead branch when DVOL is present), but it means the VRP/IV-rank gate the hypothesis names can be bypassed for any period lacking an IV observation.
Backtest Review
Structurally sound short-vol condor: net theta +168.6, net vega -245.9, near-zero entry delta (-5.0), balanced puts/calls (40/44) — it genuinely implements a delta-neutral defined-risk VRP structure, and the iteration-4 fixes produced real option-leg trades (84) rather than the prior zero-trade / underlying-fallback failures.
Backtest Review
Defined-risk sizing works; max_drawdown a contained 20.8%.
Backtest Review
profit_factor 1.007 — gross edge is a coin flip (avg_win $4,371 vs avg_loss $4,137, win_rate 0.488). Realized expectancy +$15.37/trade is ~0.35% of the average trade magnitude, i.e. statistically zero.
Backtest Review
Sharpe 0.16, probabilistic_sharpe 0.516 (indistinguishable from no-skill), Sharpe CI [-1.18, 1.77] straddles zero.
Backtest Review
2026 (-3.50) erased both prior years' gains (2024 +2.44, 2025 +2.47) — no persistent VRP capture.
Backtest Review
win_rate 0.488 is far too low for a ~5%-OTM iron condor (should be ~70-80%): ETH routinely moves >5%/month, so the short inner strikes are breached, wings cap the loss, and net VRP nets to PF~1.0 — a structural property of this strike geometry on a high-vol underlying, not a tunable parameter.
Backtest Review
Monthly options cadence means optimization cannot add sample; tuning the VRP/IV-rank/trend gates over only ~21 condor cycles would curve-fit noise.
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).
Iteration History
Verification failed (Layer 4 — QA review) [class=code_defect]:
- [edge_concern] Headline (total_return +11.7%, Sharpe 0.82 with CI [-0.13, 1.81] straddling zero, PF 1.16) is the defined-risk-condor illusion: short legs win (short_win_rate 0.829) while bought wings lose (long_win_rate 0.114), left-tailed (skew -0.71, kurtosis 4.33, largest_loss -10276 vs largest_win +8775), and per-notional edge is deeply NEGATIVE (avg_trade_return_pct -5.55%). Sharpe CI includes zero; Sortino 0.17. The collected condor credit does not clear the round-trip cost measured against the wide wing notional.
- Fee-viability failure. Sandbox avg_trade_return_pct = -5.55% (NEGATIVE) on a defined-risk short iron condor -- the exact structural signature flagged in learning L72 (BTC iron condor Sharpe 3.48 / PF 1.18 / avg_trade_return_pct -7.47%; ETH bull-put -8.34%; Deribit short-strangle -7.5%): per-trade return measured against the wide defined-risk WING notional is deeply negative regardless of a positive total_return / PF>1 / high short-leg win-rate. Deribit is a low-fee venue (analyst floor +0.10% avg_trade_return_pct); a -5.55% per-notional return cannot clear it, and no parameter tuning flips a structurally negative credit/width ratio positive. Reject at QA rather than burning a full backtest + backtest_review cycle on the recurring iron-condor/put-spread/strangle dead-end.
- The forbidden underlying 'warmup' smoke-trade path (_warmup_trade: a long-perp round-trip when self._periods is empty) is still present in this strategy. Two sibling strategies removed this exact pattern as explicitly banned (it gets options strategies abandoned as options_no_option_trades). Here it is gated to fire ONLY when the chain fails to expand, and the sandbox clearly DID expand (140 option-leg trades, balanced 70 SELL / 70 BUY, ~25d holds), so the branch was dead this run. Not the blocking issue, but it is a latent trap: if the expander ever silently yields an empty chain in a scored path, this would fabricate a delta-1 perp backtest that does not test the hypothesis.
- Static-analyzer flags are false positives: self._closes and self._iv_series are both trimmed (caps at lines ~402-405 and ~415-417); price, loss_per_contract, p_then, sma divisions are all guarded (>0 checks). No action required; noting to avoid re-flagging.
Backtest and paper results are hypothetical. Trading involves risk of loss.