Strategies
AVAX USD-M Intraday VWAP Mean-Reversion, Long-Short (BINANCE Perp, 15m Bars, Fade Moderate Z-Score Excursions from Rolling Session VWAP, Symmetric, Pure OHLCV, 4-Parameter)
Outcome: Abandoned
AvaxVwapReversionIntradayLS
Well-measured (944 trades over 5.9 years); clean 4-parameter pure-OHLCV construction with a trend gate; incremental indicators (no timeout); no liquidation
Hypothesis
Implementation
Long-short intraday mean-reversion on AVAXUSDT.BINANCE USD-M perpetual, 15-minute bars. Computes a rolling 32-bar volume-weighted average price and the z-score of close vs that VWAP; fades excursions beyond +/-3.0 z (long below, short above) unless the 96-bar trend is strongly against the fade, and exits on full reversion to VWAP, a z-blowout past 3.5, a 1.5% hard stop, or a 32-bar time stop. Single instrument, pure OHLCV plus volume, symmetric long/short, leverage 1.0.
Verification Results
[archived 2026-09-05] The Layer-4 feedback previously stored here was a QA review of a DIFFERENT strategy (XRPUSDT.BINANCE 2-hour RSI(2) fade review (run is AVAX 15m VWAP mean-reversion)), delivered to this run by the shared-session/shared-outbox bug fixed in fbae0041 (per-call isolation + call_id binding). It was moved to metadata.foreign_feedback_archive and must be disregarded; the next QA review of this run is authoritative.
Analyst: abandon rather than optimize (the developer's own 3-variant sweep already shows no fee-viable cell). Do not re-attempt VWAP-deviation fade re-parameterizations on liquid majors — it is a zero-survivor class per L81.
Fee-nonviable by construction: VWAP-deviation-fade on a liquid major at 15m produces a high win rate with a structurally inverted payoff (avg_win $140 vs avg_loss $329) because winners are capped at the reversion to VWAP while losers run to the 1.5% hard stop / stop_z. avg_trade_return_pct +0.071% < the 0.15% USD-M floor, PF 0.68, 22.7% of gross to commission. The developer confirmed this across three parameterizations (L81 dead class). Not a code defect — the fade, trend gate, and exits are correctly implemented — but the edge does not exist net of fees.
Backtest Review
- Sharpe
- -1.10
- Total return
- -54.43%
- Max drawdown
- 56.68%
- Trades
- 944
- Win rate
- 52.2%
- Profit factor
- 0.64
Well-measured (944 trades over 5.9 years); clean 4-parameter pure-OHLCV construction with a trend gate; incremental indicators (no timeout); no liquidation
Fully negative: PF 0.643, avg_trade_return_pct -0.097%, expectancy -$57.8/trade, total_return -54.4%, Sharpe -1.10 (CI [-2.57, -0.78]), PSR 0.0002 — loses in all 6 full years
RR structurally inverted (avg_win $199 < avg_loss $338); the developer's own iteration-4 note concedes it is a net loser and the asymmetry is structural, not tunable
Catastrophic drawdown 56.7% (CI to 97%, past L19 line); return_kurtosis 594 / skew -21.9 fade-into-crash tail; fee-fragile (commission 16.6% of gross)
L55 single-name intraday mean-reversion family (0/174 survivors) — same fate as the SOL/ETH/BNB/XRP siblings
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).
Verification failed (Layer 4 — QA review): - FEE-VIABILITY/EDGE FAILURE + liquidation. Reliable sandbox (metrics_reliable, 2128 days, 9631 trades): total_return -100%, liquidated 2021-11-10, avg_trade_return_pct -0.017% (<< 0.15% futures floor), commission 13.79% of gross. NOT an L17 code bug — win_rate 0.623, PF 0.735, skew -6.4 are a COHERENT mean-reversion payoff (many small wins, rare big losses), and polarity/exits/sizing are correct. It's the L6 pattern: high-turnover (~4.5 trades/day) with a tight exit_z=0.3 target, per-trade edge can't clear the 0.10% RT fee, and serially fading AVAX's 2021 parabola bleeds to liquidation. Per L6/checklist #7, block at Layer 4. - Minor off-by-one: _entry_bar is set the bar AFTER entry fills (calculate_signal runs before should_enter), so the time stop fires at max_hold_bars+1. Immaterial to the failure; fix if redesigned. - CREDIT: the iter-2 O(1) incremental rolling window (deques + running sums, fsum resync) correctly fixes the Layer-3 timeout and the signal math matches. Sound; the block is purely economics.
Backtest and paper results are hypothetical. Trading involves risk of loss.