Replication of Dimaquant’s “Do breakouts work in crypto?” on Bybit USDT perps instead of Binance: upside 20-day breakouts average +76 bps next-day (payoff ratio 1.42); downside breakdowns average −11.7 bps.
Upside 20-day breakouts on Bybit perps average +76 bps next-day close-to-close (win rate 48.3%, payoff ratio 1.42) — directionally consistent with Dimaquant’s Binance result (+15.4 bps outperformance, payoff 1.19) but stronger in raw terms. Downside breakdowns average −11.7 bps (~50% win rate, payoff 0.91).
This is a descriptive event study, not a validated strategy: no statistical significance tests, no outlier sensitivity, no fees/slippage/funding, single universe snapshot (top-40 by turnover at one time). Treat it as evidence that upside-breakout follow-through exists on Bybit perps and deserves a proper costed, significance-tested follow-up.
20-day lookback on closes: upside breakout when today's close = highest close of the prior 20 days (within float tolerance); downside = lowest close.
Next-day close-to-close return (close_t+1 / close_t − 1).
Pooled across symbols, equal-weighted events: mean return, win rate, avg win, avg loss, payoff ratio.
Top 40 active Bybit USDT linear perps by 24h turnover at analysis time (single snapshot, not monthly rebalanced).
| Signal | Events | Mean return | Win rate | Avg win | Avg loss | Payoff |
|---|---|---|---|---|---|---|
| Upside breakout | 2,186 | +76.02 bps | 48.3% | 0.0636 | −0.0447 | 1.42 |
| Downside breakdown | 3,011 | −11.67 bps | 51.0% | 0.0410 | −0.0450 | 0.91 |
Daily OHLCV from Bybit public API per symbol (up to ~1,000 days), cached locally (40 files, ~2.8 MB). No API keys.
analyze_breakouts.py computes signals + pooled stats; build_results.py regenerates full results (pooled + yearly + per-symbol) into site/data/results.json.
Self-contained static site (dark theme, zero deps): headline findings, Bybit-vs-Binance comparison, yearly bars, per-symbol detail, method notes.
No significance tests, no outlier sensitivity, no fees/slippage/funding, single-snapshot universe, cross-exchange differences are not a performance ranking.
python analyze_breakouts.py # fetch + signals + pooled results
python build_results.py # full results → site/data/results.json
cd site && python3 -m http.server 8899