Skip to content

View original

EthPerpOpenInterestDeleveragingFlushReversalLS

Hypotheses

COIN-M Open-Interest Deleveraging-Flush Reversal, Long-Short (Single-Instrument ETHUSD_PERP.BINANCE_CM — Fade Price Moves Driven by a Sharp CONTRACTION in Open Interest, i.e. Positions Closing Rather Than New Conviction Entering; OI-Rate-of-Change Gated, 2-Parameter)

Hypotheses

A LONG-SHORT, SINGLE-INSTRUMENT, SINGLE-VENUE mean-reversion strategy on the ETHUSD_PERP.BINANCE_CM inverse perpetual. The signal is ORTHOGONAL to price: the rate-of-change of OPEN INTEREST (a position-count feed already in the catalog), not any indicator computed on the price series. Core insight — the information content of a price move depends on whether OPEN INTEREST is EXPANDING or CONTRACTING. When price moves sharply WHILE open interest is sharply CONTRACTING, the move is being driven by existing positions being CLOSED (deleveraging / stop-runs / margin reduction), not by new informed capital taking a side. Flow that must exit for balance-sheet reasons is price-insensitive and over-extends, then reverts once the deleveraging clears. So: OI-contraction + sharp price DOWN = longs flushing out → fade LONG; OI-contraction + sharp price UP = shorts covering → fade SHORT. This is mechanistically DISTINCT from a liquidation-cascade fade (which keys off the discrete liquidation print at the violent instant): here the trigger is the slower, hours-scale drop in the position count itself, catching deleveraging flushes that never register as a single large liquidation. Single venue + single instrument → both the 1h bars and the OI feed are jointly available in the Layer-3 sandbox (no cross-venue/multi-leg verification_loop risk). Deliberately 2-parameter to resist the overfit deaths that dominate the failure log.

Hypotheses

Iteration 6, fixing the ONLY reported failure: the backtest gate called the metrics incoherent (Sharpe +0.39 vs total_return -100.00%). That sign disagreement only occurs when the run is stamped LIQUIDATED — the equity curve is floored to zero from the bust bar while the unfloored mark-to-market series keeps marking and prints a positive Sharpe. So the fix is 'stop busting the account', and the change is confined to sizing. Iteration 5's coin-settled equity path is live (the Sharpe moved 0.30 -> 0.39, so notional now compounds off real equity), but the SIZE itself was the problem: notional = equity*risk_frac/stop_pct = 0.67x equity, with a max_notional_frac cap of 1.00 that never bound. At 0.67x, one round trip costs ~0.11% of the whole account (taker + modelled impact), and this strategy's turnover (short holds, 36-bar time stop, thousands of entries in the sandbox window) compounds that to a couple of percent of capital, at which point the equity tracker's maintenance-margin check trips. Iteration 6 makes the cap BIND: max_notional_frac 1.00 -> 0.25 and its hard clamp tightened to [0.01, 0.40] (now declared in _param_bounds so the optimizer cannot re-open the ruin path). A round trip now costs ~0.04% of the account and the worst single trade (3% stop) 0.75%, so the equity path stays strictly positive, no liquidation is stamped, and the equity curve and mtm series are sign-coherent and judgeable. Nothing else changed: signal, entry gate, exits, OI data path and the inverse-contract conversion are byte-for-byte the logic that already cleared Layers 1-3. One sentence of dissent, as required: I do not believe this strategy has an edge — my iteration-3 event study measured the OI gate as pointing the WRONG WAY (fading works best when OI is EXPANDING, +0.469% at 24h, and worst when it is CONTRACTING, -0.198%, i.e. worse than not conditioning at all), and net of the ~0.10% round trip the traded gate is -0.087% per entry; bounding the size makes the loss bounded and measurable, not positive.

Hypotheses

Negative expectancy on a reliable, decisive 2151-trade / 2125-day sample: avg_trade_return_pct -0.093% (below ZERO and under the ~0.10% COIN-M fee floor), profit_factor 0.831, total_return -26.55%, Sharpe -0.038, expectancy -$19.13/trade. The trades correctly implement the hypothesis (balanced long/short fade of OI-contraction moves), so this is a fair test — and the premise is falsified: the strategy loses in every calendar year and every vol regime, and the developer's OWN event study finds the OI gate INVERTED and value-subtracting (fading works best when OI EXPANDS, worst when it CONTRACTS, the exact regime this strategy trades). Commission is only 15.4% of gross, so this is gross-negative, not fee-fragility — the ~2.2:1 loss:win geometry pins the result below break-even. QA's edge concern is borne out. The 2 tunable parameters cannot flip the sign of a conditioning variable that selects the worst regime, so optimization cannot help. This is iteration 6 of a mechanism the developer already recommends abandoning. Not worth 2 hours of optimization. abandon_class=negative_expectancy.

