Skip to content

View original

EthOpenInterestConfirmedBreakoutLS

Hypotheses

ETH USD-M Open-Interest-Confirmed Breakout, Long-Short (BINANCE Perp, 4H Bars, Trade Only Breakouts Where OPEN INTEREST Is Rising — New Leveraged Money Confirms the Move, Exit on OI Roll-Over, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument swing strategy on ETHUSDT.BINANCE (USD-M perpetual, 4-hour bars) whose distinguishing edge is OPEN-INTEREST confirmation — a crypto-native, catalogued supplementary signal (open_interest) that is almost entirely unexplored in the current portfolio and is INVISIBLE in pure OHLCV. The core insight: a price breakout accompanied by RISING open interest means new leveraged capital is entering to drive the move (genuine trend continuation), whereas a breakout on FALLING open interest is short-covering/position-unwind exhaustion that typically fails. By trading only OI-confirmed breakouts and exiting the moment OI rolls over, the strategy filters out the false breakouts that kill plain price-only trend-followers (ETH daily vol-targeted TSMOM just died deflated-Sharpe; single-instrument OHLCV trend is 0/210). It deliberately fills the largest quota gap — DIRECTION (long_only 84.7% vs a ≤55% target) — by being fully symmetric long/short. It avoids every recent graveyard: NOT an options structure (L2), NOT a funding-rate signal (L13 — this uses OI, not funding), NOT a liquidation feed (L3 — OI history for ETH extends to ~2020 via Binance metrics, unlike the 90-day liquidation feed), NOT Hyperliquid (L11), NOT a cross-venue carry (L1), NOT an N-asset basket (L12). Deliberately low-parameter (3) to resist overfit, the #1 killer (202x).

Hypotheses

Iteration 2 makes the smallest possible change to clear the Layer-2 failure: the three OI-parsing helpers (_to_ns, _row_ts, _row_val) were @staticmethods, and the verification proxy rebinds transferred staticmethods as instance-bound methods, so self._row_ts(row) supplied the wrapper instance as an extra positional argument (TypeError: takes 1 positional argument but 2 were given). Converting them to plain instance methods that take self and are invoked via self.* binds correctly in both the real strategy and the proxy, while producing identical parsing behavior. Nothing else changed — the edge logic (OI-confirmed Donchian breakout, OI-rollover exit), the continuous bar-varying signal, all parameters, the venue/leverage routing, and sizing are exactly as in the version that already passed Layer 1. This preserves every earlier passing layer and only repairs the reported synthetic-scenario crash.

Hypotheses

The hypothesis's core data claim — 'OI history for ETH extends to ~2020 via Binance metrics' — is contradicted by the backtest: across 14,354 4H bars spanning 2019→2026, only 7 entries fired, all clustered in a single ~2-month window (2026-03→05), because the OI-confirmation gate can only trigger where OI data exists. So OI coverage in this run is a recent few-month window, far short of 2020 (Binance's openInterestHist API serves only limited recent history; I have NOT independently confirmed whether Binance Vision metrics OI can be backfilled further — this should be verified, not assumed). The result is both unvalidatable (7 trades, data_days 21 — the 3-phase pipeline's walk-forward windows and 15-day holdout would each hold ~0 trades) and decisively losing where it did trade (profit_factor 0.027, win_rate 14.3%, expectancy -$1352/trade, Sharpe -8.2, commissions 154% of gross, long_win_rate 0%). No developer parameter/code change fixes OI data coverage, and the code is already sound. Recommend the Data Engineer verify and, if possible, backfill full ETHUSDT open-interest history (Binance Vision metrics) BEFORE any OI-signal strategy is re-attempted; until OI coverage spanning the bar range is confirmed, OI-gated strategies will keep producing a handful of recent-only trades regardless of instrument or parameters. If OI is later confirmed to span multiple years, this exact mechanism is worth re-testing on a proper sample.

Implementation

Long/short swing strategy on ETHUSDT.BINANCE USD-M perp (4H bars) that trades Donchian breakouts ONLY when confirmed by rising open interest. Each bar it aligns the catalogued open_interest series (list of row-dicts, timestamps normalized to ns, most-recent sample within an 8h lag) to the bar and computes OI percent change over the breakout window. A close above the prior 12-bar high with OI up >= oi_rise_threshold goes long; a close below the prior 12-bar low with rising OI goes short. It exits the moment OI rolls over (current OI drops below oi_rollover_threshold of its peak since entry), plus a 3% stop, 8% take-profit, and 30-bar time stop. Sized capital-relative at per_leg_pct x leverage of equity (2x leverage wired into sizing). Fully symmetric long/short.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['per_leg_pct', 'min_notional', 'stop_loss_pct', 'oi_lag_seconds', 'take_profit_pct', 'max_holding_bars', 'breakout_lookback', 'oi_rise_threshold', 'oi_rollover_threshold'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: EthOpenInterestConfirmedBreakoutLS._row_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - steady_downtrend: TypeError: EthOpenInterestConfirmedBreakoutLS._row_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - flat_ranging: TypeError: EthOpenInterestConfirmedBreakoutLS._row_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - volatility_spike: TypeError: EthOpenInterestConfirmedBreakoutLS._row_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - zero_volume: TypeError: EthOpenInterestConfirmedBreakoutLS._row_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000) - price_gap: TypeError: EthOpenInterestConfirmedBreakoutLS._row_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690560000)

