Skip to content

View translation

AvaxOiDeleveragingExhaustionReversal

Hypotheses

AVAX USD-M Deleveraging-Exhaustion Reversal, Long-Short (Single-Instrument BINANCE Perp, 1h Bars + Multi-Year OPEN-INTEREST Feed — Fade Moves That Run on FALLING Open Interest, i.e. Short-Covering Pops and Long-Liquidation Flushes, Reversal-Bar Confirmed, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument, mid-horizon strategy on AVAXUSDT.BINANCE (USD-M perp, 1h bars) whose edge comes from a genuine NON-PRICE feed with confirmed multi-year history: Binance open interest. The mechanism is deliberately NOT trend/momentum/mean-reversion on price alone (the 0/213 pure-OHLCV graveyard) — the trade is gated on the JOINT sign of price change and OI change over a rolling window. A move that extends while OPEN INTEREST FALLS is a hollow move: nobody is adding fresh risk, existing positions are being closed. A rally on falling OI is short-covering (no new longs to sustain it); a sell-off on falling OI is forced long-liquidation into an air-pocket. Both exhaust and revert. A move on RISING OI (fresh money) is left alone. This is a mechanically-motivated exhaustion filter, distinct from funding-carry, basis-reversion, liquidation-feed, taker-flow, and cross-sectional-basket classes that have all died this session. Single name (not a basket → no per-rebalance N-fee tax of L12). AVAX chosen over BTC (2% survival tag) for liquid-but-more-reversion-prone behavior and a reliable OI feed. 3 parameters only, to resist the overfit that killed 229 prior hypotheses.

Hypotheses

Iteration 3 makes the SMALLEST possible change to fix the reported Layer-2 failure and nothing else. The failure was `TypeError: _parse_oi_rows() takes 1 positional argument but 2 were given` across all 6 synthetic scenarios. Root cause: `_parse_oi_rows` was a `@staticmethod`, but the Layer-2 `_StrategyProxy` copies every callable off a real instance and re-binds it with `types.MethodType(func, instance)`, which forces `self` as the first positional argument — so a one-arg staticmethod receives two args and raises. Fix: drop `@staticmethod` and give it a `self` parameter (`def _parse_oi_rows(self, data)`); the body ignores `self`, and both call sites already invoke it as `self._parse_oi_rows(...)`, so it now works identically in the proxy and the real runtime. I verified the fix by replicating the exact proxy rebinding (MethodType over `_parse_oi_rows`, `_build_oi`, `_oi_at`, `calculate_signal`) and confirming `calculate_signal` runs with no TypeError and OI parses correctly. Every earlier layer had already passed, so I changed nothing else: imports are unchanged (no banned modules), the class is still a valid FactoryStrategy subclass with all four abstract methods, and the entire signal/entry/exit/sizing logic is byte-for-byte the same — this iteration only un-breaks the synthetic layer so the strategy can proceed to Layer 3. Leverage (2.0) remains wired into position_size (no leverage_set_but_unused).

Hypotheses

Decisively negative edge with near-total account destruction: profit_factor 0.735, total_return -87.26%, avg_trade_return_pct -0.106% (negative), expectancy -$89.95 over 966 trades, max_drawdown 87.70% (CI to 100%), and negative in nearly every year (2021 -15%, 2022 -50%, 2024 -47%, 2025 -26%, 2026 -27%; only 2023 +7.6% positive). The reported Sharpe 0.458 / Sortino 2.9 / PSR 0.99 are misleading artifacts of an extreme return distribution (skew 37.2, kurtosis 1487) driven by one or two outlier wins — the honest metrics are PF 0.735 and -87% total. The iteration-2 fix genuinely worked (OI now sourced from the multi-year metrics feed, so the strategy fires 966 times across the full 2021-2026 window with no data wall), which makes this a genuine strategy verdict: the deleveraging-exhaustion fade (fade moves that extend on falling open interest) simply has no edge net of costs, and the ~75% levered single-name sizing compounded the losses into an 88% drawdown. This is the same single-name OI/order-flow-gated reversion family that has died repeatedly this session (SolOI-flush -13%, taker-flow reversion liquidated, positioning fades impact-dead). Optimizing lookback/move_thresh/oi_fall_thresh cannot flip a PF-0.735, negative-expectancy, 88%-DD loser — it would only overfit the single positive 2023 window and fail the deflated-Sharpe gate. Fundamentally no edge; not worth 2 hours of optimization.

Implementation

Long-short single-instrument mid-horizon reversal on AVAXUSDT.BINANCE (USD-M perp, 1h bars) gated on the JOINT sign of price change and open-interest change over a rolling lookback window. When price extended by at least move_thresh WHILE open interest fell by at least oi_fall_thresh — a hollow, deleveraging move (short-covering pop on a rally, forced long-liquidation flush on a sell-off) — and the current bar closes against the move (reversal-bar confirmation), it FADES the move: SHORT an up-move, LONG a down-move. Moves on RISING OI (fresh money) are left alone. OI is sourced from the multi-year `metrics` feed (with the `open_interest` series as fallback), aligned to bars via a precomputed sorted array + bisect. Exits on a 2.5% stop, 3.5% take-profit, or a 6-hour time-box. Sized at 25% of equity × 2× leverage.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['lookback', 'hold_bars', 'move_thresh', 'min_notional', 'position_frac', 'stop_loss_pct', 'oi_fall_thresh', 'take_profit_pct', 'oi_max_lag_hours', 'bar_interval_seconds'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: AvaxOiDeleveragingExhaustionReversal._parse_oi_rows() takes 1 positional argument but 2 were given (bar timestamp: 1735690020000) - steady_downtrend: TypeError: AvaxOiDeleveragingExhaustionReversal._parse_oi_rows() takes 1 positional argument but 2 were given (bar timestamp: 1735690020000) - flat_ranging: TypeError: AvaxOiDeleveragingExhaustionReversal._parse_oi_rows() takes 1 positional argument but 2 were given (bar timestamp: 1735690020000) - volatility_spike: TypeError: AvaxOiDeleveragingExhaustionReversal._parse_oi_rows() takes 1 positional argument but 2 were given (bar timestamp: 1735690020000) - zero_volume: TypeError: AvaxOiDeleveragingExhaustionReversal._parse_oi_rows() takes 1 positional argument but 2 were given (bar timestamp: 1735690020000) - price_gap: TypeError: AvaxOiDeleveragingExhaustionReversal._parse_oi_rows() takes 1 positional argument but 2 were given (bar timestamp: 1735690020000)

Verification Results

Analyst should abandon/iterate on edge grounds at BACKTEST_REVIEW; do not spend optimization hours on a coin-flip signal (long win 0.451 / short 0.545).

Verification Results

Sandbox backtest shows a genuine negative edge: avg_trade_return_pct -0.060% (below the ~0.10% round-trip and 0.15% futures floor), profit_factor 0.70, total_return -18.68%, Sharpe -0.50 (CI [-2.23, +1.13]). Well-sampled (137 trades over 364 days, metrics_reliable=true) and NOT a code-defect signature (win_rate 0.489 not 0, Sharpe not |>5|, PF not 0), so this is analyst-territory no-edge, not a correctness bug.

Verification Results

If iterated, reconsider the 6h time-box vs the 1h-bar mid-horizon reversion thesis.

Verification Results

Realized reward/risk inverted vs configured stops: TP 3.5% > SL 2.5%, yet avg_win $640 < avg_loss $880 — most exits are via the 6h time-box and losers run larger than the reversion wins capture, i.e. the exhaustion reversion does not materialize within the hold horizon. Structural, not a bug.

Verification Results

Optional: reset _rev_up/_rev_down to False alongside _pc/_oc on the guard paths.

Verification Results

_rev_up/_rev_down retain stale values on short-buffer early-return paths, but should_enter also requires pc/oc non-None (reset on those same paths), so a stale flag cannot alone trigger an entry — latent, not exploitable.

Backtest Review

The iteration-2 fix worked: OI now sourced from the multi-year metrics feed, so it fires 966 times across the full window (no data wall / measurability floor issue)

Backtest Review

Genuine non-price OI dependency, well-sampled

Backtest Review

Decisively negative: profit_factor 0.735, total_return -87.26%, avg_trade_return_pct -0.106%, expectancy -$89.95/trade

Backtest Review

max_drawdown 87.70% (CI to 100%) — near-total wipeout; negative in nearly every year (2022 -50%, 2024 -47%, 2025 -26%, 2026 -27%)

Backtest Review

Reported Sharpe 0.458 / Sortino 2.9 / PSR 0.99 are artifacts of extreme skew 37 / kurtosis 1487 (a couple of outlier wins) — PF 0.735 and -87% total are the truth

Backtest Review

Same dead single-name OI/order-flow-gated reversion family (SolOI-flush -13%, taker-flow fades, positioning fades all died this session)

Outcome Summary

AvaxOiDeleveragingExhaustionReversal aimed to fade moves that ran on falling open interest, treating short-covering pops and long-liquidation flushes as exhausted, reversal-bar-confirmed reversion trades on AVAX perp. Its iteration-2 fix genuinely worked — sourcing OI from the multi-year metrics feed let it fire 966 times across the full 2021-2026 window with no data wall — but that clean, well-sampled run revealed no edge: profit factor 0.735, -87.26% total return, and an 87.70% drawdown near total wipeout. The seemingly positive Sharpe, Sortino, and PSR were dismissed as artifacts of an extreme return distribution driven by one or two outlier wins, while the ~75% levered single-name sizing compounded the losses. The analyst abandoned it before optimization, noting it was the same single-name OI/order-flow-gated reversion family that had died repeatedly this session and that tuning its three parameters would only overfit the lone positive 2023 window.

Outcome Summary

Headline Sharpe/Sortino/PSR can be inflated by a few outlier wins on a heavy-tailed return distribution — profit factor and total return exposed the truth — and ~75% levered single-name sizing turns a no-edge signal into catastrophic drawdown.

Outcome Summary

The analyst issued an 'abandon' verdict at the pre-optimization backtest-review gate, judging the negative edge and near-total 88% drawdown fundamentally unfixable; it never reached optimization, risk review, or promotion.

Outcome Summary

A long-short single-instrument reversal strategy on AVAXUSDT.BINANCE (1h perp) that faded price moves extending on FALLING open interest — short-covering pops and long-liquidation flushes — as hollow, deleveraging-driven exhaustion confirmed by a reversal bar.

Outcome Summary

Over 966 well-sampled trades it lost decisively: total return -87.26%, profit factor 0.735, avg_trade_return_pct -0.106%, expectancy -$89.95/trade, and an 87.70% max drawdown (CI to 100%), negative in nearly every year (2022 -50%, 2024 -47%); the reported Sharpe 0.458 / Sortino 2.9 / PSR 0.99 were flagged as artifacts of extreme skew (37) and kurtosis (1487) from a couple of outlier wins.

Iteration History

Verification failed (Layer 4 — QA review): - Unmeasurable trade count from an OI data-coverage wall. Only 7 trades over 364 data_days — far below the ~100-trade floor. Root cause is structural: the developer's own rationale states AVAX open_interest coverage is only ~56 days inside the 365-day window, and the strategy correctly goes FLAT when OI is unavailable (no price-only fallback), so it is blind ~85% of the sample. The resulting metrics (profit_factor 0.04, win_rate 1/7, avg_trade_return_pct -0.54%, -2.74% total) are statistically meaningless at n=7 and cannot support any promote/optimize decision.
Strategy report

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