Implementation

Long-short mean-reversion on the ETHUSD_PERP.BINANCE_CM inverse perpetual, gated on the rate of change of ETH perpetual OPEN INTEREST rather than on price alone. Every bar it computes a continuous fade score: -price_z * contraction, where price_z is the close's extension from its own trailing mean in trailing sigmas and contraction = 0.5*(1 - tanh(z-scored OI rate of change)) rises toward 1 when open interest is contracting unusually hard (positions being CLOSED: deleveraging, stop-runs, margin reduction) and toward 0 when it is expanding (new conviction). It enters when |signal| >= entry_z AND the reversion target (distance to the trailing mean) clears the ~0.10% round-trip cost, exits on mean reversion, a 3% stop, or a 36-bar time stop. ETHUSD_PERP has no OI history of its own, so the signal reads the USD-M ETHUSDT.BINANCE per-leg open-interest series (signal-only leg, never traded). Sizing is in whole INVERSE CONTRACTS via contracts_for_notional(), based on the coin-inclusive equity path and capped at 25% of equity per entry.

Verification Results

Acceptable as-is. If the run proceeds, the analyst should be aware the deleveraging signal is measured on USD-M OI, not on the COIN-M contract actually traded.

Verification Results

The hypothesis chose COIN-M single-instrument specifically so the OI feed would be jointly available with the traded bars in-sandbox. In practice ETHUSD_PERP.BINANCE_CM has no OI history, so the code reads OI from the USD-M ETHUSDT.BINANCE per-leg series (signal-only, never traded) via open_interest_by_instrument. The traded instrument and the OI-ROC mechanism both still match the hypothesis, and USD-M is the dominant ETH perp book, so this is an economically defensible proxy — but it reintroduces the cross-venue dependency the hypothesis stated it was avoiding. Documented and bounded (ts<=bar_ts), so not a correctness defect.

Verification Results

The developer's own iteration-3/4 event study on this exact signal (ETH 1h, 2021-12..2026-07) measures the OI gate as INVERTED and value-subtracting: fade return at 24h is -0.198% when OI is contracting (this strategy's trigger), +0.091% flat, +0.469% when OI is expanding, and +0.082% unconditioned — i.e. conditioning on contraction is worse than not conditioning at all. The traded gate nets ~-0.087% per trade after the ~0.10% round trip. The sandbox corroborates: avg_trade_return_pct -0.014%, profit_factor 0.967, total_return -10.06%, negative in all three vol regimes and both stress windows, with a break-even-by-geometry exit (win_rate 0.668 against a ~2.1:1 loss:win). No parameter change flips the sign of a conditioning variable that selects the worst regime. The analyst should treat the OI-contraction premise as likely falsified and check whether the mechanism has any positive-expectancy region before spending optimization hours.

Backtest Review

Well-formed single-venue/single-instrument design that cleared Layers 1-3 and produced a judgeable, non-liquidated run (iteration 6 bounded the notional).

Backtest Review

Trades faithfully implement the hypothesis: a balanced long/short fade (1158 long / 993 short) triggered by OI contraction, so this is a fair test of the premise, not a coding artifact.

Backtest Review

Reliable, decisive sample: 2151 trades over 2125 days, metrics_reliable=true.

Backtest Review

Negative per-trade expectancy: avg_trade_return_pct -0.093% — below ZERO and far under the ~0.10% COIN-M fee floor — with profit_factor 0.831 and expectancy -$19.13/trade.

Backtest Review

Total_return -26.55%, Sharpe -0.038 (CI [-0.87, 0.80] straddling/negative), Sortino -0.038, recovery_factor -0.885, negative in EVERY calendar year (2022 -13.0%, 2023 -5.5%, 2024 -1.0%, 2025 -4.4%) and in all three vol regimes (calm -23.0%, normal -12.2%, stressed -2.1%).

Backtest Review

Break-even-by-geometry exit: win_rate 0.651 against avg_win 144 vs avg_loss 324 (~2.2:1) nets negative — the exit manufactures small wins that fees erase; commission is only 15.4% of gross, so this is gross-negative, NOT fee-fragility.

Backtest Review