Verification Results

Optimize oi_rollover_threshold in a looser band and/or require the OI drop to persist >1 bar.

Verification Results

oi_rollover_threshold default 0.97 exits when OI drops only 3% below its peak-since-entry. Hourly OI aligned to 4H bars is noisy, so a 3% wiggle can force a premature exit — plausibly driving the low win rate. Matches the hypothesis STRUCTURE, so not a logic mismatch, but aggressive.

Verification Results

Judge edge at BACKTEST_REVIEW on full-history reliable metrics, not the 7-day sandbox.

Verification Results

Layer-3 sandbox is NON-DIAGNOSTIC despite extreme metrics (Sharpe -20.1, PF 0.025, win_rate 0.143): metrics_reliable=false, data_days=7, only 7 trades. Not the win_rate=0/PF=0/inverse signature of a bug. Polarity, sizing, counters, no look-ahead, and the OI edge all verified correct.

Backtest Review

Genuinely novel, OHLCV-invisible signal (open interest); symmetric long/short fills the direction quota gap

Backtest Review

Code is clean: robust multi-key/multi-unit OI parsing, 8h lag alignment, honest no-price-only-fallback, low 3-parameter design

Backtest Review

Hypothesis's data premise is false in practice: despite a 2019→2026 bar range and 14,354 bars seen, only 7 entries fired, ALL clustered in 2026-03→05 — OI coverage in this run is a recent ~2-3 month window, not back to 2020

Backtest Review

7 trades / data_days 21 — far too few for walk-forward (3 windows) or the 15-day holdout; optimization would fit noise

Backtest Review

The tested sample is decisively losing: total_return -9.43%, profit_factor 0.027, win_rate 14.3%, expectancy -$1352/trade, Sharpe -8.2, commissions 154% of gross, long_win_rate 0%

Outcome Summary

EthOpenInterestConfirmedBreakoutLS proposed a genuinely novel, OHLCV-invisible edge — trading breakouts only when rising open interest confirmed new leveraged capital, and exiting on OI roll-over — deliberately symmetric long/short to fill the portfolio's largest quota gap and explicitly claiming ETH OI history reached back to 2020, unlike the 90-day liquidation feed that had killed siblings. The code was clean (robust OI parsing, 8h lag alignment, honest no-fallback), but the data claim proved false in practice: only 7 entries fired, all in a single ~2-month 2026 window, and where it traded it lost decisively with a 0.027 profit factor and a 14.3% win rate. The reviewer abandoned it as an unvalidatable, data-coverage-blocked result rather than a code defect, recommending the Data Engineer confirm and backfill full ETH open-interest history before any OI-signal strategy is re-attempted. The confirmation edge was never testable — the signal simply did not exist across the backtest window — though the exact mechanism is flagged as worth revisiting on a proper multi-year sample.

Outcome Summary

Verify a supplementary signal's actual historical coverage before building on a claim about it — the hypothesis asserted multi-year ETH OI history but the feed provided only a few recent months, so the OI-gated strategy could only ever produce a handful of recent trades; the mechanism is worth re-testing only if OI coverage spanning the bar range is confirmed and backfilled.

Outcome Summary

The backtest reviewer returned 'abandon' at the pre-optimization gate: the hypothesis's core data claim — that ETH open-interest history extends back to ~2020 — was contradicted, as OI coverage in the run was only a recent few-month window, yielding 7 trades and data_days of 21, far too few for walk-forward or holdout, and no parameter change can fix data coverage.

Outcome Summary

A long-short, single-instrument swing strategy on ETHUSDT.BINANCE USD-M perp (4H bars) that traded Donchian breakouts only when open interest was rising — treating rising OI as confirmation that new leveraged money was driving the move — and exited the moment OI rolled over off its peak, using the catalogued open-interest supplementary signal that is invisible in pure OHLCV.

Outcome Summary

The backtest fired only 7 entries across 14,354 4H bars spanning 2019-2026, all clustered in a single ~2-month window (2026-03 to 2026-05), because the OI-confirmation gate could only trigger where OI data existed. The tested sample was decisively losing: total return -9.43%, profit factor 0.027, win rate 14.3% (long_win_rate 0%), expectancy -$1,352/trade, Sharpe -8.2, and commissions at 154% of gross. No optimization stage ran.
Strategy report

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