Strategies
SOL BINANCE USD-M Futures 15-Minute Daily-Anchored VWAP Excursion Long/Short Mean-Reversion (Single-Venue, Single-Instrument, 3-Parameter, Z-Relative Volatility Stop)
Outcome: Abandoned
SolBinanceFifteenMinDailyVwapExcursionMeanReversionLongShort
Outcome Summary
Hypothesis
Iteration 2 fix for the Layer-3 wall-clock timeout (>300s smoke test). The signal logic, thresholds, entry/exit gates, and ATR-scaled stop are all UNCHANGED from the previous iteration (which passed Layers 1 and 2). The ONLY change is replacing the per-bar numpy array reconstructions with O(1) incremental accumulators: (1) VWAP now uses running sum(close*vol), sum(vol), sum(close) reset daily instead of rebuilding np.asarray(day_closes/day_vols) each bar; (2) the rolling deviation std uses a fixed-length deque with running sum and sum-of-squares (variance = E[x^2] - E[x]^2) instead of np.std over a re-sliced window; (3) ATR uses a rolling true-range deque with a running sum computed from _prev_close instead of _compute_atr rebuilding three numpy arrays from self._bars via list comprehensions each bar. numpy is dropped from the hot path in favor of stdlib math/collections. Per-bar cost is now constant over the ~150k-bar SOL 15m history, eliminating the timeout while producing byte-identical statistics.
Implementation
SOLUSDT.BINANCE USD-M perpetual futures, 15-minute daily-anchored VWAP excursion mean-reversion, symmetric long+short. Each bar computes session-anchored VWAP (reset at UTC midnight), a rolling std of (close - VWAP), and z = (close - VWAP)/std. z <= -z_entry goes long (below fair value), z >= z_entry goes short (above fair value), betting on reversion to VWAP. Exits on reversion to VWAP (z crosses 0), an ATR-scaled stop (stop_atr_mult * ATR from entry), or forced end-of-day flat at >= 23:30 UTC. Three tunable params: z_entry, vwap_std_lookback, stop_atr_mult. Leverage 1.0, OHLCV-only, single-leg directional PnL.
Verification Results
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 Review
- Sharpe
- -1.51
- Total return
- -100.00%
- Max drawdown
- 100.00%
- Trades
- 8504
- Win rate
- 57.9%
- Profit factor
- 0.78
Data insufficiency is genuinely fixed: full SOL 15m history (202,628 bars, ~5.7 yr) with 8,504 trades — ample sample for optimization, unlike the prior 38-day SOL-HL-15m attempt.
Efficient O(1) incremental implementation (no per-bar timeout), correct VWAP-excursion mechanism, single-instrument directional PnL avoiding the cross-venue/funding accounting traps.
CATASTROPHIC LOSER: total_return -100% with the account LIQUIDATED on 2025-03-01; Sharpe -1.51, profit_factor 0.78 (gross losses exceed gross wins), negative EVERY year and worsening (2021 -44% -> 2024 -79% -> 2025 -521% before blowup).
The ATR-stop 'fix' failed: win rate 57.9% but avg_win $79 << avg_loss $140 (1.79x) — the same inverted small-win/big-loss profile it was designed to cure (prior 2.05x).
Blowup tail: skew -17.6, kurtosis 489, single-day returns of -115% / -110% — mathematically impossible without over-leverage, which caused the liquidation.
Likely position-stacking/over-leverage bug: avg_position_pct 40.7% vs configured 10% (should_enter never checks for an existing position before re-entering). But PF 0.78 means even a 4x sizing fix leaves a losing strategy — the edge is absent, not mis-sized.
Outcome Summary
A VWAP mean-reversion edge promoted on ETH 1H does not inherit to SOL's higher-volatility 15m cadence — the reversion is overwhelmed by intraday noise/trend and fee drag, and an ATR-scaled stop cannot flip a negative-expectancy (PF<1) mechanism; also, should_enter must check for an existing position before re-entering to avoid position stacking.
The analyst issued an 'abandon' verdict at the pre-optimization backtest-review gate: with profit factor 0.78 the mechanism has genuinely negative expectancy on this asset/timeframe (no parameter region rescues a PF<1 loser), the ATR-stop fix failed to correct the inverted win/loss profile, and a probable position-stacking/over-leverage bug (avg position 40.7% vs configured 10%, no existing-position check before re-entry) drove the liquidation — so no optimization or later stage was run.
A symmetric long/short intraday mean-reversion strategy on SOLUSDT.BINANCE 15-minute futures that entered when price deviated far (z-score) from a daily-anchored VWAP and bet on reversion to VWAP, transplanting a VWAP-excursion mechanism promoted on the ETH 1H sibling to a faster cadence and more-volatile asset, with an ATR-scaled stop meant to cure the inverted avg_loss/avg_win that sank the prior SOL-HL-15m variant.
Across ~5.7 years and 8,504 trades on full history (202,628 bars) it was a catastrophic loser: total return -100% with the account liquidated on 2025-03-01, Sharpe -1.51, profit factor 0.78, and expectancy -$13/trade; despite a 57.9% win rate the loss geometry stayed inverted (avg win $79 vs avg loss $140), commissions ran 11.6% of gross, and blowup tails appeared (skew -17.6, kurtosis 489).
Backtest and paper results are hypothetical. Trading involves risk of loss.