Skip to content

View original

ETHTakerFlowExhaustionIntradayReversionLS

Hypotheses

ETH USD-M Taker-Flow Exhaustion Intraday Mean-Reversion, Long-Short (Single-Instrument BINANCE Perp, 15m Bars, Fade Price Thrusts Backed by EXTREME Aggressive Taker Flow, Range-Regime Gated, ATR-Stopped, Low-Parameter)

Hypotheses

A LONG-SHORT, SINGLE-INSTRUMENT, crypto-native MICROSTRUCTURE mean-reversion strategy on ETHUSDT.BINANCE (USD-M perpetual, 15-MINUTE bars). It is deliberately ORTHOGONAL to the factory's one validated edge (multi-day trend/momentum on majors): rather than riding directional persistence, it fades short-lived INTRADAY over-extensions that are driven by a climax of aggressive market-order (taker) flow — i.e. capitulation/FOMO bursts that exhaust and snap back within an hour or two. The differentiator vs the abandoned multi-day cross-sectional reversal (which fails because majors TREND at the 3-day horizon) is the HORIZON and the CONFIRMATION: at the 15-minute scale crypto majors over-react to taker-driven liquidation/stop-run bursts and mean-revert, and the entry is gated on an EXTREME in the taker buy/sell ratio (a real, backtestable Binance-USD-M supplementary feed) so the strategy only fades thrusts that are flow-exhaustion, not informed accumulation. It is SINGLE-VENUE, SINGLE-INSTRUMENT (no cross-venue fee/basis trap, no cross-account equity-aggregation artifact, no multi-instrument rotation accounting bug — all explicit prior failure modes), uses ETH (a deep-liquidity major, far less single-name news-gap-fragile than the XRP-style alts that blew up on daily bars), and runs on 15m bars so the ATR stop acts intrabar rather than only at daily close. Taker flow is used as a SIGNAL ONLY (not as a PnL/carry source), so none of the funding-accrual/crediting limitations apply. Low parameter count to resist the overfitting that recurs in the factory.

Hypotheses

Iteration-2 fix for the Layer-3 'no trades produced' failure. Root cause: `_build_taker_arrays` read the documented camelCase keys (`timestamp`/`buySellRatio`/`buyVol`/`sellVol`), but the backtest injects `taker_ratio` rows straight from the parquet via `df.to_dict('records')`, so the real keys are `timestamp_ms`/`buy_sell_ratio`/`buy_vol`/`sell_vol`. Every row failed the lookup, the taker array was empty, `_taker_z` returned 0.0 on every bar, and `abs(z) < entry_z` blocked 100% of entries. The only change is the field extraction in `_build_taker_arrays` (now reads the raw snake_case columns first, with the camelCase aliases as fallbacks); imports, signal math, the three-gate entry, exit geometry, and sizing are untouched so Layers 1 and 2 stay green. Verified against the real injected ETH taker_ratio parquet: with corrected fields, |taker z| >= 1.5 fires 1714 times (884 buy-flow, 830 sell-flow climaxes) over the covered window, giving ample thrust-fade entries once the price-thrust and ranging filters align. Preserves the hypothesis exactly: single-venue single-instrument taker-flow-exhaustion intraday reversion, long+short, ATR-stopped, low parameter count.

Hypotheses

Not worth optimizing, for two independent structural reasons. (1) SHALLOW SIGNAL DATA: despite 227,424 bars processed, the taker_ratio supplementary feed only covers a recent ~2-month tail — data_days is 38 and all 75 entries fall in 2026-03-24..2026-05-17 (annual_returns has 2026 only). The `_taker_z` gate returns 0 whenever taker data is absent/stale, so the entry condition never fires for the pre-2026 history. 75 trades in a single 2-month regime cannot support walk-forward/holdout; the deflation gates would be meaningless. (2) 15m FEE DOMINATION + NEGATIVE EDGE: commission_pct_of_gross is 49.97% — fees eat ~half the gross PnL, the exact 15m fee-domination the factory has repeatedly hit — and the base edge is strongly negative (Sharpe -6.05, profit_factor 0.583, expectancy -$70/trade, PSR 0.0021, avg_loss $371 >> avg_win $179). This is not an iterate: the code implements the hypothesis correctly (75 trades, balanced long/short thrust-fades, regime/thrust gating), so there is no bug to fix — and neither the shallow taker history nor the ~50% fee drag is addressable by parameter tuning. NOTE for routing: I flagged the taker-data window as a symptom, not a verified audit; if a check shows the taker_ratio feed is actually deep and older rows are being dropped by a parsing/injection mismatch in _build_taker_arrays, re-route to ITERATE with that fix. But even with deep data, the ~50% commission-of-gross fee domination on the 15m fade is independently disqualifying, so the mechanism needs a materially lower-frequency reframe (a premise change), not a parameter sweep.