The OI-contraction premise is measurably FALSIFIED: the developer's own event study (reproduced on this COIN-M config) finds the gate INVERTED — fading works best when OI is EXPANDING (+0.469%) and worst when contracting (-0.198%), and conditioning on contraction is worse than not conditioning at all. QA's edge concern is borne out.

Backtest Review

The 2 tunables (lookback, entry_z) cannot flip the sign of a conditioning variable that selects the worst regime; there is no positive-expectancy region to optimize toward.

Analysis

Backtest gate: - metrics unreliable: Incoherent: Sharpe 0.39 disagrees in sign with total_return -100.00% — the Sharpe is computed from the mtm_equity_curve series while the return comes from the equity curve. Judge on the equity curve.

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['entry_z', 'lookback', 'stop_pct', 'risk_frac', 'min_notional', 'baseline_bars', 'max_hold_bars', 'min_target_pct', 'min_baseline_obs', 'oi_max_lag_hours', 'max_notional_frac'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: EthPerpOpenInterestDeleveragingFlushReversalLS._row_oi() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - steady_downtrend: TypeError: EthPerpOpenInterestDeleveragingFlushReversalLS._row_oi() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - flat_ranging: TypeError: EthPerpOpenInterestDeleveragingFlushReversalLS._row_oi() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - volatility_spike: TypeError: EthPerpOpenInterestDeleveragingFlushReversalLS._row_oi() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - zero_volume: TypeError: EthPerpOpenInterestDeleveragingFlushReversalLS._row_oi() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000) - price_gap: TypeError: EthPerpOpenInterestDeleveragingFlushReversalLS._row_oi() takes 1 positional argument but 2 were given (bar timestamp: 1735690740000)

Iteration History

Verification failed (Layer 4 — QA review): - High-turnover with a tiny capacity — the edge is destroyed by market impact at any realistic size. The sandbox shows impact_cost_pct 127.4% and capacity_usd just $61,584 against 466 trades, turnover 477x, total_impact_usd $12,806. Capacity BELOW the $100k backtest capital means the run itself is already above the size where impact eats the edge. This is the high-turnover fee/impact-edge death: a 1h mean-reversion fade churning ~1.3 trades/day cannot support meaningful capital, and the gross edge does not survive its own trading costs. - The net edge is marginal-negative and below the fee floor. total_return -2.76%, PF 0.987 (<1), Sharpe -0.44 (CI [-2.15, 1.07] straddles zero), avg_trade_pnl_usd -$5.91, avg_trade_return_pct +0.141% — BELOW the 0.15% futures floor. The high win_rate 0.687 is offset by avg_loss $1,477 being 2.2x avg_win $665 (negative-skew mean-reversion: many small reversions, occasional flush to the 3% stop), netting negative. Polarity/logic correct (fade a stretched price only when OI contracts), so this is marginal/absent edge, not a bug — and it's below the floor before impact is even applied. - Venue mismatch, and the mandated venue is impossible. The hypothesis specifies ETHUSD_PERP.BINANCE_CM (COIN-M, ~0.06% RT, filling the CM bucket), but the config trades ETHUSDT.BINANCE (USD-M, ~0.10% RT). The developer verified COIN-M has NO reachable OI series (only a 2-row snapshot wired to no supp key), so on COIN-M the strategy loads empty OI and places zero trades. The hypothesis's stated venue cannot host the edge, and the USD-M version fills neither the CM bucket nor its fee cushion. Same substitution I flagged as critical on the sibling BTC OI hypothesis — needs a Research Lead re-scope, not a silent swap. - OI coverage gap threatens the pipeline. ETHUSDT OI covers ~2022, 2023, and 2026-02+ only; 2024-2025 absent (developer-acknowledged). Walk-forward windows landing in 2024-2025 have no OI and zero trades, so a valid OOS Sharpe can't form there, and the 15-day holdout depends on the 2026 tail alone — the same coverage problem that made the sibling BTC OI walk-forward/holdout unpopulatable.

Iteration History

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

Iteration History

BtcIvTermStructureStressTransitionLS

Iteration History

Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - config.instrument_id is BTCUSDT.BINANCE but the hypothesis declares ETHUSD_PERP.BINANCE_CM — a different asset. Implement the hypothesis as written (or the Research Lead must revise it). Also note: - hypothesis states 1h bars but config.bar_type is BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL (4-HOUR) — QA rejects a timeframe that contradicts the hypothesis; align bar_type or revise the text.
Strategy report

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