Skip to content

View translation

EthOpenInterestDivergenceExhaustionReversalLS1H

Hypotheses

Hyperliquid ETH Open-Interest / Price Divergence Exhaustion Reversal, Long-Short (Single-Instrument Perp, 1H Bars + OI, Fade Moves on Falling OI — NOT Pure-OHLCV, NOT Breakout, NOT Funding-Carry)

Hypotheses

A LONG-SHORT, SINGLE-INSTRUMENT crypto-native reversal strategy on ETHUSD.HYPERLIQUID perpetual futures using 1-HOUR bars CONFIRMED BY OPEN-INTEREST change (hl OI series). It is deliberately NOT a pure-OHLCV strategy: the entire signal hinges on the relationship between price direction and OI direction, which OHLCV-only strategies (the repeatedly-failed HL breakout / squeeze / opening-range siblings) cannot see. It fills the two loudest portfolio gaps at once — HYPERLIQUID venue (5.9% vs >=20% target) and long_short direction (14.5% vs the 85.5% long-only over-concentration) — while avoiding every documented failure family (no options/Deribit harness, no cross-sectional funding carry with decayed dispersion, no OHLCV breakout, no Bollinger fade, and distinct from the just-created liquidation-cascade fade). The mechanism trades the four canonical price/OI states but only ACTS on the two EXHAUSTION states where OI is CONTRACTING: a strong rally on FALLING OI is short-covering with no fresh long conviction (the up-move is hollow -> fade SHORT), and a sharp sell-off on FALLING OI is forced long-liquidation / capitulation (sellers exhausting -> fade LONG). When OI is RISING with the move (new money entering in the trade direction) we stand aside — that is a healthy trend we must not fade. Deliberately low-parameter (~4 core knobs: oi_window, price_move_thr, oi_drop_thr, plus one exit geometry) given the recurring overfitting failures, and the exit geometry is explicitly NON-inverted (take-profit target >= stop distance) to avoid the small-win/large-loss payoff trap that sank the COIN-M Bollinger strategy. RISK PROFILE: base risk 1.5% of equity per trade; volatility-based stop placed beyond the swing extreme of the exhaustion move (where the reversal thesis is invalidated); take-profit set at >= 1.0x the stop distance so avg_win is not structurally smaller than avg_loss; position size scales with divergence strength (larger price move + larger OI contraction => up to 3% risk, marginal divergence => 1%); max single-position exposure 20% of equity; hard time-stop of 36 hours (if the reversion has not begun the divergence was noise, exit flat); leverage 1.0.

Hypotheses

