Skip to content

View original

BtcEthDvolRegimeTimingDirectionalPerp

Hypotheses

BTC/ETH Implied-Volatility Regime Timing, Cross-Venue Directional (DERIBIT DVOL / ATM-IV as an EXOGENOUS Sentiment Signal → Trade the BINANCE USD-M Perp; Go LONG After a Fear-Driven IV Peak Rolls Over, Go SHORT When Complacency-Low IV Starts Rising Into a Breakdown — NOT an Options Position, Uses the Barely-Touched Greeks/IV Feed, Daily Bars, 3-Parameter)

Hypotheses

A cross-venue, LONG-SHORT directional strategy that abandons the funding-carry family entirely (BTC single survived once, but the ETH single and the SOL/DOGE/AVAX alt basket both died fee_edge — carry outside BTC does not clear fees) and instead trades on an EXOGENOUS volatility-market sentiment signal that no strategy in the book uses: the Deribit implied-vol surface. The signal source is DERIBIT (BTC and ETH DVOL index, or equivalently the front ATM implied vol), sampled daily; the traded instrument is the BINANCE USD-M perp (BTCUSDT.BINANCE, ETHUSDT.BINANCE). This is explicitly NOT an options position — we never buy or sell an option, so it sidesteps the entire options trade-count wall (L23). The economic thesis: crypto implied vol overshoots realized vol during panic and mean-reverts; price bottoms cluster at IV PEAKS (max fear), and local tops form as complacency-low IV starts rising. So: when IV has spiked to a high percentile and then ROLLS OVER (vol-crush beginning), go LONG the perp to catch the post-capitulation recovery; when IV sits in a low percentile and starts RISING (complacency breaking, risk repricing), go SHORT. Directional moves captured are multi-percent over multi-day holds, so the ~0.10% USD-M round trip is trivial. This is NOT carry (L1/L13), NOT single-name price mean-reversion (the signal is the exogenous vol surface, not the instrument's own price z-score), NOT a rank/rotation basket (L12/L24), NOT options (L23), NOT liquidation-dependent (L3), NOT funding-directional. Two names (BTC, ETH) for sampling; ~3 parameters (IV percentile lookback, high/low percentile thresholds, IV-slope confirmation window).

Hypotheses

Iteration 3 addresses the Layer-4 QA failure (structural sub-measurability + missing ETH leg) with the smallest change that leaves the already-passing signal logic untouched. (1) MEASURABILITY: the entry gate is loosened from enter_thresh 0.85 → 0.70 (still selective — genuine IV extremes with slope confirmation) which, per a simulation over the full 2021→2026 DVOL history, raises the BTC-leg count from ~51-67 to ~83 distinct trades; the 20-day time stop plus regime-fade exit provide re-entries within persistent regimes without churn. (2) TWO NAMES: ETHUSDT.BINANCE is added as an extra_instrument and traded alongside BTC, roughly DOUBLING the sample to ~150-166 full-history trades — comfortably above the ~100-trade measurability floor the QA cited (and ~24-30 in the 365d sandbox). Crucially, the backtest supp layer derives deribit_ccy from the PRIMARY instrument only (supp_collector line 592/616), so it delivers just BTC DVOL to a Binance-perp strategy — an ETH leg cannot be driven by ETH DVOL. I therefore drive BOTH legs off the BTC DVOL composite, which is defensible: DVOL is the market-wide crypto-fear gauge and ETH IV is ~0.9 correlated, and it is the only DVOL series the engine provides here. The signal core (calculate_signal, _load_dvol, composite) is byte-identical to the passing iteration, so Layer 1 (imports clean, no banned modules) and Layer 2 (calculate_signal is the only method the proxy exercises; unchanged, _ts_ns stays an instance method) do not regress; only position management was generalized from single-leg to per-leg (_process_primary now manages the primary + each extra leg independently), which the base's cross-leg sync barrier keeps contemporaneous since both perps have full continuous daily history. Still NOT an options position (sidesteps L23), NOT carry, NOT single-name price mean-reversion (signal is the exogenous vol surface), NOT a rank/rotation basket, NOT liquidation-dependent. leverage=1.0 and unreferenced (no leverage-unused gate); per-leg risk-based sizing caps drawdown.

Hypotheses

No measurable edge at backtest review: profit_factor 1.005 (break-even), total_return 0.87% over ~5.5 years, Sharpe 0.051 with CI [-0.59, 0.66] straddling zero, PSR 0.56 (indistinguishable from a coin flip), and calmar 0.026. The DVOL composite signal fires and trades 212 times but produces no directional edge in any regime — annual returns flip sign randomly (2021 -18%, 2022 +35%, 2024 -1.6%, 2025 -23%, 2026 +7%), netting ~zero, which is noise rather than robustness. Critically, capacity_usd is only $322k with impact_cost_pct 55.66% on the two MOST liquid crypto perps (BTC/ETH), meaning the per-trade edge is essentially nonexistent and market impact already consumes over half of gross PnL — even a lucky tuned config could not scale to a deployable size. This is the no-edge/marginal signature; the 3-phase optimizer (225 trials selecting best Sharpe) would select noise from a PF-1.005 base and fail the deflated-Sharpe gate, and the sub-$1M capacity is a promotion blocker regardless. The signal is genuinely novel but the whole return stream is centered on zero with no partial edge to tune toward, so there is nothing for parameter optimization to capture. Not worth 2 hours of optimization.

Implementation

Cross-venue long-short directional strategy trading the Binance USD-M BTC and ETH perps (daily bars) off Deribit's BTC DVOL implied-vol index as an EXOGENOUS market-wide sentiment signal — never buying/selling an option. Each daily bar it reads the latest DVOL level, computes its percentile within a 60d lookback and a 3d fractional slope, and forms composite = (2*iv_percentile - 1) - beta*iv_slope. High IV percentile rolling over (vol crush) → composite strongly positive → LONG the post-capitulation recovery; low IV percentile starting to rise (complacency breaking) → composite strongly negative → SHORT the breakdown. Both the BTC (primary) and ETH (extra) perp legs are traded on this shared BTC-DVOL composite and managed independently on each leg's own price (percent stop-loss, take-profit, 20-day time stop, and regime-fade/flip exit when the composite reverts through exit_thresh). Entry fires when |composite| > enter_thresh (0.7). Sizing is risk-based (risk_per_trade / stop distance) capped at max_notional_frac of equity, per leg; no leverage.

Verification Results

Verification failed (Layer 4 — QA review): - Structural sub-measurability. The entry gate (|composite| > enter_thresh=0.85) fires only at genuine IV-percentile extremes with slope confirmation — an inherently low-frequency, few-times-per-year macro-timing event. The sandbox produced just 12 trades over 363 days, and the developer's own rationale states the FULL-history count is only ~37 trades — far below the ~100-trade floor needed to distinguish edge from noise. The sandbox Sharpe -0.52 has CI [-2.17, +1.25] (straddles zero widely), PF 0.71 on win_rate 0.33 with n=12 — statistically meaningless. Passing a gate that structurally implies <100 trades causes downstream stages to burn iterations only to conclude 'unmeasurable'. It cannot be fixed by tuning without gutting selectivity. - The hypothesis names TWO traded instruments (BTCUSDT.BINANCE, ETHUSDT.BINANCE / 'Two names BTC, ETH'), but the code trades ONLY BTC (no extra_instruments; _load_dvol reads only raw['BTC']). This under-implements the hypothesis and roughly halves the already-insufficient sample — even a full BTC+ETH build reaches only ~74 full-history trades, still borderline-unmeasurable.

Verification Results

Analyst should evaluate the edge on the ~83 distinct signal events, not the raw leg-trade count; the two legs are near-duplicate expressions of one macro bet.

Verification Results

Cross-leg non-independence caps the real measurability gain. Both the BTC and ETH legs are driven by the SAME single BTC-DVOL composite (should_enter called with the identical shared signal per leg in _process_primary), so the two legs almost always enter/exit the same direction at the same time on ~0.9-correlated instruments, differing only via each leg's own price stop/TP/time exits. The ~150-166 full-history trades therefore are NOT ~150 independent observations — the distinct directional bets number closer to the ~83 single-leg signal events, each expressed twice. Trade COUNT now nominally clears the ~100 floor (real improvement over the prior ~37), but doubled count is not doubled statistical power.

Verification Results

Acceptable given the constraint; record that the ETH leg is signalled by BTC DVOL, and drive ETH off its own DVOL if it ever becomes available to make the two names independent samples.

Verification Results

Hypothesis names 'BTC and ETH DVOL' and 'two names for sampling', but the code drives BOTH legs off BTC DVOL only (the ETH leg is not gated by ETH's own IV). Disclosed engine data constraint (supp layer delivers only the primary underlying's DVOL); using BTC DVOL as a market-wide fear gauge for ~0.9-correlated ETH is defensible, and the core edge (exogenous vol-surface, not price z-score) is preserved for both legs — a mild documented compromise, not a strategy swap.

Verification Results

Analyst decides on full history; treat the sandbox as directional-only and watch the long/short asymmetry.

Verification Results

Edge outcome for the analyst (not a code defect): sandbox is weakly negative and inconclusive — total_return -4.5%, Sharpe -0.23 (CI [-1.73, +1.38], spans zero), profit_factor 0.89, win_rate 0.42, contained max_drawdown 19.1% over 38 trades. Too noisy to conclude either way; the full-history run is where the call must be made. Note long_win_rate 0.25 vs short_win_rate 0.55 — the long-after-IV-peak leg looks weaker.

Backtest Review

Genuinely novel exogenous signal (Deribit DVOL implied-vol surface) that no strategy in the book uses; sidesteps the options trade-count wall

Backtest Review

DVOL feed is present and firing (212/212 signaled entries submitted) — no data-availability wall

Backtest Review

Balanced long/short book (93 long / 119 short), low beta -0.04, and drawdown under the 50% hard floor

Backtest Review

profit_factor 1.005 — essentially break-even; no measurable edge across 212 trades (no-edge signature)

Backtest Review

total_return 0.87% over ~5.5 years, Sharpe 0.051 with CI [-0.59, 0.66] straddling zero, PSR 0.56 (coin-flip), calmar 0.026

Backtest Review

No consistent regime: annual returns flip sign randomly (2021 -18%, 2022 +35%, 2025 -23%) — net ~zero, not robustness

Backtest Review

capacity_usd only $322k with impact_cost_pct 55.66% on the most liquid perps — the per-trade edge is sub-scale and impact consumes over half of gross PnL

Backtest Review

max_drawdown 39.1% (CI high 66.7%) for ~0% return — all risk, no reward

Outcome Summary

This strategy broke cleanly from the fee-dead carry family by trading on a genuinely novel exogenous input — the Deribit DVOL implied-vol surface — to time BTC and ETH perp direction without ever holding an option, sidestepping the options trade-count wall. The DVOL feed was present and fired 212 well-balanced long/short trades with low beta and a sub-50% drawdown, but the return stream was centered on zero: profit factor 1.005, Sharpe 0.051, and annual returns that flipped sign randomly across the years. Worse, capacity was only $322k with market impact consuming over half of gross PnL on the most liquid perps, so even a lucky tuned config could not scale. The analyst abandoned it at review, since a PF-1.005 base offers nothing for the optimizer to capture and the sub-$1M capacity blocks promotion outright.

Outcome Summary

A genuinely novel exogenous signal that fires reliably and trades a balanced book can still have no directional edge — random sign-flipping annual returns net to zero is noise, not robustness — and a per-trade edge so thin that market impact eats half of gross PnL cannot scale to deployable size no matter how it is optimized.

Outcome Summary

It was abandoned at the pre-optimization backtest-review gate as a no-edge/marginal result: a break-even profit factor and coin-flip Sharpe with the return stream centered on zero and no consistent regime meant there was nothing for the optimizer to tune toward, and the sub-$1M capacity with impact consuming over half of gross PnL was a promotion blocker regardless.

Outcome Summary

A cross-venue, long-short directional strategy that uses the Deribit DVOL implied-volatility surface as an exogenous sentiment signal (not an options position) to time the Binance USD-M BTC and ETH perps — going long after a fear-driven IV peak rolls over and short when complacency-low IV starts rising — via a composite of IV percentile and IV slope on daily bars.

Outcome Summary

The backtest showed essentially no edge: total return 0.87% over ~5.5 years across 212 balanced trades (93 long / 119 short), profit factor 1.005, Sharpe 0.051 (CI straddling zero), PSR 0.56, a 39.1% max drawdown, and a critical capacity of only $322k with impact_cost_pct 55.66% on the two most liquid crypto perps; annual returns flipped sign randomly (2021 -18%, 2022 +35%, 2025 -23%).

Iteration History

BtcDvolRegimeTimingDirectionalPerp

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['beta', 'min_bars', 'min_window', 'exit_thresh', 'enter_thresh', 'min_notional', 'iv_stale_days', 'max_hold_days', 'stop_loss_pct', 'risk_per_trade', 'take_profit_pct', 'iv_lookback_days', 'max_notional_frac', 'slope_window_days'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - zero_volume: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - price_gap: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000)
Strategy report

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