SolOpenInterestFlushReversalLS
Hypotheses
SOL Open-Interest Flush Reversal, Long-Short (Single-Instrument BINANCE USD-M Perp, 1h Bars, Fade the Exhausted Move After a Rapid Deleveraging Flush — Detect Forced Selling via OPEN-INTEREST COLLAPSE Instead of the Data-Walled Liquidations Feed, ATR-Targeted, 3-Parameter)
Hypotheses
A LONG-SHORT, single-instrument mean-reversion on SOLUSDT.BINANCE (USD-M perp, 1h bars) that trades the well-documented post-capitulation bounce — but detects the forced-selling event through OPEN-INTEREST CHANGE rather than the raw liquidations feed. This is the key differentiation: four liquidation-cascade-reversal siblings were abandoned this session on structural data insufficiency (the Binance liquidations table is live-accrued to only ~90 days), whereas open-interest history is available multi-year via Binance Vision metrics CSVs — so the same blessed mechanism becomes backtestable. Thesis: a rapid OI DROP concurrent with a sharp price move is the signature of a leverage flush (mass liquidation / forced position-closing), which is self-exhausting — once the trapped side is flushed, price snaps back. Mechanism per 1h bar: (1) compute OI change over the last M hours (default M=4) as a percentage of prior OI; (2) compute the concurrent price move in ATR units; (3) if OI has FALLEN ≥ oi_drop_thresh (default 5% over 4h) AND price moved sharply (≥ move_thresh, default 1.5×ATR) in the SAME window, fade the exhausted move — go LONG if price fell (longs flushed / down-cascade), go SHORT if price spiked up (shorts squeezed / up-flush). This is deliberately DIFFERENT from everything dying this session: NOT trend-following (the 209-death single-regime graveyard — it is contrarian and regime-distributed), NOT the liquidations-FEED family (uses OI, which does not data-wall), NOT a basket (single-instrument, 2 fills/round-trip, sidesteps the L12 fee wall), NOT options (no trade-count wall), NOT low-frequency daily (1h with dozens of flush events/year clears the ~1-year sandbox trade-count wall that just killed the daily 200-SMA strategies), and NOT taker-flow/L-S-ratio (already pending). It targets a high-volatility name so post-flush bounces (1–2%) clear the ~0.10% round-trip with margin, and uses 3 low parameters to resist overfit.
Hypotheses
Iteration 2, single minimal change: should_enter is restored to the SYMMETRIC long-short fade the hypothesis specifies. The previous revision had been flipped to SHORT-ONLY (shorting both the down-cascade and the up-spike) purely on a QA directional read of 41 unoptimized smoke-test trades. The pipeline has now retracted those QA performance verdicts as invalid (QA judges correctness only), and 41 trades is far too small a sample to reject one leg of a symmetric mechanism -- worse, the short-only variant turned half the entries into a trend-CONTINUATION trade the hypothesis never proposed and made the strategy not long-short at all, conflicting with the declared hypothesis. Directionality is now left to the full backtest and optimizer. Everything that already passed Layers 1-3 is untouched: same imports, class, OI-source builder (metrics + open_interest fallback, deduped, O(log n) bisect, point-in-time only -- no abs() timestamp matching), same continuous ATR-unit signal returned every bar, same ATR-targeted exits, same capital-relative sizing (50% of equity notional, leverage 1.0, min-notional guard). Also added the required _param_bounds declaration for oi_lookback_hours, whose [1, 48] clamp the code enforces, so the optimizer does not search values the code silently rewrites. Venue stays BINANCE USD-M because the strategy takes short entries.
Hypotheses
Negative expectancy on the available sample: profit_factor 0.899, total_return -1.02%, Sharpe -0.97, expectancy -$28.7/trade over 34 trades, and avg_trade_return_pct 0.10% sits below the 0.15% Binance USD-M fee floor. The symmetric OI-flush fade loses on both legs (long_win_rate 0.43, short_win_rate 0.50, avg_win ~ avg_loss), so there is no positive gross edge for tighter thresholds to rescue. QA's concern that the coded defaults (2%/0.8-ATR) are looser than the hypothesis (5%/1.5-ATR) is noted, but tightening only shrinks an already-thin 34-trade / 136-day sample toward fewer trades — it cannot invert a near-coinflip, sub-floor mechanism (L55: threshold retuning has never lifted a single-name fade over fees; L73: single-perp OI-gated directional with PF far under 1.7). Not worth 2 hours of optimization.
Implementation
Long-short mean reversion on SOLUSDT.BINANCE USD-M perp, 1h bars. Detects a leverage flush via OPEN-INTEREST COLLAPSE (multi-year Binance Vision metrics, not the ~90-day-walled liquidations feed): each bar it computes oi_drop = -(OI_now - OI_{M h ago})/OI_{M h ago} using strictly point-in-time OI lookups (bisect, last observation at or before the bar timestamp, 6h staleness tolerance) and move_atr = signed M-hour price change in ATR(14) units. When OI has fallen at least oi_drop_thresh (2% over 4h) AND the concurrent move is sharp (>= 0.8 ATR), it fades the exhausted move: BUY after a sharp drop (longs flushed), SELL after a sharp spike (shorts squeezed). Exits are ATR-targeted -- 1.5 ATR take-profit, 1.5 ATR stop, or a 12-bar (~12h) time cap. Single instrument, 2 fills per round trip; only three tunables (oi_lookback_hours, oi_drop_thresh, move_thresh). If OI data is missing the strategy stays flat -- there is no price-only fallback edge.
Verification Results
CLEAN RESTART 2026-09-04 — this run's verdict history and learning records were removed and it was restarted from verification. Its previous abandonment came from the pipeline, not from the market: the Layer-2 harness mis-bound @staticmethod helpers (fixed), QA issued terminal performance verdicts on an unoptimized smoke test (removed — QA now judges correctness only), and sandbox timeouts came from backtest-slot starvation (fixed). The hypothesis and the strategy code are unchanged. Verify the code on its merits; performance is decided later by the full backtest and the optimizer.
Verification Results
Let the optimizer search oi_drop_thresh and move_thresh toward the hypothesis-stated magnitudes; consider centering the default draw closer to 0.05 / 1.5 ATR so the entry gate reflects genuine flush events.
Verification Results
Default oi_drop_thresh (0.02) and move_thresh (0.8) are looser than the hypothesis's stated defaults (5% OI drop, 1.5x ATR). The mechanism/structure matches (OI-drop gate + ATR-move gate + symmetric fade), so this is not a mismatch, but the looser defaults let the strategy fire on marginal moves that are not true leverage flushes, which likely explains the sub-fee-floor per-trade return in the smoke test.
Verification Results
Sandbox is net-negative (total_return -18%, Sharpe -0.40, PF 0.905, avg_trade_return_pct 0.055% — below the 0.15% futures fee floor) over 345 unoptimized trades. This is a smoke test, not a verdict on edge, but two structural notes for the analyst: (1) the code's DEFAULT thresholds (oi_drop_thresh 0.02 = 2%/4h, move_thresh 0.8 ATR) are looser than the hypothesis's stated defaults (5% OI drop, 1.5 ATR) — looser gates admit marginal, non-flush events whose post-move snapback may not clear the ~0.10% round-trip; the optimizer should be allowed to push these up. (2) win_rate ~0.50 with avg_loss (1113) > avg_win (990) means the symmetric fade currently has negative expectancy net of fees. Verify at full history whether tightening oi_drop_thresh/move_thresh toward the hypothesis values restores per-trade return above the fee floor before optimizing.
Backtest Review
Genuinely differentiated mechanism vs the dying siblings: uses multi-year OI-collapse detection (Binance Vision metrics) instead of the ~90-day-walled liquidations feed, so it is at least backtestable; single-instrument (2 fills/round-trip) sidesteps the basket fee wall; contrarian/regime-distributed (regime_spread 4.18, not single-regime).
Backtest Review
Only 3 tunables and clean point-in-time OI lookups (bisect, staleness tolerance) — no look-ahead red flags in the code.
Backtest Review
Negative expectancy on the available sample: profit_factor 0.899, total_return -1.02%, Sharpe -0.97 (CI [-4.06, 2.19] straddles zero), sortino -1.02, expectancy -$28.7/trade.
Backtest Review
avg_trade_return_pct 0.10% is below the 0.15% Binance USD-M fee floor — the post-flush snapback does not clear the ~0.10% round-trip; commission is 19.7% of gross.
Backtest Review
The symmetric fade has no directional edge in either leg: long_win_rate 0.43 (14 trades), short_win_rate 0.50 (20 trades), avg_win 542 ~ avg_loss 536 — a near-coinflip with slightly adverse payoff.
Backtest Review
Backtest window is only 136 days / 34 trades despite the hypothesis's core selling point of multi-year OI history — a thin, single-year sample, and it is already net-negative.
Backtest Review
Matches multiple abandon-class priors: single-perp supplementary(OI)-gated directional with PF well under ~1.7 (L73), single-name fade/reversion with PF < 1.15 and negative total_return (L55), and per-trade return below the fee floor (L22).
Analysis
Backtest gate:
- metrics unreliable: 1043 trades / 1582 data days is too little evidence (need >=5 trades over >=10 days) — increase signal frequency or widen the window
Iteration History
Verification failed (Layer 3 — sandbox backtest): No trades produced
Bar type used: SOLUSDT.BINANCE-1-HOUR-LAST-EXTERNAL, Bars processed: 8727
Diagnostics: should_enter() returned a side 0 times over 8708 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds.
Ensure your strategy produces trades with the given data and parameters.
Iteration History
Verification failed (Layer 4 — QA review):
- The edge is negative and below fees. On 41 trades (metrics_reliable=true) avg_trade_return_pct is -0.199% -- negative and below the 0.15% futures floor and the ~0.10% round-trip cost -- with profit_factor 0.684, total_return -7.12%, win_rate 0.439 (loses more often than not), and an inverted reward/risk (avg_loss $980 > avg_win $857) despite symmetric 1.5-ATR TP/stop. The directional split is diagnostic: long_win_rate 0.37 (fading down-cascades) vs short_win_rate 0.57 -- fading the down-flush loses badly because on SOL an OI-collapse + sharp drop is frequently CONTINUATION (forced deleveraging that precedes further downside), not the self-exhausting bounce the thesis assumes. The 'fade the exhausted move after an OI flush' edge is not confirmed on this instrument/window.
- Trade count is still below the measurability floor. 41 trades over 363 days (~41/yr) remains under the ~100-trade threshold needed to distinguish edge from noise (L16), and Sharpe CI [-2.46, +0.71] still spans zero (skew -1.55 / kurtosis 22.3 show fat-tail dependence). The negative point estimate leans real (PF well below 1), but 41 trades cannot conclusively establish it -- and because the measurable edge is negative, loosening the gate to reach 100 trades would keep or worsen it rather than reveal hidden alpha.
Iteration History
Verification failed (Layer 4 — QA review):
- Now measurable (123 trades), the edge is confirmed negative. avg_trade_return_pct -0.068% (below fees), profit_factor 0.788, total_return -13.31%, Sharpe -1.30 (CI [-2.74, +0.34]), max_drawdown 24.65%. The iter-3 short-continuation bet won only short_win_rate 0.512 -- NOT the ~0.63 the reorientation predicted. Across all three orientations the OI-flush signal shows no fee-clearing directional edge on SOL: iter-2 symmetric fade -0.199%, iter-3 short-both -0.068% -- both negative. With 123 trades this is a decisive result, not noise: the mechanism has no exploitable edge.
- The iter-3 reorientation rests on a statistical fallacy. The developer inferred that because iter-2's long_win_rate was 0.37, the OPPOSITE (SHORT) trade would win ~0.63. That inference is invalid under TP/stop exits: opposite-side trades do NOT have complementary win rates (win_A != 1 - win_B) because each side has its own ATR stop (a trade can lose on both sides) and the winning/losing price paths differ by direction. Empirically the flipped short won 0.512, not 0.63, so the premise of the whole iteration was wrong. This is why the 'data-driven' flip did not produce the predicted positive edge.
- The strategy is now SHORT-ONLY (long_trades 0 / short_trades 123, benchmark_correlation -0.30, max_drawdown 24.65%), which contradicts the hypothesis's stated 'contrarian and regime-distributed, LONG-SHORT' design. A one-directional short book on a high-volatility major is single-regime-dependent and exposed to being run over in bull regimes; the sandbox already shows a 24.65% drawdown. The developer's own rationale flags this regime risk.
Backtest and paper results are hypothetical. Trading involves risk of loss.