Skip to content

View translation

BtcPerpOpenInterestConfirmedTrendRegimeLS

Hypotheses

COIN-M BTC Perp Open-Interest-Confirmed Directional Regime, Long-Short (Single-Instrument BTCUSD_PERP.BINANCE_CM — Hold in the Direction Where PRICE and OPEN INTEREST Rise Together = Genuine Capital-Backed Trend; Exit When OI Rolls Over = Trend Exhaustion, Low-Turnover, 3-Parameter)

Hypotheses

A LONG-SHORT, SINGLE-INSTRUMENT directional strategy on BTCUSD_PERP.BINANCE_CM (COIN-M inverse, BTC-margined, ~0.06% RT taker) whose signal is driven by a genuinely NEW information source — OPEN INTEREST — rather than by a second price timeframe. This is deliberately NOT the dead dual/triple-timeframe momentum-confluence template (L38) and NOT any options short-vol structure (both of which keep dying): the differentiator is that direction is taken ONLY when price trend is CONFIRMED by concurrent open-interest expansion, i.e. new capital is entering in the direction of the move (a real trend) versus a move running purely on short-covering / long-liquidation (fake trend that reverts). The position is EXITED when open interest rolls over even if price is still drifting — OI rollover flags that the fuel behind the move is leaving, the classic exhaustion tell. It fills three under-represented buckets at once: BINANCE_CM venue (3.2% vs ≥5% target; only 69 of 2146 experiments), long-short direction (13.5% vs the over-long-only 86.5%), and it uses SUPPLEMENTARY data (strategies without supplementary data survive only 3%). Low turnover (multi-day holds) keeps fee drag minimal, and COIN-M's 0.06% RT gives a genuine fee cushion versus USD-M. Only 3 parameters to resist overfitting.

Hypotheses

The Layer-1.5 block is fixed by trading the declared BTCUSD_PERP.BINANCE_CM, but I checked what that venue actually offers before moving, and it forced two coupled changes rather than a string swap. First, the hypothesis's entire signal has no data on its own venue: metrics/BTCUSD_PERP and open_interest_hist/BTCUSD_PERP are both empty, the only COIN-M OI file (coinm_open_interest/BTCUSD_PERP/latest.parquet) holds just two snapshot rows from 2026-04-23 and 2026-05-04 and is not in the loader's SUPP_KEYS so it is never injected, and load_open_interest_series returns {} for the COIN-M leg because _OI_VENUES is {BINANCE, BINANCE_SPOT}. Simply repointing the existing metrics/open_interest reader at a COIN-M primary would have produced an empty series, a permanently flat signal and zero trades. The BTC perp open interest that does exist — and that the premise is really about — is the USD-M series, which I verified at 28,923 hourly observations from 2020-09-01 to 2026-09-04, so BTCUSDT.BINANCE is added as a signal-only extra leg and its OI is read through open_interest_by_instrument, the per-leg map attached for every leg whose venue is in _OI_VENUES. USD-M is the dominant BTC perp book, so it is the representative gauge of whether new capital is entering BTC perps; the COIN-M book would be a thin subset even if collected. Second, sizing had to change: BTCUSD_PERP is inverse, each contract a fixed $100 of notional settled in BTC, so the previous linear notional/price returned coin units and mis-sized by orders of magnitude — the documented cause of 0%-win-rate and liquidation outcomes on COIN-M. position_size now uses the base helper contracts_for_notional(), which divides the intended USD notional by the instrument's own multiplier and floors to whole contracts, with the linear path retained only as a non-inverse fallback. Everything that already passed is untouched: imports unchanged, the price/OI z-scores, the tanh confirmation weight, the three exits, the instance-method helpers that survive the Layer-2 proxy rebinding, and the gap-reset guard that stops the rolling window straddling a hole in the OI series. I also added _param_bounds mirroring the constructor clamps.

Hypotheses

