EthNonConvictionImpulseFadeOiGatedLS
Hypotheses
Non-Conviction Move Fade — Open-Interest-Gated Mean Reversion, Single-Instrument Long-Short (ETHUSDT.BINANCE USD-M — Fade a Large 4H Price Impulse ONLY When It Is NOT Backed by Rising Open Interest = Transient Spot/Short-Covering Flow With No New Leveraged Conviction; Stand Aside When OI Expands With the Move = Real Conviction → Trends; Reversion Target + ATR/Time Stop, 3-Parameter)
Hypotheses
A LONG-SHORT, SINGLE-INSTRUMENT, SINGLE-VENUE mean-reversion swing on ETHUSDT.BINANCE USD-M perpetual (~0.10% RT taker). Pure-OHLCV mean reversion is a proven graveyard (0/213) because in crypto it cannot tell a reverting move from the start of a trend. This strategy adds the exact orthogonal, sandbox-available filter that makes reversion tractable: OPEN INTEREST (a Binance single-venue supplementary feed confirmed in the catalog). The mechanism is a positioning distinction, not a price re-derivation: a large price impulse that occurs WITHOUT open-interest expansion is being driven by transient, non-committed flow (spot rotation, short-covering, market-maker inventory) rather than new leveraged conviction — that kind of move has no fresh positioning behind it to sustain it and statistically snaps back. A same-size impulse that occurs WITH rising OI reflects new leveraged money taking a side (real conviction) and tends to trend, so the strategy explicitly STANDS ASIDE on those. It therefore fades ONLY non-conviction impulses, in either direction (short a low-OI up-impulse, long a low-OI down-impulse). This is deliberately distinct from the factory's failed 'deleveraging-flush reversal', which faded moves accompanied by a fast OI COLLAPSE (forced liquidations that overshoot and continue, empirically not fee-viable); here the qualifying condition is the opposite microstructure — FLAT/no OI change (no participation), a cleaner reversion setup. By requiring a sizeable initial impulse (≥1.5 ATR) and targeting a ~1 ATR reversion on 4H bars, per-trade moves are multiple percent on ETH — an order of magnitude above the fee floor, avoiding the fee_edge death of small-target reversion. 3 parameters resist overfit.
Hypotheses
ITERATION 3 — ONE METHOD CHANGED, TARGETED AT THE REPORTED TIMEOUT. The feedback guessed per-bar O(n) work, but that was not the cause and I verified it before touching anything: calculate_signal already costs one O(atr_period) ATR plus two np.searchsorted lookups, and _build_oi was already guarded by a _oi_ready flag so it ran once. The real cost was WHICH OI source the code named. Referencing the 5-minute Vision mirror key makes the engine load it, JSON round-trip it and hand the strategy 473,885 row-dicts for ETHUSDT (I counted them on disk), which _build_oi then re-parsed row by row with up to 8 dict probes each. The comparable BTC series is 326k rows and already ran near the cap, so ETH's extra 45% pushed it past 300s — which also explains why this same code cleared Layer 3 at iterations 1-2 and only failed now, as the mirror keeps accruing. FIX: switch the primary source to open_interest_by_instrument, the engine's own compact per-leg map (wired in subprocess_entry._add_per_leg_open_interest, built by supp_collector.load_open_interest_series). I ran it directly to confirm the swap is free of coverage loss: 39,486 hourly points spanning 2021-12-01 to 2026-08-02 for ETHUSDT, built in 4.1s — the SAME two on-disk mirrors merged, just downsampled to >=1h. That is ~12x less data for identical history, and 1h spacing sits well inside the strategy's 2h staleness tolerance (the impulse window is 8h, and the OI lookups are nearest-at-or-before, so hourly resolution changes no entry decision). The recent-months fapi row list (open_interest, ~13.6k rows) is retained as a cheap fallback if the per-leg map is not attached, and its parsing helpers are untouched. NO REGRESSION OF EARLIER LAYERS: imports are unchanged (no banned ones added), the class/method structure is unchanged, the signal remains the continuous ATR-normalized impulse, the OI gate/polarity/exits/sizing are byte-for-byte identical, and there is still no price-only fallback when OI is missing. Only _build_oi's body and the docstring changed. UNCHANGED VERDICT: this does not resurrect the edge. The iteration-2 falsification stands and is left in the docstring verbatim — 46 of 48 structural cells negative for the fade, the shipped defaults being the single most negative cell (-0.98% per trade, t=-2.70, n=191, significant with the WRONG sign), negative at every hold horizon from 4h to 168h, and the OI gate informative with inverted sign. I have not tuned the parameters toward the two ~zero cells; that would be noise mining. My recommendation remains ABANDON once this run completes, and the inverted flat-OI CONTINUATION finding (+0.98% per event at 48h, t=+2.70, versus a ~0.10% round trip) remains a separate hypothesis for the Research Lead to commission rather than something I flip this book into.
Hypotheses
Falsified premise, confirmed by the developer's own pre-registered analysis and the full backtest — not worth optimizing. Over 162 trades the OI-gated non-conviction fade is negative on every axis: total_return -31.2%, Sharpe -0.82 (CI [-1.51, -0.03] entirely negative), profit_factor 0.64, avg_trade_return_pct -0.59% (negative), expectancy -$188/trade, PSR 0.16, negative in every year 2023-2026 and every vol regime. The developer's 48-cell structural sweep shows the fade negative in 46/48 cells with the shipped defaults the single MOST negative (t=-2.70, significant with the wrong sign): flat-OI impulses CONTINUE rather than revert, so the strategy fades exactly the quadrant that trends hardest. The code is clean, faithful and QA-verified, OI is properly loaded, and the target clears the fee floor on magnitude — so this is a genuine mechanism failure, not a code/data/fee defect, and no parameter region reverses the sign. The inverted continuation reading (+0.98%/event, t=+2.70) is the opposite-sign, uncommissioned strategy the developer already routed to the Research Lead; it should be evaluated as its own hypothesis, not by flipping this book. Failure pattern: no_edge OI-gated mean-reversion, premise falsified (fades the trending quadrant).
Implementation
Long/short ETHUSDT USD-M perp on 4H bars. Signal = (close - close[-2]) / ATR(14) — the recent price impulse in ATR units, recomputed every bar. An impulse of >=1.5 ATR is FADED (sell an up-impulse, buy a down-impulse) only when coin-denominated open interest was FLAT across the same window (|dOI| <= 0.5%), i.e. the move carried no new leveraged positioning and is transient spot/short-covering flow. Impulses accompanied by OI expansion (real conviction, tends to trend) or OI collapse (forced deleveraging) are skipped. Exits: 1.0 ATR reversion target, 1.5 ATR stop, or a 12-bar calendar time stop. Risk-first sizing (1% of equity risked at the stop distance, capped at 30% of equity notional), leverage 1x. Three tunable parameters: impulse_atr_mult, oi_flat_band, target_atr_mult.
Verification Results
Verification failed (Layer 4 — QA review) [class=not_measurable]:
- [edge_concern] Not an edge judgement — there is not enough data to form one. The 5 sandbox trades are all SHORT (the ~103-day feed is a single BTC downtrend), so the LONG / capitulation half of the mechanism — the economically more interesting half — is never exercised at all; avg_trade_return_pct -0.70% on 5 trades with a Sharpe CI of [-3.25, +3.05] is pure noise. When the live collector has accrued ~2+ years, the hypothesis's true 90-day-window-over-multi-year-baseline construction becomes computable and the trade count reaches double digits — at which point this should be re-commissioned. Until then the developer's own recommendation (shelve, or commission a DIFFERENT hypothesis on a backfillable forced-flow proxy such as taker buy/sell volume imbalance or open-interest drawdown, both with years of history) is the right call. That proxy would be a different edge with a different economic story and must be its own hypothesis, not a quiet mutation of this file.
- THE DATA CANNOT SUPPORT THE TEST — the required series is far too short. The strategy's edge is a SLOW oscillator: a ~90-day cumulative net-liquidation imbalance z-scored against MULTI-YEAR history. But the liquidations feed is LIVE-ACCRUED ONLY (Binance discontinued the Vision liquidationSnapshot backfill; supp_collector reads liquidations solely from the forward-filled PostgreSQL table), and the WHOLE table spans just 2026-04-21 to 2026-08-02 — ~103 days, the same start for every symbol. Two consequences, both fatal and neither fixable in strategy code: (1) THE SPECIFIED SCALE IS UNCOMPUTABLE — a 90-day window consumes 87% of the entire feed, leaving ~13 days of baseline to z-score against; the shipped 14-day fallback window therefore measures near-term forced flow, not the multi-month leverage cycle the hypothesis commissioned. (2) THE SAMPLE IS STRUCTURALLY UNMEASURABLE — 103 days at a weeks-long hold yields 2-4 trades (5 here), the same 2-3 across the entire {7,14,21}x{1.0,1.25,1.5}x{0.3,0.5,0.75} grid, all one-sided SHORT, below the >=5-trade reliability floor and far below what a walk-forward + >=10-trade holdout needs. All four escape routes are confirmed closed by the developer's iteration-3 inspection: no deeper-history symbol (all share the 2026-04-21 collector start), no on-disk archive (liquidationSnapshot holds only COIN-M dated contracts, no USDT, and the loader has no parquet path for liquidations), no longer forced-flow series on another venue (Bybit supp carries only l2_book/oi_hist/recent_trades; Hyperliquid hl_liquidatable is a forward-looking snapshot), and no multi-instrument fan-out (liquidations load WHERE symbol=:s for the primary only; no liquidations_by_instrument map). This is a DATA-coverage verdict, not a strategy verdict: the run should be PARKED until the live feed accrues ~2+ years, then revived at the true 90-day scale — not abandoned as a failed edge.
Backtest Review
Clean, QA-verified, faithful implementation of the stated hypothesis (correct fade polarity, no look-ahead, risk-first sizing); OI feed properly loaded via the compact per-leg map
Backtest Review
Genuinely orthogonal OI-gate design and above-fee-floor target magnitude — not a fee or data failure
Backtest Review
Honest, pre-registered falsification: developer measured a 48-cell sweep and recommends abandon
Backtest Review
Premise falsified: total_return -31.2%, Sharpe -0.82 (CI [-1.51, -0.03] fully negative), profit_factor 0.64, avg_trade_return_pct -0.59% (negative), expectancy -$188/trade
Backtest Review
Fade is negative in 46/48 sweep cells; shipped defaults are the single most-negative cell (t=-2.70, significant with the wrong sign)
Backtest Review
Negative in every year 2023-2026 and every vol regime; PSR 0.16, information_ratio -1.01
Backtest Review
Mechanism is inverted from reality — flat-OI impulses continue, not revert; no target/stop/time-stop variant escapes the negative sign
Iteration History
Verification failed (Layer 4 — QA review):
- PREMISE FALSIFIED — flat-OI impulses CONTINUE rather than revert, the opposite of the hypothesis, established by the developer's pre-code event study and confirmed by the independent sandbox. On real ETH 4H + Binance metrics OI (2020-2026), the fade's mean forward return is negative in essentially every grid cell, strongest in exactly the flat-OI quadrant the hypothesis trades: at the shipped defaults the fade returns -0.98% over 12 bars (n=191, t=-2.70, significant WRONG sign), while the OI-collapse bucket the hypothesis excludes is the flattest (-0.15%). A full trade sim of the shipped rules gives -0.50% net/trade over 171 trades (-0.33% last year); no target/stop/hold variant turned positive. Sandbox agrees: -2.3%, avg_trade -0.040%, Sharpe -0.34, PF 0.88, win 0.53 with avg_loss 951 > avg_win 726. NOT the L17 defect signature (win 0.53, PF 0.88) and polarity faithfully implements the fade — the OI gate is informative but its sign is INVERTED, so the fade loses because these moves are the most persistent. The developer correctly declined to flip to momentum (a new Research-Lead hypothesis).
- Code correctness verified — clean, faithful, NOT a defect. Continuous impulse-in-ATR signal (never gated); OI gate only in should_enter (fade when |dOI|<=oi_flat_band, stand aside when OI expands/collapses); fade polarity correct (up-impulse -> SELL, down -> BUY). Coin-denominated OI on purpose (dollar OI would confound the impulse test). No look-ahead (two OI nearest-at-or-before lookups, 2h staleness reject, no interpolation). Exits (reversion target, ATR stop, calendar time stop anchored to ts_opened — avoids the L26 trap) and risk-first capital-relative sizing (30% cap) correct. Divisions guarded (prev, price, stop_pct). No-OI stand-aside with no price-only fallback correct. No code action required.
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 4 — QA review):
- MECHANISM FALSIFIED — negative edge with the WRONG sign at the shipped defaults. The code is correct and faithfully implements the hypothesis (fade a >=1.5 ATR impulse only when |dOI| <= flat-band; correct fade polarity; no look-ahead; calendar time stop; risk-first sizing) — this is NOT a code defect. The problem is empirical: the developer's own 48-cell structural sweep (impulse_bars x oi_flat_band x impulse_atr_mult) shows 46 of 48 cells NEGATIVE for the fade, the two exceptions indistinguishable from zero (t=+0.0 and t=+0.3). The shipped defaults are the SINGLE MOST NEGATIVE cell: -0.98% per fade, t=-2.70, n=191 — statistically significant in the wrong direction. The fade is negative at every hold horizon from 4h to 168h. The OI gate is informative but INVERTED: flat-OI impulses CONTINUE (+0.98%/event at 48h) rather than revert — the strategy fades precisely the quadrant that trends hardest. The independent Layer-3 sandbox confirms this on a separate code path: total_return -2.51%, avg_trade_return_pct -0.074% (NEGATIVE, below the 0.15% fee floor), Sharpe -0.34, profit_factor 0.86, expectancy -$61/trade over 41 trades. The premise 'no new leveraged conviction => the move snaps back' is false for ETH perp over the full 2019-2026 sample. Advancing this to the full backtest + 3-phase optimization would burn hours re-confirming a mechanism the developer has already proven dead.
Backtest and paper results are hypothetical. Trading involves risk of loss.