Implementation

Intraday long-short mean-reversion on ETHUSDT.BINANCE (15m USD-M perp). Fades price thrusts that coincide with an extreme in the aggressive taker buy/sell ratio (flow-exhaustion climaxes). Entry requires three confirmations: (1) taker log-ratio z-score beyond entry_z, (2) price thrust >= thrust_atr ATRs from its short SMA, (3) ranging regime (Kaufman efficiency ratio below er_gate). Exits on mean reversion to the SMA, an ATR stop, or a time stop. Taker flow is a signal only, so no funding-accrual limitations apply.

Verification Results

Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: ETHUSDT.BINANCE-15-MINUTE-LAST-EXTERNAL, Bars processed: 223968 Diagnostics: should_enter() returned a side 0 times over 223920 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.

Backtest Review

Faithful, orthogonal implementation: single-instrument ETH 15m taker-flow-gated mean-reversion with regime (efficiency-ratio) and thrust (ATR) confirmations; 75 trades split 31 long / 44 short as designed, taker flow used as signal-only.

Backtest Review

Careful multi-format taker_ratio parsing and lag-guarding; clean single-venue construction avoids the cross-venue/rotation accounting traps.

Backtest Review

Taker-flow signal has data only for a ~2-month recent window: 227,424 bars processed but data_days 38 and all 75 trades in 2026-03..2026-05 — the taker_ratio supplementary feed is shallow, so the entry gate never fires pre-2026. Far too few trades / single regime to optimize or validate.

Backtest Review

15m cadence is fee-dominated: commission_pct_of_gross 49.97% — fees consume ~half of gross PnL, the recurring 15m fee-domination failure mode.

Backtest Review

Strongly negative base edge: Sharpe -6.05 (CI [-10.4, -1.06]), profit_factor 0.583, expectancy -$70/trade, total_return -5.26%, PSR 0.0021; avg_loss ($371) dwarfs avg_win ($179).

Backtest Review

Nothing meaningful to optimize: 75 trades in one 2-month window with fees eating half the gross cannot yield a robust, deflated edge.

Backtest Review

75 trades / 38 data_days (2026 only)

Backtest Review

hundreds across multi-year regimes

Outcome Summary

This strategy sought a crypto-native microstructure edge distinct from the factory's trend-following siblings: fade intraday ETH over-extensions driven by exhausted taker-order climaxes, using taker flow as a signal-only gate on a single venue to sidestep prior cross-venue and rotation accounting traps. The code implemented the hypothesis faithfully—75 balanced long/short thrust-fades with regime and ATR confirmation—but the taker_ratio supplementary feed only reached back a couple of months, so every trade landed in a single 2026 window with no pre-2026 history to validate against. Worse, the base edge was decisively negative (Sharpe -6.05, profit factor 0.583, -$70/trade expectancy) and the 15m cadence bled nearly half its gross PnL to commissions. With no bug to fix and neither the shallow signal history nor the fee drag addressable by tuning, the reviewer abandoned it before optimization, noting that pursuing the idea would require deeper taker data and a fundamentally lower-frequency construction.

Outcome Summary

A supplementary signal is only as good as its historical depth—a gate that silently returns neutral when its feed is absent confines all trades to the shallow recent window—and a 15m fade whose commissions eat ~half of gross PnL needs a materially lower-frequency reframe, not a parameter sweep.

Outcome Summary

The backtest reviewer abandoned it at the pre-optimization gate (verdict 'abandon', no optimization run) for two independent structural reasons: the taker-flow signal had usable data for only a ~2-month single-regime window—too few trades to walk-forward or deflate—and the 15m cadence was fee-dominated (~50% of gross) on top of a strongly negative edge, neither fixable by parameter tuning.

Outcome Summary

A long-short, single-instrument intraday microstructure mean-reversion on ETHUSDT.BINANCE 15m perps that faded short-lived price thrusts backed by an extreme in aggressive taker buy/sell flow, gated to a ranging regime (Kaufman efficiency ratio) and confirmed by an ATR thrust, with mean-touch, ATR-stop, and time-stop exits.

Outcome Summary

It took 75 trades (31 long / 44 short) but all fell in a single ~2-month window (data_days 38, 2026-03 to 2026-05) because the taker_ratio feed only covered a recent tail, and the base edge was strongly negative: Sharpe -6.05 (CI [-10.4, -1.06]), profit factor 0.583, expectancy -$70/trade, total return -5.26%, PSR 0.0021, with avg loss ($371) dwarfing avg win ($179) and commissions at 49.97% of gross.
Strategy report

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