L73 single-perp OI-gated directional with no robust, realized edge — not worth 2 hours of optimization. Over 123 trades in 6 years: Sharpe 0.52 with bootstrap CI [-0.287, 1.301] straddling zero, profit_factor 1.13 (well below the ~1.7 L73 threshold), PSR 0.89, and CAGR only 1.30%. The +48.5% headline is largely an artifact of an un-exited end position — end_unrealized_pct is 41.0, so realized closed-trade return over the whole 6 years is only ~7.5%. The edge lives in 2020 and 2022; the last four years are flat-to-negative (2023 +1.8%, 2024 -1.5%, 2025 -0.6%, 2026 -1.2%), so the walk-forward OOS and last-20% holdout sit in a losing regime and will fail the holdout/deflated-Sharpe gates. It clears the CM fee floor (avg_trade_return_pct 0.245%) so it is not fee-dead, and the COIN-M sizing/OI plumbing is now correct — but the OI-confirmation gate simply does not produce an edge the deflation can't strip, exactly as with the ETH/SOL OI-confirmed directionals abandoned this session. Failure pattern: no_edge single-perp OI-confirmed trend, headline mostly unrealized, recent regime negative (L73).

Implementation

Long-short directional regime strategy trading BTCUSD_PERP.BINANCE_CM (COIN-M inverse, BTC-margined, ~0.06% round-trip taker) on daily bars, where direction comes from price but conviction is gated by open interest. Each bar it computes a price z-score (position of the close within its trailing lookback distribution) and an open-interest z-score over the same window, then multiplies the price score by a smooth confirmation weight 0.5*(1+tanh(oi_z)) — near 1 when OI is expanding (new capital entering behind the move) and near 0 when OI is contracting (a squeeze running on position closure). A position is taken only when that confirmed score exceeds entry_z in either direction, and is exited when open interest rolls over by oi_exit_frac from its peak since entry (the exhaustion tell, taken even while price still drifts favourably), when the confirmed score crosses against the position, or on a fixed percentage stop. Open interest comes from the USD-M BTC perp via the per-leg open_interest_by_instrument map, since the COIN-M contract itself has no OI history; that leg is signal-only and never traded. Sizing is whole inverse contracts via contracts_for_notional, risking risk_frac of equity against the stop distance and capped at max_notional_frac of equity.

Verification Results

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

Backtest Review

Cleanly resolves the COIN-M inverse-contract sizing and routes OI from the USD-M leg correctly; clears the CM fee floor (avg_trade_return_pct 0.245% vs ~0.10%)

Backtest Review

Adequate trade count (123) and low fee/impact drag (commission 4.58% of gross)

Backtest Review

No robust edge: Sharpe 0.52 with bootstrap CI [-0.287, 1.301] straddling zero, profit_factor 1.13 (well below the ~1.7 L73 threshold), CAGR only 1.30%

Backtest Review

Headline is mostly unrealized: end_unrealized_pct 41.0 of a 48.5% total_return — realized closed-trade return over 6 years is only ~7.5%

Backtest Review

Edge concentrated in 2020/2022; the last four years are flat-to-negative (2023 +1.8, 2024 -1.5, 2025 -0.6, 2026 -1.2), so the holdout window sits in a losing regime

Backtest Review

L73 single-perp OI-gated directional family — the OI confirmation gate does not add robustness the deflation strips

Iteration History

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

Iteration History

Verification failed (Layer 4 — QA review): - Reliable negative edge: the OI-confirmed trend loses money in the sandbox even on USD-M where the OI data exists. avg_trade_return_pct -0.26% (negative, below the ~0.10% fee floor), PF 0.60, Sharpe -0.85 (CI [-2.88, 0.62]), win_rate 0.33, short_win_rate 0.24, total_return -9.2%, over 48 trades with metrics_reliable=TRUE. This is the FIRST real backtest of the mechanism (iteration 1 died at Layer 2), so it is the first evidence on whether the edge exists, and it is negative. Signal polarity/logic are correct (buy confirmed up-trends, sell confirmed down-trends, exit on OI rollover), so this is absent edge, not a bug. - Instrument/venue mismatch with the hypothesis. The hypothesis is explicitly COIN-M ('Single-Instrument BTCUSD_PERP.BINANCE_CM', inverse, ~0.06% RT) and its whole justification is filling the BINANCE_CM venue bucket + the COIN-M fee cushion + long-short. The config actually trades BTCUSDT.BINANCE (USD-M linear, ~0.10% RT). The developer documents the reason (BINANCE_CM has no reachable OI series, so the edge is untestable there) — legitimate — but the coded strategy then fills NONE of the venue/fee-cushion buckets the hypothesis was approved on, and its fee economics differ from what was assumed. Per the QA checklist an instrument/venue mismatch is a critical flag; because the COIN-M form is impossible, this is a Research Lead re-scope decision, not a silent substitution.
Strategy report

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