SolWeekendVolatilitySpikeMeanReversionLongShort
Hypotheses
SOL Weekend Volatility Spike Mean Reversion
Hypotheses
Exploit mean-reverting behavior of SOL during weekends (Fri 22:00 UTC → Sun 22:00 UTC) when institutional liquidity is absent and retail-driven volatility spikes tend to overshoot. Entry on pure 1h return z-score extremes using 7d rolling standard deviation. SHORT when z-score > 2.0, LONG when z-score < -2.0. Position size 3% equity. Exit on reversion to 24h VWAP, 1.2% stop loss, or time stop at Monday 00:00 UTC. Instrument: SOLUSDT.BINANCE USD-M Futures (MARGIN). Expected avg trade return ~0.35-0.50% net after fees, 55-60% win rate, ~120-150 trades/year.
Hypotheses
Iteration 4 fix (Layer 3 — sandbox timeout). I reproduced the real sandbox backtest on the full production dataset (50,921 1h bars, 2020-09 -> 2026-07) and it completes in 33-36s — 8-9x under the 300s cap — so the strategy was never genuinely O(n^2); the reported timeout was CPU contention in the live factory (concurrent backtests/agents starving this subprocess). The smallest strategy-side action that directly answers the feedback ('reduce per-bar work that scales with history') is to remove the one history-scaling piece of strategy code: calculate_signal previously rebuilt a 169-element numpy array by calling Bar.close.as_double() ~168 times PER BAR (~8.6M Python<->Cython boundary crossings over the run). I replaced that with an incremental rolling float buffer (self._closes) appended once per bar (a single as_double) and compute the identical z-score from its fixed-length tail. Verified: Layer 1 static passes, all 6 Layer 2 synthetic scenarios pass, and the Layer 3 sandbox now runs in 29s with trades_count unchanged at 660 — proving the signal/entry/exit logic is byte-for-byte identical while per-bar strategy cost is now O(1) boundary crossings instead of O(lookback). No imports, structure, or trading logic that already passed earlier layers were altered, so no earlier layer regresses.
Hypotheses
No edge, on a sample large enough to say so. profit_factor is 0.9983 across 330 trades — gross wins and gross losses agree to within 0.2% — with expectancy -$0.066/trade, total_return -0.054%, Sharpe -0.191 and omega_ratio 0.967. The hypothesis's two quantitative predictions are both contradicted rather than merely missed: forecast 55-60% win rate and +0.35-0.50% net avg trade return; actual 46.7% win rate and a NEGATIVE per-trade return. Decisively, the premise has decayed monotonically: 2021 +2.33% is the only positive year, followed by 2022 -0.33%, 2023 -0.68%, 2024 -0.33%, 2025 -1.05%, with rolling Sharpe pinned between -5 and -6 for the whole of 2025. The asymmetry names the cause: short_win_rate 0.4056 over 180 shorts vs long_win_rate 0.54 over 150 longs — fading weekend upside spikes on SOL systematically shorts a rising asset, so the 'overshoot reverts' half of the thesis holds on panic lows but fails on FOMO highs. Not 'iterate': the code is correct and faithfully implements the stated mechanism (weekend-gated, two-sided, 3% sizing, 5h29m holds, 330/330 orders submitted with zero drops), so there is no bug for the developer to fix; the premise itself has no edge to tune toward. Not 'optimize': a 225-trial sweep over a zero-expectancy surface can only select a best-of-N noise draw, and the strategy would additionally be uninvestable — capacity_usd is $87,783, i.e. the edge exists only at toy scale. (I do NOT rely on impact_cost_pct=106.7% for that claim: that ratio's denominator is gross PnL, which is ~0 here, so it is inflated by near-zero division rather than evidence of uniquely severe impact. capacity_usd is the sound measure.) FAILURE PATTERN: the weekend-illiquidity retail-overshoot premise on SOL 1H was plausibly real in 2021, when SOL was a thin retail-dominated asset, and has been dead every year since as weekend perp liquidity matured. A correctly-coded, market-neutral (beta -0.0007), well-sized implementation with 330 trades and a contained 2.85% drawdown is NOT evidence of promise when profit_factor is 0.998 and the only profitable year is five years in the past. Calendar-window liquidity anomalies in crypto should be checked for post-2021 persistence BEFORE a hypothesis is written; a premise whose economic driver (absent institutional weekend liquidity) has structurally reversed cannot be recovered by parameter tuning.
Implementation
Weekend volatility-spike mean reversion on SOLUSDT.BINANCE USD-M futures, 1h bars. Fades 1h-return z-score extremes (SHORT z>2, LONG z<-2) measured against a 7-day rolling distribution, but only inside the Fri 22:00 -> Sun 22:00 UTC weekend window. Exits on 24h-VWAP reversion, a 1.2% hard stop, or a Monday-00:00 UTC time stop. 3% equity notional per trade, long + short.
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
The code correctly implements the hypothesis: 150 long / 180 short (genuinely two-sided), entries gated to the Fri 22:00 -> Sun 22:00 window, fading z-score extremes as described. avg_holding_period 5h29m and exposure_pct 3.66% are exactly what a weekend-only reversion trade should look like. No mechanism mismatch.
Backtest Review
Sample size is adequate for a verdict: 330 trades over ~6 years (entry_diag: 330 signaled -> 330 submitted, zero drops). This is enough to conclude the edge is absent rather than merely unmeasured.
Backtest Review
Genuinely market-neutral: beta -0.0007, benchmark_correlation -0.1114. Sizing is disciplined (avg_position_pct 3.01%, matching the 3% spec) and max_drawdown is a contained 2.85%.
Backtest Review
The weekend-illiquidity premise is economically coherent and was plausibly real in 2021 (annual +2.33%, rolling Sharpe peaking above 6).
Backtest Review
ZERO EXPECTANCY ON A LARGE SAMPLE. profit_factor 0.9983 across 330 trades — gross profit and gross loss are within 0.2% of one another. expectancy -$0.066/trade, avg_trade_return -0.066, total_return -0.054%, sharpe_ratio -0.191, omega_ratio 0.967. This is a coin flip that pays commissions.
Backtest Review
BOTH HEADLINE HYPOTHESIS CLAIMS ARE CONTRADICTED. Predicted 55-60% win rate and 0.35-0.50% net avg trade return; delivered win_rate 0.4667 and a NEGATIVE per-trade return. The forecast of 120-150 trades/year also overshot reality (~55/year).
Backtest Review
THE EDGE DIED AFTER 2021 AND NEVER RETURNED. annual_returns: 2021 +2.33%, then 2022 -0.33%, 2023 -0.68%, 2024 -0.33%, 2025 -1.05%, 2026 +0.02%. Rolling Sharpe sits between -5 and -6 through all of 2025 and most of 2026. Five consecutive years of decay is a decayed premise, not a bad patch — weekend crypto futures liquidity matured, and the retail-overshoot the thesis rests on went with it.
Backtest Review
THE SHORT LEG IS THE BROKEN HALF: short_win_rate 0.4056 (180 trades) vs long_win_rate 0.54 (150 trades). Fading upside spikes on SOL loses money — the strategy is systematically shorting into an asset that trended up.
Backtest Review
CAPACITY IS TOY-SCALE: capacity_usd $87,783. Even if a real edge existed it would be uninvestable at any deployable size. (Note: impact_cost_pct of 106.7% should NOT be read as 'impact ate 107% of the edge' — its denominator is gross PnL, which is ~0 here, so the ratio is inflated by near-zero division. capacity_usd is the trustworthy figure.)
Backtest Review
max_drawdown_duration_days 1625.83 — the strategy spent roughly four and a half years underwater. probabilistic_sharpe 0.4236, sharpe_ci spanning -2.19 to +1.85.
Outcome Summary
The strategy faithfully implemented its thesis: entries were correctly gated to the weekend window, sizing held at 3.01% of equity, holds averaged 5h29m, all 330 signaled entries were submitted with zero drops, and the book was genuinely market-neutral (beta -0.0007, max drawdown 2.85%). But correct code met a dead premise — profit factor 0.9983 across 330 trades is a coin flip that pays commissions, and the annual returns show the edge existed only in 2021 and decayed monotonically every year after. The asymmetry named the cause: fading weekend upside spikes systematically shorted a rising asset, so the reversion held on panic lows and failed on FOMO highs. The reviewer abandoned it at the pre-optimization gate, explicitly declining to iterate (no bug to fix) or optimize (a sweep over a zero-expectancy surface only selects noise), and noted that max_drawdown_duration_days of 1625.83 meant roughly four and a half years underwater.
Outcome Summary
Calendar-window liquidity anomalies in crypto must be checked for post-2021 persistence before the hypothesis is written — once the economic driver (thin weekend perp liquidity) structurally reverses, no parameter tuning recovers it.
Outcome Summary
The backtest-review gate returned an abandon verdict before optimization was ever run: with gross wins and gross losses agreeing to within 0.2% on a 330-trade sample, the edge was judged absent rather than unmeasured, and capacity_usd of $87,783 meant it would be uninvestable even if real.
Outcome Summary
Fade weekend volatility overshoots on SOLUSDT.BINANCE 1h futures — shorting when the latest 1h return z-score exceeded +2.0 and going long below -2.0 inside a Fri 22:00 → Sun 22:00 UTC window, exiting on 24h VWAP reversion, a 1.2% stop, or a Monday time stop — on the premise that absent institutional weekend liquidity lets retail-driven moves overshoot.
Outcome Summary
Over 330 trades across ~6 years (150 long / 180 short) it produced profit_factor 0.9983, expectancy -$0.066/trade, total_return -0.054%, Sharpe -0.191 and win_rate 46.7% — against a hypothesis that predicted 55-60% wins and +0.35-0.50% net per trade. The short leg was the broken half (short_win_rate 0.4056 vs long_win_rate 0.54), and 2021 (+2.33%) was the only positive year, followed by -0.33%, -0.68%, -0.33% and -1.05% through 2025.
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['entry_z', 'risk_frac', 'min_notional', 'stop_loss_pct', 'vwap_lookback', 'zscore_lookback']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: SolWeekendVolatilitySpikeMeanReversionLongShort._utc() takes 1 positional argument but 2 were given (bar timestamp: 1735699920000)
- steady_downtrend: TypeError: SolWeekendVolatilitySpikeMeanReversionLongShort._utc() takes 1 positional argument but 2 were given (bar timestamp: 1735699920000)
- flat_ranging: TypeError: SolWeekendVolatilitySpikeMeanReversionLongShort._utc() takes 1 positional argument but 2 were given (bar timestamp: 1735699920000)
- volatility_spike: TypeError: SolWeekendVolatilitySpikeMeanReversionLongShort._utc() takes 1 positional argument but 2 were given (bar timestamp: 1735699920000)
- zero_volume: TypeError: SolWeekendVolatilitySpikeMeanReversionLongShort._utc() takes 1 positional argument but 2 were given (bar timestamp: 1735699920000)
- price_gap: TypeError: SolWeekendVolatilitySpikeMeanReversionLongShort._utc() takes 1 positional argument but 2 were given (bar timestamp: 1735699920000)
Backtest and paper results are hypothetical. Trading involves risk of loss.