EthLiquidationCascadeExhaustionReversalLS
Hypotheses
ETH Perp 15m Liquidation-Cascade Exhaustion Reversal (Single-Instrument USD-M, Long-Short, Liquidations as Event Signal)
Hypotheses
A long-SHORT, SINGLE-INSTRUMENT, single-venue, EVENT-DRIVEN reversal strategy on ETHUSDT.BINANCE USD-M perpetual futures using 15-MINUTE bars, where aggregated liquidation volume (supplementary data) is the trigger and price action is the P&L (fully credited by the engine — liquidations are used purely as a signal, never as a cash flow). The thesis is forced-deleveraging overshoot: when a liquidation cascade fires (a cluster of forced position closures far above the recent baseline), price mechanically overshoots beyond fair value because liquidations are market orders that must fill regardless of price, then snaps back sharply once the forced flow exhausts. The strategy waits for the cascade to PEAK and begin DECAYING (intensity rolling over) plus a price-reversal confirmation bar, then enters counter to the cascade direction to capture the V-snap. This deliberately avoids every recurring failure mode this session: NOT BINANCE_SPOT (CASH metric bug), NOT BINANCE_CM (not backtestable), NOT cross-venue/Hyperliquid (basis artifact), NOT a multi-instrument pair (extra-leg feed not delivered to optimizers), NOT funding-carry (no uncreditable cash flow), NOT trend-following (already over-represented and overfit-prone), and critically NOT generic buy-the-dip MR — it is gated on a specific microstructure capitulation event (liquidation spike + exhaustion), not on any price dip. It fills the long-short direction quota (only 14.4% vs heavy 85.6% long-only) AND the under-represented short-horizon bucket (2.3% vs 10% target), on the clean single-instrument USD-M OHLCV path. Kept low-parameter to resist overfitting.
Hypotheses
Iteration 2 fix (Layer 2 synthetic scenarios): the only failure was a TypeError — `_to_ns` was decorated `@staticmethod` but the verifier's strategy proxy re-dispatched it in a way that injected `self`, giving '2 positional arguments'. The minimal, targeted change converts `_to_ns` from a static method (`@staticmethod def _to_ns(v)`) to a plain instance method (`def _to_ns(self, v)`); it was only ever called as `self._to_ns(...)`, so behavior is identical under the real engine while removing the descriptor that the proxy broke. All earlier-passing layers (Layer 1 static, imports, structure) and the entire exhaustion/reversal signal logic are left untouched, so no passing check regresses.
Hypotheses
Not worth optimizing: despite 227k bars spanning 2019–2026, the strategy produced only 20 trades and every return falls in a single Apr–Jun 2026 window (data_days 9, exposure 2.35%). The strategy enters only when supplementary_data['liquidations'] is present and funding_events_available is just 10, indicating the liquidation supplementary data covers only a recent window rather than the full history — so the hypothesis was effectively tested on ~9 days, an uninformative sample far too small for a 3-window walk-forward (OOS windows would be near-empty and fit noise). In the window it did trade, the net edge is strongly negative (profit_factor 0.35, expectancy -$64/trade, avg_win $77 vs avg_loss $179, Sharpe -13.8, metrics_reliable=false), and commission_pct_of_gross is 67.98% — fees consume two-thirds of gross, the structural fee trap for a 15m event-reversal (~1h49m holds, 0.8% TP) against ~0.10% RT taker cost. The binding constraint is sparse historical liquidation data, which is a data-coverage problem for the data engineer, not a developer parameter iteration, and the frequency/fee structure is a fundamental headwind regardless. FAILURE PATTERN: an event-gated strategy that (correctly) refuses to trade without its supplementary signal is only testable where that supplementary data exists; when liquidation history covers only a recent window, a huge bars_processed count masks a ~9-day effective sample, and a 15m reversal at that cadence is fee-dominated (68% of gross) with a negative net edge. Optimization cannot create trades the data doesn't support, nor overcome per-trade costs larger than the captured V-snap.
Implementation
ETHUSDT.BINANCE USD-M perpetual, 15-minute bars, single-instrument long-short reversal. Aggregated liquidation volume (supplementary 'liquidations' data) is used purely as an event signal. The strategy detects a liquidation cascade, waits for its intensity to PEAK and begin DECAYING (rolling over below decay_frac*peak), requires the trailing price move to agree with the cascade direction, and requires a price-reversal confirmation bar, then enters COUNTER to the cascade to capture the V-snap. Exits on take-profit, a hard ATR volatility stop, or a max-holding time stop. No price-only fallback when liquidation data is absent.
Verification Results
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['atr_period', 'decay_frac', 'min_notional', 'atr_stop_mult', 'cascade_mag_cap', 'take_profit_pct', 'max_holding_bars', 'max_position_pct', 'base_position_pct', 'exhaustion_window', 'fallback_stop_pct', 'cascade_usd_threshold']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: EthLiquidationCascadeExhaustionReversalLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000)
- steady_downtrend: TypeError: EthLiquidationCascadeExhaustionReversalLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000)
- flat_ranging: TypeError: EthLiquidationCascadeExhaustionReversalLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000)
- volatility_spike: TypeError: EthLiquidationCascadeExhaustionReversalLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000)
- zero_volume: TypeError: EthLiquidationCascadeExhaustionReversalLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000)
- price_gap: TypeError: EthLiquidationCascadeExhaustionReversalLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000)
Backtest Review
Genuinely differentiated and well-scoped: single-instrument USD-M long-short, event-gated on a specific microstructure signal (liquidation cascade + exhaustion), low parameter count, fills the under-represented long-short and short-horizon buckets
Backtest Review
Correct data hygiene — liquidations used purely as a signal with no price-only fallback (no cash-flow artifact), and a clean single-instrument OHLCV path
Backtest Review
Only 20 trades over a nominal 6.5-year span, ALL clustered in Apr–Jun 2026 (data_days 9, exposure 2.35%) — the liquidation supplementary data appears to cover only a recent window, so the hypothesis was effectively tested on ~9 days, not the full history; far too small a sample to optimize
Backtest Review
Strongly negative net edge in the window it did trade: profit_factor 0.35, expectancy -$64/trade, avg_win $77 vs avg_loss $179, Sharpe -13.8 (metrics_reliable=false)
Backtest Review
Fees dominate: commission_pct_of_gross 67.98% — a structural fee trap for a 15m reversal (~1h49m holds) against ~0.10% RT taker cost that no parameter sweep can remove
Backtest Review
The binding limitation (sparse historical liquidation data) is a data-coverage issue, not a developer parameter fix; optimization cannot manufacture trades the data doesn't support
Outcome Summary
EthLiquidationCascadeExhaustionReversalLS was a genuinely differentiated, well-scoped idea — a low-parameter, single-instrument long-short reversal that used liquidation cascades purely as an event signal (no cash-flow artifact, no price-only fallback) and deliberately filled the under-represented long-short and short-horizon quotas. Its data hygiene was clean, but the backtest exposed a fatal coverage gap: although 227k 15m bars spanned 2019–2026, the liquidation history only covered a recent window, so all 20 trades bunched into Apr–Jun 2026 and lost money (profit factor 0.35, Sharpe -13.8) with commissions eating 68% of gross. The reviewer abandoned it at the backtest-review gate after two iterations, judging the sparse liquidation data a data-engineering coverage problem and the 15m fee load a fundamental headwind — neither of which optimization could remedy, since it cannot manufacture trades the data doesn't support.
Outcome Summary
An event-gated strategy that correctly refuses to trade without its supplementary signal is only testable where that data exists; sparse historical liquidation coverage makes a huge bars-processed count mask a ~9-day effective sample, and a 15-minute event-reversal at ~2h holds is fee-dominated against ~0.10% round-trip taker cost regardless of parameters.
Outcome Summary
It was abandoned at the pre-optimization backtest-review gate because the binding limitation was data coverage, not tunable parameters: the liquidation supplementary data appears to cover only a recent ~9-day window, so despite 227k bars processed the hypothesis was effectively tested on ~9 days — far too small to optimize — while the 15m reversal cadence was a structural fee trap (68% of gross) with a strongly negative net edge that no sweep could fix.
Outcome Summary
A single-instrument, single-venue, long-short event-driven reversal on ETHUSDT USD-M perpetual 15-minute bars that used aggregated liquidation volume purely as a trigger: it waited for a forced-deleveraging cascade to peak and begin decaying (intensity rolling over), plus a price-reversal confirmation bar, then entered counter to the cascade to capture the mechanical V-snap.
Outcome Summary
It lost money over a tiny, unreliable sample: total return -1.27, Sharpe -13.8 (metrics_reliable=false), profit factor 0.35 and expectancy -$64/trade (avg win $77 vs avg loss $179) across only 20 trades (9 long, 11 short, 45% win rate). Crucially, commissions consumed 67.98% of gross and every trade clustered in a single Apr–Jun 2026 window (data_days 9, exposure 2.35%).
Backtest and paper results are hypothetical. Trading involves risk of loss.