Strategies
BTC BINANCE USD-M Taker-Flow Flush Reversion LONG/SHORT (Trade-Tick-Driven Liquidity Provision into Aggressive Flow, Short-Horizon, 3-Parameter, Maker-Preferred Entry)
Outcome: Abandoned
BtcTakerFlowFlushReversionLS
Well-measured (1,150 trades); clean 3-parameter build with point-in-time supplementary reads and locked infra params; contained drawdown (15%), no liquidation
Hypothesis
Implementation
LONG/SHORT taker-flow flush reversion on BTCUSDT.BINANCE perp, 5-minute bars. Measures aggressive taker BUY vs SELL volume imbalance from Binance's taker long/short volume series (metrics.taker_long_short_vol_ratio, merged with taker_ratio buy/sell volumes), z-scores a rolling 30-minute flow window against a ~2-day baseline, and requires a same-direction price displacement of >= 1 realized sigma. On an extreme flush it provides liquidity AGAINST the flow (SELL the aggressive-buy flush, BUY the aggressive-sell flush) and exits on a 0.6% take-profit, a 0.3% stop, or a 2-hour max hold. Three tunables: flow_window_bars, flow_imbalance_z, take_profit_pct.
Verification Results
Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL, Bars processed: 41471 Diagnostics: should_enter() returned a side 0 times over 41452 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
- Sharpe
- -1.74
- Total return
- -14.92%
- Max drawdown
- 14.95%
- Trades
- 1150
- Win rate
- 39.6%
- Profit factor
- 0.56
Well-measured (1,150 trades); clean 3-parameter build with point-in-time supplementary reads and locked infra params; contained drawdown (15%), no liquidation
Fee-dead: avg_trade_return_pct 0.0044% (~30x below floor), commission 57.44% of gross, PF 0.56, expectancy -$12.98/trade
Fully negative and consistent: Sharpe -1.74 (CI [-3.80, -1.39]), PSR 0.0, loses every year 2020-2026 and every regime
RR-inverted fade tail (avg_win $42 < avg_loss $49, kurtosis 442, skew -19.4) — fades flushes that keep running
Intended tick-driven edge unavailable (ticks exist for 1 day only); degraded to a 5m taker-ratio proxy that cannot resolve the sub-minute snap-back the mechanism needs (L18 fee_edge + L55 fade)
Iteration History
Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit. This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).
Backtest and paper results are hypothetical. Trading involves risk of loss.