Skip to content

View original

BtcOptionsSkewSentimentReversalLS

Hypotheses

BTC Options-Skew Sentiment Extreme Reversal, Long-Short (Trade the BTCUSDT.BINANCE Perp on DERIBIT 25-Delta Put-Call IV SKEW — NEW Information Source: Fade Extreme Hedging-Demand Skew as It Turns, Distinct from Vol LEVEL, Revert Exit, 3-Parameter)

Hypotheses

A LONG-SHORT directional strategy that TRADES the liquid BTCUSDT.BINANCE USD-M perpetual using a genuinely NEW INFORMATION SOURCE — the DERIBIT options SKEW (25-delta risk reversal = 25Δ put IV − 25Δ call IV) — per the meta-learner's L38 mandate. Skew measures the ASYMMETRY of options demand: how much more traders pay for downside protection (puts) than upside (calls). This is orthogonal to price, momentum, funding, open interest, liquidation flow, AND the vol LEVEL (my pending DVOL idea uses overall implied vol; skew is the directional put/call TILT — a different facet entirely). It is NOT an options strategy (no option legs → sidesteps options-implementation deaths); skew is purely a signal input to time a simple perp trade (dev-safe). The documented edge: skew reaches extremes at sentiment turning points — a very steep PUT skew means fear/hedging demand is saturated (everyone who wants protection has it), which historically marks capitulation lows → contrarian LONG the perp as the skew begins to flatten; an extreme CALL-favored (flat/negative) skew signals greed/complacency at tops → SHORT as it rolls over. It stays on BTC (deepest options market → cleanest skew, and the one instrument with demonstrated tradability), single perp execution, and is built for the analyst's gates: skew extremes recur enough for a measurable multi-year sample (~80-160 trades), BTC reversals off sentiment extremes are large (~3-6%, clearing the ~0.10% fee), and revert-to-mean vs defined stop keeps reward:risk favorable and drawdown bounded. It fills the under-target LONG-SHORT bucket (13.6% vs 86.4% long-only) and the near-empty options-informed space. 3 parameters.

Hypotheses

Fixes the reported Layer-3 failure (should_enter returned a side 0 times) by fixing its actual cause, which I found by reading the stored feed rather than theorising again. `data/supplementary/deribit/book_summary_BTC_*.parquet` (161k rows) has NO delta column and no greeks block — contrary to the docs' claim that Deribit book summary ships greeks — so my builder, which required a delta on every row to place it on the 25-delta wing, dropped 100% of rows and the skew series was empty. The one substantive change: when a row carries no delta, the strategy now computes it itself with Black-Scholes (helpers.options.black_scholes_delta, r=0 since the feed's own interest_rate column is 0.0) from strike/expiry/kind parsed out of `instrument_name` (BTC-DDMMMYY-STRIKE-C|P) plus the row's `underlying_price` and `mark_iv`; parsing is cached per symbol so the series is still built once (1.8s measured). Supporting loosening forced by the data's real cadence: z-window 30→21 days, min samples 20→12, turn requirement now 'stopped steepening' (floor 0.0). Verified offline against the stored parquet: 168 paired hourly skew buckets, span 29 days, mean +0.005 / sd 0.029, z available on 116 4H bars, 6 entry crossings — no longer structurally silent. Everything that already passed Layers 1–2 is untouched: same imports (helpers.options is an accepted in-repo helper used by many generated strategies), same class/method structure, same continuous signal, same exits and sizing. HOWEVER: `deribit_book_summary` history begins 2026-08-06, i.e. 29 days against a ~6.5-year backtest window, so the skew exists on only the last ~1% of the run and the achievable sample is roughly 3–5 trades, not the ~80–160 the hypothesis pre-registered — which is why my recommendation is abandon despite the reported failure being fixed. I deliberately did not substitute `deribit_dvol` to manufacture trades: DVOL is the vol LEVEL, a different facet than the put/call TILT, and swapping it in would test a different idea while claiming to test this one.

Hypotheses

verification_loop: Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 502)

Implementation

Long/short BTCUSDT.BINANCE USD-M perpetual timed by the Deribit 25-delta options skew (25d put IV minus 25d call IV) built from the `deribit_book_summary` supplementary feed. The skew is bucketed hourly, z-scored over a 21-day trailing window, and traded contrarian: an extreme PUT-rich skew (saturated hedging demand = capitulation) that has stopped steepening is a LONG, an extreme CALL-favoured skew (complacency) that has stopped steepening is a SHORT. Entries fire on a fresh cross of +/- skew_z_thresh; exits are an intrabar-detected ATR stop (checked first), an ATR target on the close, and a 24-bar (4-day) max hold. Sizing is gap-aware risk-first (equity * 2% / (max(stop, 3) * ATR)) capped at 35% of equity notional, leverage 1.0, no option legs.

Verification Results

Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 502)

Iteration History

Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL, Bars processed: 2180 Diagnostics: should_enter() returned a side 0 times over 2155 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): No trades produced Bar type used: BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL, Bars processed: 14388 Diagnostics: should_enter() returned a side 0 times over 14363 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): No trades produced Bar type used: BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL, Bars processed: 14390 Diagnostics: should_enter() returned a side 0 times over 14365 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.

Abandon Reason

verification_loop: Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 502)
Strategy report

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