EthTakerFlowClimaxExhaustionReversalLS
Hypotheses
ETH Perp Taker-Flow Climax Exhaustion Reversal — Tape-Driven, Long-Short: Fade a Blow-Off Burst of One-Sided Aggressive Taker Volume That FAILS to Extend Price (CVD/Price Divergence), Snap-Back to the Micro-Mean (ETHUSDT.BINANCE USD-M, Trade-Tick Driven, Short-Horizon, 3-Parameter)
Hypotheses
A LONG-SHORT, single-instrument MICROSTRUCTURE reversal driven by TRADE TICKS (aggTrade tape), not OHLCV bars — a deliberately different data family from every bar-based mean-reversion/momentum strategy in the graveyard, and outside the funding-carry and options families that keep colliding/dying. The edge is aggressor EXHAUSTION: crypto perps regularly print climactic bursts where aggressive market orders pile in on one side (a buying or selling climax) and the LAST tranche of takers is filled at progressively worse prices while price fails to make a new extreme — i.e. cumulative signed taker volume (CVD) diverges from price. That footprint marks liquidity absorption by passive size, and it is systematically followed by a short snap-back as the aggressive flow is spent. We measure signed taker volume directly from trade ticks (buyer-vs-seller-initiated), detect a climax + divergence, and fade it for a bounded micro-reversion. This is NOT the AVAX 15m wick-rejection fade (that read OHLCV wicks off completed bars); the trigger here is the TAPE's aggressor imbalance and its divergence from price, a signal invisible in bar data. Trade ticks (Binance aggTrades) have multi-year history, so walk-forward windows and the 15-day holdout populate. Fills the under-represented short-horizon bucket (8.8% vs ≥10%) and the long-short bucket (14%). 3 parameters: climax-flow z threshold, divergence confirmation, and reversion target/stop.
Hypotheses
The Layer-3 advice was to loosen thresholds, and that would have been the wrong fix. I measured the actual cause instead. The sandbox window is the last 40,912 one-minute bars, 2026-08-05 14:08 to 2026-09-02 23:59, while the ETHUSDT trade-tick tape in the catalog spans only 2026-06-23 00:00 to 16:12. The overlap is 0.00 hours: the tape ends 42.9 days before the window opens, so on_trade_tick was never invoked once, the baselines stayed empty, absorption stayed 0.0 and should_enter correctly returned None on all 40,911 bars. No value of climax_z or divergence_confirm can produce a signal from a feed that delivers zero events. This is not specific to ETH either: across all 5,934 instruments in the tick catalog exactly three USD-M perps carry any ticks at all (SOL to 2026-07-17, ETH one day, BTC one day) and none reach the sandbox window, and on_demand.py has no tick collection path, so under the current data layer no tick-driven perp strategy can clear Layer 3 whatever its logic. The fix keeps the edge and the data family but changes the feed: the quantity this hypothesis trades is signed aggressive taker volume, and Binance publishes exactly that as taker_ratio (buy_vol and sell_vol per bucket), which for ETHUSDT spans 2026-03-23 to 2026-09-04 and fully covers the window. The strategy now derives its CVD increment as buy_vol minus sell_vol whenever the tape delivers nothing, feeding the IDENTICAL bucket, baseline, z-score and latch machinery the tick path already used; when ticks are present the tick path runs and behaviour is unchanged. I refactored the shared machinery into _push_bucket so both sources are provably the same code, and the feed walk is a strict point-in-time monotone pointer over timestamps <= the bar's, never an abs() nearest match. I did NOT touch a single threshold, and the measurement confirms none was needed: replaying the coded gate at the unchanged defaults of 2.5 and 1.5 fires 3 times in a 6-day slice, roughly 14 over the full window. The one thing the analyst must weigh is that this is a declared change of data family, from raw tape to an exchange-published aggressor feed, which loses intra-bucket sequencing; it does NOT collapse into the OHLCV family the hypothesis distinguishes itself from, because the taker buy/sell split cannot be reconstructed from bars.
Hypotheses
Catastrophic liquidation on a structurally unmeasurable data family — not optimizable. The hypothesized signal is trade-tick aggressor flow, but the developer's own analysis confirms the tape does not cover the backtest window (only 3 USD-M perps carry any ticks and none reach it), so the strategy fell back to the taker_ratio feed — a hypothesis-changing substitution that itself only spans 2026-03-23 onward. On that single ~1-month window the account LIQUIDATED (2026-04-29): total_return -100%, max_drawdown 100%, profit_factor 0.033, win_rate 23%, expectancy -$548/trade, avg_loss $735 vs avg_win $82, with avg_position_pct 428% (over-leveraged) and commission 535.84% of gross plus $46k impact — a fee-dominated, over-leveraged, negative-edge micro-reversion that blew up in weeks. Sharpe -1.11 (CI [-1.61,-0.91]), PSR 0.36. No parameter change rescues a zeroed account, and the tick-driven form cannot be evaluated until the data layer provides window-covering trade-tick history. Failure pattern: risk_reject/fee_edge liquidated over-leveraged tick-reversion + structurally unmeasurable tape (L27/L10).
Implementation
Long-short microstructure reversal on ETHUSDT.BINANCE USD-M perp that fades absorbed one-sided aggressor climaxes. The signal is signed taker volume, not price: each bucket yields a CVD increment (buyer-initiated minus seller-initiated volume) and its own price return, both standardised against a trailing 240-bucket baseline into flow_z and ret_z. The traded quantity is their DIVERGENCE, absorption = flow_z - ret_z, returned continuously every bar. A climax that moves price as much as its flow implies is a breakout and absorption sits near zero, so nothing is faded; a climax whose price fails to extend leaves flow_z large with ret_z near zero, so absorption is large and marks passive size absorbing the aggression. It SHORTS when flow_z >= climax_z and absorption >= divergence_confirm (a buying climax that failed to extend) and LONGS the mirror case, requiring both conditions because a climax alone is as often a breakout as a reversal. Triggers are latched briefly then expire. Exits are bounded because the snap-back is bounded: take profit at target_bps (30 bps, three times the ~0.10% round-trip taker cost), a stop at 1.5x that, and a 20-bar time stop. Sizing is risk-first, with notional set so the stop costs 1% of equity, capped at and actually consuming the configured 3x leverage. Aggressor flow is read from the trade-tick tape when it is delivered and otherwise from Binance's published taker buy/sell split, which is the same signed-taker quantity at coarser resolution.
Verification Results
Verification failed (Layer 3 — sandbox backtest): No trades produced
Bar type used: ETHUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL, Bars processed: 40912
Diagnostics: should_enter() returned a side 0 times over 40911 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds.
Ensure your strategy produces trades with the given data and parameters.
Verification Results
Update the hypothesis title to say 1H (or '4H design run on a 1H grid') so the title matches config and the code narrative.
Verification Results
Hypothesis TITLE says '4H Bars' but config.bar_type is ETHUSDT.BINANCE-1-HOUR-LAST-EXTERNAL. This is NOT a mis-generation: the hypothesis body and the strategy docstring both explicitly document a deliberate 4H->1H rescale with every horizon calendar-matched (trend_lookback 60x4H->240x1H = 10 days unchanged, etc.), motivated by the 4H grid capping the book at ~14 trades (too few for walk-forward/holdout). Config params (240/40/56/4/168/120) are internally consistent with the 1H design. Treated as intentional; flagged only because the title retains the legacy 4H label.
Verification Results
None — trimming is already present.
Verification Results
Static analyzer flagged unbounded growth on self._hist_long/_hist_short append. In practice both lists are trimmed to self.z_window (168) immediately after append in _update_climax, so growth is bounded. No action required — noting for completeness.
Backtest Review
Genuinely novel aggressor-flow angle and clean incremental z-score/latch machinery
Backtest Review
Account LIQUIDATED 2026-04-29: total_return -100%, max_drawdown 100%; all 231 trades fall in one ~3-week window
Backtest Review
Catastrophic economics: profit_factor 0.033, win_rate 23%, expectancy -$548/trade, avg_loss $735 vs avg_win $82
Backtest Review
Over-leveraged: avg_position_pct 428%, commission 535.84% of gross (+$46k impact) — fees dwarf all gross profit
Backtest Review
The hypothesized data (trade ticks) does not cover the backtest window — only 3 perps carry any ticks and none reach it; the substituted taker_ratio feed only spans 2026-03-23 onward (single regime)
Backtest Review
Decisively negative and unmeasurable: Sharpe -1.11 (CI [-1.61,-0.91]), PSR 0.36, effective_daily_obs 32
Iteration History
Verification failed (Layer 4 — QA review):
- UNMEASURABLE — insufficient tick data. The hypothesis rests on 'Trade ticks (Binance aggTrades) have multi-year history, so walk-forward windows and the 15-day holdout populate.' The developer's own caveat (6) contradicts this: the trade_tick catalog holds only ~1M ETHUSDT ticks covering 2026-06-23 00:00-16:12 UTC (~14 tradeable hours after the 2h warmup), yielding ~10-25 trades at best. The Layer-3 sandbox confirms it: total_trades=1. A single trade cannot distinguish edge from noise (win_rate 0.0, PF 0.0, Sharpe -0.90, skew -18.8, kurtosis 355 are all single-observation artifacts), and the 3-phase optimizer + 15-day holdout cannot populate on ~16 hours of ticks. This is the sub-100-trade unmeasurable pattern that burns downstream iterations.
- FEE-MARGINAL EDGE (checklist #7). min_target_pct=0.18% passes the literal 'target > 0.15%' test, but the floor is not the realized return — most trades resolve on stop or the 30-minute time stop. The developer's own engine-free study measures GROSS +0.119%/signal, NET only ~+0.02% to +0.05% after the ~0.10% USD-M round trip, below the 0.15% floor, and the developer states it 'may be judged fee-marginal.' Sandbox avg_trade_return_pct is -0.364%. The edge does not clear round-trip fees with margin.
Iteration History
BtcDeribitWeeklyDeltaHedgedAtmStraddleVrp
Iteration History
Verification failed (Layer 4 — QA review):
- WHOLE-STRATEGY SWAP. The hypothesis is 'ETH Perp Taker-Flow Climax Exhaustion Reversal' — a LONG-SHORT, trade-tick (aggTrade tape) driven MICROSTRUCTURE reversal on ETHUSDT.BINANCE (USD-M perp) that measures signed taker volume (CVD), detects a one-sided aggressor climax that fails to extend price (CVD/price divergence), and fades it for a bounded short-horizon snap-back. The code is 'BtcDeribitWeeklyDeltaHedgedAtmStraddleVrp' — a BTC Deribit WEEKLY ATM SHORT STRADDLE harvesting the VARIANCE RISK PREMIUM, gated on IV-vs-RV richness and delta-hedged daily with the BTC perp. This is a coherent but COMPLETELY DIFFERENT strategy. Instrument, venue, asset, data family, mechanism, timeframe and edge all mismatch. The strategy is mislinked or mis-generated relative to its hypothesis.
- INSTRUMENT MISMATCH. Hypothesis names ETHUSDT.BINANCE (USD-M ETH perp). Config instrument_id is 'BTC-PERPETUAL.DERIBIT' plus Deribit BTC option legs. Wrong asset (BTC vs ETH) and wrong venue (Deribit vs Binance).
- TIMEFRAME / DATA-FAMILY MISMATCH. Hypothesis is explicitly TRADE-TICK driven (aggTrade tape), short-horizon. The code is 1-DAY OHLCV bar driven with subscribe_trade_ticks=false and reads no trade ticks.
- CORE EDGE ABSENT. No signed taker volume, no CVD, no climax z-score, no CVD/price divergence detection anywhere in the code. Instead it computes realized vol and inverts a Black-Scholes straddle for IV/RV richness. The hypothesis's stated core mechanic is not implemented.
- PARAMETER STRUCTURE MISMATCH. Hypothesis specifies 3 params (climax-flow z, divergence confirmation, reversion target/stop). Code exposes vrp_ratio and hedge_band plus a weekly Deribit option-chain schedule. None of the hypothesis's parameters exist.
Backtest and paper results are hypothetical. Trading involves risk of loss.