Iteration 2 fixes exactly the reported Layer-1.5 mismatch: the traded instrument is now the hypothesis's declared ETHUSD.HYPERLIQUID perp instead of ETHUSDT.BINANCE. Before switching I confirmed both data legs actually resolve for the HL instrument, since the previous venue swap was made on the assumption that they could not: (1) ETHUSD.HYPERLIQUID 1-HOUR bars are in the catalog from 2025-10-11 through 2026-09-04, and (2) the factory's supplementary loader derives the OI symbol from the instrument id (ETHUSD -> ETHUSDT), so the ETH perp open-interest history (2026-03-23 -> present) is delivered for this HL instrument with no extra leg and no cross-venue plumbing. I document in the docstring that this OI series is market-wide ETH perp OI rather than an HL-specific OI level (Hyperliquid publishes no OI-level history here, only hl_oi_cap booleans) — short-covering and forced-liquidation flushes are cross-venue events, so it is a valid confirmation for the HL contract, and it remains a signal only. Only two other lines changed: min_notional 5 -> 10 (Hyperliquid's minimum) and an explicit min-notional check in position_size so undersized orders are skipped rather than silently rejected. The signal, entry/exit geometry, risk scaling and all tunables are unchanged.

Hypotheses

Negative-expectancy OI-gated exhaustion fade on a short single-regime window — not worth 2 hours of optimization. Over 102 trades: profit_factor 0.78, avg_trade_return_pct -0.028% (negative), expectancy -$34.5/trade, total_return -3.5%, Sharpe -1.18 with CI [-3.16, 0.93] and PSR 0.254 (avg_win $255 < avg_loss $302, so the non-inverted geometry still did not produce an edge). It is also structurally unmeasurable: Hyperliquid ETH 1H data begins 2025-10-11, so the entire backtest spans ~11 months of one regime (data_days 328, annual_returns {2026} only, only_one_regime true), with the stressed tercile at -5.2% (Sharpe -3.3) — a 3-window walk-forward plus 20% holdout on 102 single-regime trades cannot validate anything. This is the L73 single-perp OI/supplementary-gated directional-fade family (edge-dead this session, sibling to the already-abandoned BTC OI-divergence exhaustion fade) crossed with Hyperliquid (0/128, L82). No parameter change flips a negative-Sharpe, sub-0.8-PF, negative-per-trade fade, and the data wall precludes robust validation regardless. Failure pattern: no_edge single-perp OI-gated fade, single-regime HL data (L73/L82).

Implementation

Long-short OI/price-divergence exhaustion reversal on ETHUSD.HYPERLIQUID perp, 1-HOUR bars. Each bar the 4-bar price move is paired with the change in ETH perp open interest over the same window. The strategy acts ONLY on the two exhaustion states where OI is CONTRACTING by at least 1%: a >=1% rally on falling OI is short-covering with no fresh long conviction (fade SHORT), and a >=1% sell-off on falling OI is forced long-liquidation/capitulation (fade LONG). When OI rises with the move it stands aside. Stops sit beyond the 4-bar swing extreme plus 0.5 ATR (where the reversal thesis is invalidated) with a non-inverted take-profit at 1.5x the stop distance; risk per trade scales 1%-3% of equity with divergence strength, exposure caps at 20% of equity, and a 36-hour time stop exits stale trades. Leverage 1.0. OI is a signal only, never a cash flow; with no OI coverage the strategy stands flat.

Verification Results

Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - config.instrument_id is ETHUSDT.BINANCE but the hypothesis declares ETHUSD.HYPERLIQUID — same asset, DIFFERENT venue/contract type (fees, settlement and the mechanism's premise differ). Trade the declared instrument.

Backtest Review

Clean low-parameter build with non-inverted TP≥stop geometry, swing-extreme stops, and honest disclosure that HL has no OI-level history (uses market-wide ETH OI as signal only)

Backtest Review

Contained drawdown (4.3%); OI used as signal, not cash flow

Backtest Review

Negative expectancy: PF 0.78, avg_trade_return_pct -0.028%, expectancy -$34.5/trade, Sharpe -1.18 (CI [-3.16, 0.93]), PSR 0.254

Backtest Review

Structurally unmeasurable: HL ETH 1H starts 2025-10-11, so the whole test is ~11 months / one regime (only_one_regime true; annual_returns {2026 only})

Backtest Review

3-window walk-forward + 20% holdout cannot validate 102 trades in a single regime; stressed tercile already -5.2% (Sharpe -3.3)

Backtest Review

L73 single-perp OI/supplementary-gated fade family crossed with Hyperliquid (0/128, L82); sibling to the already-abandoned BTC OI-divergence exhaustion fade

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['tp_mult', 'max_risk', 'min_risk', 'base_risk', 'oi_window', 'atr_buffer', 'atr_period', 'oi_drop_thr', 'min_notional', 'price_move_thr', 'time_stop_hours', 'max_notional_frac'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: EthOpenInterestDivergenceExhaustionReversalLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - steady_downtrend: TypeError: EthOpenInterestDivergenceExhaustionReversalLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - flat_ranging: TypeError: EthOpenInterestDivergenceExhaustionReversalLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - volatility_spike: TypeError: EthOpenInterestDivergenceExhaustionReversalLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - zero_volume: TypeError: EthOpenInterestDivergenceExhaustionReversalLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - price_gap: TypeError: EthOpenInterestDivergenceExhaustionReversalLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000)

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 3 — sandbox backtest): No trades produced Bar type used: ETHUSDT.BINANCE-1-HOUR-LAST-EXTERNAL, Bars processed: 56952 Diagnostics: should_enter() returned a side 0 times over 56936 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.
Strategy report

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