SolOiDivergenceExhaustionReversalLS
Hypotheses
SOL USD-M Open-Interest-Divergence Exhaustion Reversal, Long-Short (Single Instrument SOLUSDT.BINANCE Perp, Daily Bars + Open-Interest Feed, Fade Price Extremes That Form on FALLING Open Interest = Positioning Unwind, Skip Extremes on Rising OI = Fresh-Money Trend, 3-Parameter)
Hypotheses
A LONG-SHORT, single-instrument contrarian strategy on SOLUSDT.BINANCE (USD-M perp, DAILY bars) whose signal is the DIVERGENCE between price and Open Interest — an orthogonal, positioning-based input the portfolio barely uses. This is NOT price-only mean-reversion (the VWAP/RSI fee_edge graveyard — the OI gate is the whole point), NOT momentum rotation (L32), NOT funding-carry (L33), NOT options (L23), and NOT liquidation-feed dependent (the liquidation feed is only ~90 days deep and killed 5 siblings; OI 'metrics' history on Binance Vision spans multiple years for liquid USD-M names, which the developer must confirm covers the backtest window). Core insight: a price making a fresh multi-week extreme while Open Interest is FALLING is a positioning UNWIND (forced/weak-hand deleveraging, short-covering) rather than fresh conviction — these moves are driven by liquidation of existing positions and tend to EXHAUST and revert once the unwind completes. Conversely, a price extreme on RISING OI is fresh money entering a genuine trend, so the strategy SKIPS it (never fights real trends — the failure mode of naive fades). Trading only the exhaustion subset makes the fade selective, keeps trade count moderate (~20-45/yr), holds for multi-day reversion moves that clear the ~0.10% USD-M round-trip by an order of magnitude, and uses only 3 parameters to resist overfitting.
Hypotheses
Implements the OI-divergence exhaustion hypothesis: a price extreme forming on FALLING OI is a deleveraging/short-covering unwind that tends to exhaust and revert, whereas an extreme on rising OI is fresh trend money and is skipped. Iteration-2 addresses the QA measurability flag (only 3 trades / 362 days, ~10x below the hypothesis's own 20-45/yr estimate). I first verified the suspected data problem is NOT present: the Binance Vision `metrics` parser emits `timestamp`(ms)+`open_interest` keys that `_build_oi` reads, supp_collector loads the FULL multi-year metrics parquet whenever the strategy references "metrics" (it does) with no date filtering, and the ms->ns conversion in `_to_ns` is correct — so multi-year OI reaches the strategy across the whole window and there is no look-ahead (daily bar ts_event = close; `_oi_at` is nearest-preceding). The 3-trade result was therefore the gate being too tight: a STRICT new-20-day-extreme AND OI-down-5%-over-20-days conjunction fires ~3/yr because fresh new highs almost never coincide with falling OI. Fix, keeping the 3 tuned params and the mandatory OI gate: (1) broaden the extreme leg from a strict breakout to a NEAR-extreme using range position pos=(close-ll)/(hh-ll) with a top/bottom band (extreme_pct=0.85) — a rolling, scale-invariant trigger (per lesson L5, use percentile/position not fixed price constants) that fires far more often; (2) lower the OI-drop threshold default 0.05->0.03. Together these lift firing toward the hypothesis's 20-45/yr so the edge becomes measurable (~100+ trades over the multi-year window), while the OI-falling requirement stays mandatory (missing OI => skip, no price-only degradation) so the strategy still tests the divergence thesis rather than the VWAP/RSI mean-reversion graveyard. Layer-3's >=1-trade pass is not at risk since loosening only adds trades.
Hypotheses
Now measurable after the iter-2 gate-loosening (49 trades vs 3), the OI-divergence exhaustion fade is confirmed to have NO edge on SOL — it is decisively negative: avg_trade_return_pct -3.84%, profit_factor 0.515, Sharpe -0.77 (CI -1.43 to -0.08, entirely negative), total_return -21.7%, probabilistic_sharpe 0.009. The trade profile is doubly adverse — win_rate 0.449 (<50%) AND inverted reward/risk (avg_win $1,006 vs avg_loss $1,592) — and the result is negative in every year except a tiny partial-2022 +0.72%, so this is a systematic wrong-direction premise, not a single-window fluke. The OI-divergence gate was the hypothesis's entire differentiator (meant to lift it out of the price-only fade graveyard); with it firing at a measurable rate the gated fade still loses money, so the positioning-unwind thesis (near-extreme + falling OI reverts) does not hold on SOL. This is the contrarian-fade class that has died repeatedly this session; optimizing lookback/oi_drop_threshold/stop_atr cannot flip a consistently negative per-trade expectancy paired with a sub-50% win rate. There is no evidence the mechanism has edge on any instrument, so abandon rather than reframe. Do not spend 2 hours optimizing.
Implementation
Long-short contrarian exhaustion-reversal on SOLUSDT.BINANCE (USD-M perp), DAILY bars, gated by price<->open-interest divergence. Fades price NEAR-extremes (top/bottom band of the prior 20-day high/low range via range-position) only when Open Interest has FALLEN >=3% over the same 20-day window (a positioning unwind); skips extremes on flat/rising OI (fresh-money trend) and skips entirely when OI data is missing (never degrades to a price-only fade). Enters SHORT at a near-high on falling OI, LONG at a near-low on falling OI; exits on reversion to the 20-day SMA, a 2.5-ATR protective stop, or a 12-day time cap. Linear USD-M sizing risks 2% of equity over the stop distance, capped at 1x equity notional (leverage 1.0). OI is read from the multi-year Binance Vision `metrics` feed (open_interest column) merged with the ~30-day API feed, nearest-preceding lookup with a staleness guard.
Verification Results
Verification failed (Layer 4 — QA review):
- MEASURABILITY / OI-DATA-COVERAGE RED FLAG. The sandbox produced only 3 trades over 362 days (metrics_reliable=FALSE, expectancy from a 3-sample set is noise). That is ~3/yr — roughly an ORDER OF MAGNITUDE below the hypothesis's own stated ~20-45/yr estimate. Extrapolated across the full multi-year backtest window this is ~12-15 trades, decisively below the ~100-trade floor needed to distinguish edge from noise. A 10x gap between the hypothesis's own firing estimate and the actual sandbox rate is not a minor miss — it points to one of two blocking problems: (a) the multi-year Binance Vision `metrics` OI feed is NOT actually reaching the strategy in the sandbox. The developer correctly notes the `open_interest` API feed is only ~30 days deep; if the sandbox injected only that feed (not `metrics`), then `_oi_at(ts_ns - 20*_DAY_NS)` returns None for ~330 of the 362 days (OI past-value missing/stale), the gate disarms via the 'missing -> skip' path, and almost nothing fires — which would exactly explain 3 trades. OR (b) the price-extreme AND OI-down-5%-over-20d conjunction is genuinely ~3/yr, i.e. the gate is too tight to ever be measurable. Both block advancement; running a full backtest + 3-phase optimization on a 3-trade signal wastes the pipeline.
- OI ratio uses oi_now/oi_past with a guard 'oi_past > 0', which is present (good). But the OI 'now' lookup uses the SAME bar timestamp as the trade decision — confirm there is no look-ahead: OI 'metrics' rows are stamped intraday, and _oi_at(ts_ns) does a nearest-preceding lookup, which is correct (uses OI at/before the daily close). Just verify the daily bar ts_event/ts_init corresponds to bar CLOSE, not bar OPEN, so the OI value read is not from the future relative to the decision point.
Verification Results
Let the full multi-year backtest (SOL OI metrics ~2021-12->present, ~4.6yr) measure the true count. At 20-45/yr that is ~92-207 trades (measurable); at the sandbox's ~11/yr only ~50 (unmeasurable). Analyst should abandon on measurability if full-window total_trades is materially below ~100. Do NOT loosen the OI gate further — it is the edge.
Verification Results
Trade-count measurability risk. Iteration 2 targeted measurability (was 3 trades/362d) by broadening the extreme leg to a near-extreme range-position band (extreme_pct=0.85) and lowering oi_drop_threshold 0.05->0.03. The sandbox still fires only 11 trades over 362 days (~11/yr), roughly half the developer's own stated ~20-45/yr target and below the ~100-trade measurability floor if that rate holds. The under-firing is structural (fresh near-highs seldom coincide with falling OI), not a bug — but the iteration-2 objective (a measurable sample) was not clearly met.
Verification Results
Route to analyst after the full-window backtest; no code change required.
Verification Results
Sandbox edge is negative (total_return -3.99%, Sharpe -0.72 CI [-2.19,+0.96] straddles zero, PF 0.59, avg_trade_return_pct -3.24%) on a thin 8-long/3-short split. This is a performance signal for the analyst, not a code defect — metrics show NO defect signatures (win_rate 0.45 not 0.0, |Sharpe|<5, PF>0), so no polarity/inverse-sizing bug.
Backtest Review
The iter-2 measurability fix worked: 49 trades (vs 3), so the result is now interpretable
Backtest Review
Clean risk engineering (1x, ATR-stop sizing) — max_drawdown a modest 25.5%, no blowup
Backtest Review
OI feed genuinely reaches the strategy (orthogonal positioning input) — the plumbing is sound
Backtest Review
avg_trade_return_pct = -3.84% — decisively NEGATIVE per-trade expectancy across 49 trades
Backtest Review
profit_factor 0.515 (<1.0), Sharpe -0.77 (CI entirely negative), total_return -21.7%, probabilistic_sharpe 0.009 — a clear net loser
Backtest Review
Doubly adverse profile: win_rate 0.449 (<50%) AND inverted reward/risk (avg_win $1,006 vs avg_loss $1,592)
Backtest Review
Negative in every year except a tiny partial-2022 +0.72% — systematic, not a single-regime fluke
Backtest Review
The OI-divergence gate — the hypothesis's entire differentiator — failed to produce an edge; the near-extreme + falling-OI 'exhaustion' set did not revert on SOL
Outcome Summary
This strategy tried to escape the price-only mean-reversion graveyard by gating a long-short fade of price extremes on the price↔open-interest divergence: fade only when a near-extreme formed on falling OI (a positioning unwind expected to exhaust and revert), and skip extremes on rising OI as real fresh-money trends. The plumbing worked — the multi-year Binance Vision OI feed reached the strategy and iteration 2's gate-loosening lifted trade count from 3 to a measurable 49 — but the edge did not: per-trade expectancy was -3.84%, profit factor 0.515, Sharpe -0.77, and the book lost in nearly every year with both a sub-50% win rate and losses larger than wins. Risk controls kept drawdown modest (25.5%) and there was no blowup, so this was a clean, decisive no-edge result rather than an execution failure. The backtest review abandoned it, concluding the positioning-unwind thesis is systematically wrong-direction on SOL and that tuning lookback/oi_drop_threshold/stop_atr cannot convert a consistently negative expectancy into a real edge.
Outcome Summary
Adding an orthogonal positioning gate (falling open interest) to a contrarian fade does not rescue it from the price-only mean-reversion graveyard — the 'exhaustion on falling OI reverts' premise was systematically wrong-direction on SOL, confirming the contrarian-fade class has no demonstrable edge here.
Outcome Summary
The backtest review abandoned it before optimization: with the OI-divergence gate — the hypothesis's entire differentiator — now firing at a measurable rate, the gated fade still lost money systematically, so the positioning-unwind thesis does not hold on SOL, and tuning the three parameters cannot flip a consistently negative expectancy paired with a sub-50% win rate.
Outcome Summary
A long-short, single-instrument contrarian strategy on SOLUSDT USD-M perp (daily bars) that faded price near-extremes only when open interest was falling — reading that as a positioning unwind likely to exhaust and revert — while skipping extremes on rising OI as genuine fresh-money trends, using the price↔OI divergence as an orthogonal, positioning-based gate.
Outcome Summary
Once iteration 2 loosened the gate to make it measurable (49 trades vs the prior 3), the edge was decisively negative: avg per-trade return -3.84%, profit factor 0.515, Sharpe -0.77 (CI entirely negative), total return -21.7%, probabilistic Sharpe 0.009. The profile was doubly adverse — a sub-50% win rate (0.449) paired with inverted reward/risk (avg win $1,006 vs avg loss $1,592) — and losing in every year except a tiny partial-2022 +0.72%; risk engineering held (max drawdown 25.5%, no blowup).
Backtest and paper results are hypothetical. Trading involves risk of loss.