faborb · Opening Range Breakout on Crypto Perps
A systematic test of whether the Nasdaq ORB strategy (Fabio Valentini's setup, as analyzed in Matteo Conti's video, rooted in the 2018 JFE "Market Intraday Momentum" paper) transfers to Bybit USDT-margined perpetuals — 6 months of data, 50 symbols, confluence filters, volatility-targeting sizing, regime analysis, and walk-forward out-of-sample validation.
Bybit v5 public API · free data
stdlib-only Python + requests
54 unit tests
90d + 180d top-50 JSON reports
TL;DR — the headline finding: the ORB edge does NOT transfer to crypto perps at scale.
Over 180 days × 50 symbols: only 9/50 (18%) profitable, aggregate net −$4,234,
and walk-forward OOS was positive on just 15/50. The promising 30-day numbers were a
low-volatility regime artifact. A two-factor symbol screen (trend + breakout follow-through)
concentrates ~15× of the available edge but does not create profitability alone.
1The Strategy
- Opening range: first 30 min of the NY session (09:30–10:00 ET)
- Entry: first 5-min candle that closes above the opening-range high
- Stop: opening-range low · Target: 1× risk (1R) · Time exit: 15:00 ET
- One trade per day, long only. The video's delta (>200 contracts) filter was tested and added nothing — removed.
- Enhancements tested: volume confirmation (1.5× avg), range tightness (<4%), 4H-EMA trend filter, volatility-targeting sizing (risk = 2×ATR), and a volatility-regime percentile gate.
2Headline Numbers
9/50
symbols profitable (180d)
−$4,234
aggregate net (180d, $10k start each)
15/50
walk-forward OOS-positive
3Results by Horizon — Why Sample Length Matters
| Horizon | Profitable | Total net | Avg PF | WFO OOS+ | Read |
| 30 days | 17/50 (34%) | −$1,023 | 0.94 | 28/50 (56%) | flattering — looked real |
| 90 days | 12/49 (24%) | −$3,838 | 0.74 | 10/49 (20%) | edge starts to break |
| 180 days | 9/50 (18%) | −$4,234 | 0.78 | 15/50 (30%) | marginal-to-negative at scale |
The 30-day window made 8 of its top-10 in-sample symbols look OOS-positive.
At 90d that collapsed to 5/10 (≈ coin flip). Short windows flatter; always extend history + walk-forward.
3.5Results Charts
Profitable symbols by horizon (%)
Share of 50 top bybit perps with positive ORB net over each horizon. The edge decays as the window lengthens.
Top symbols · 180-day net profit (zero-centered)
Right of center = profitable, left = losing. Scale: ±$300. Only 9 of 50 symbols end positive over 6 months.
4Top Symbols at 180 Days
Best in-sample
| Symbol | Net | PF | R/DD |
| FARTCOINUSDT | +$267 | 1.52 | 1.9 |
| ZECUSDT | +$240 | 1.53 | 2.7 |
| HEMIUSDT | +$228 | 1.43 | 1.6 |
| CYSUSDT | +$180 | 1.41 | 1.5 |
| SUIUSDT | +$102 | 1.42 | 2.5 |
| ETHUSDT | +$34 | 1.14 | 0.5 |
Best walk-forward (OOS)
| Symbol | OOS net | Stability |
| ZECUSDT | +$160 | 0.46 |
| PUMPFUNUSDT | +$97 | 0.37 |
| KORUUSDT | +$80 | 0.63 |
| LITUSDT | +$73 | 0.37 |
| CYSUSDT | +$39 | 0.23 |
| ETHUSDT | +$31 | 0.43 |
5Volatility-Regime Gate — Tested & Rejected
Added a no-lookahead ATR% percentile gate (20–80 band) directly into the backtest entry logic, then A/B'd 6 band variants on 90 days:
| Config | Trades | Total net |
| no-regime | 507 | −$414 (best) |
| band 20–80 | 404 | −$877 |
| band 10–90 | 472 | −$599 |
| band 0–80 | 420 | −$806 |
| band 30–70 | 327 | −$696 |
| band 40–90 | 436 | −$579 |
Every gate variant made aggregate net worse. The gate blocks ~20% of trades, but the filtered low-vol tail contained the profitable breakouts. Default is OFF (--regime opt-in).
6Why Do the "Surviving" Symbols Persist?
Critical correction: of the original 3 survivors, CASHCATUSDT is a 27-day-old listing — its "edge" was a new-listing artifact, not structural. Genuine 6-month survivors: CYSUSDT, ETHUSDT (+ ZEC, SUI, CL).
Winners vs losers feature comparison (180d medians):
| Feature | Winners | Losers | Read |
| Period return | +41% | −3% | winners were in strong uptrends |
| ATR p90 (vol bursts) | 1.10 | 0.64 | winners have fat right tails |
| target_share (breakouts reach 1R) | 0.38 | 0.31 | genuine follow-through |
| stop_share | 0.26 | 0.31 | fewer stops |
| ema_frac (4H above EMA) | 0.49 | 0.46 | weak — trend isn't the whole story |
Discriminators: trend regime + genuine breakout follow-through.
Non-discriminators: opening-range tightness, coiling, intraday vol level.
7Optimization Levers — Properly Tested OOS
- Lever A — trend/momentum screen (close > 4H EMA20 + positive 180d return): cuts losses −$4,279 → −$1,083 but does NOT create profit. Strictest uptrend screen (ema_frac ≥ 0.55) killed everything (0/4).
- Lever B — trade-mechanics screen (target_share ≥ 0.38): in-sample looks great (+$1,011, PF 1.41), but the honest train→test OOS test shows it concentrates the edge without flipping sign: −$3,751 → −$240 (~15× loss cut, PF 0.99).
- Feature correlations with OOS net: none exceed +0.23. No single observable feature reliably predicts which symbol keeps the edge.
| Train→test screen | OOS net | OOS PF | vs ALL |
| ALL (no screen) | −$3,751 | 0.62 | — |
| train target_share ≥ 0.38 | −$361 | 0.97 | ~14× loss cut |
| train tgt ≥ 0.38 & stop ≤ 0.30 | −$240 | 0.99 | ~15× loss cut |
8Verdict
- The Nasdaq ORB edge does not reliably transfer to crypto perps — the JFE intraday-momentum effect doesn't reproduce at meaningful scale on perps.
- The "winners" are mostly long-only beta in trending names with genuine follow-through — a regime/subset effect, not a structural edge.
- Most defensible optimization: a two-factor symbol screen — persistent uptrend (4H EMA) + historical breakout follow-through (target_share ≥ 0.38, stop_share ≤ 0.30) — narrows the loss surface ~15× out-of-sample.
- Minimum listing history ≥ 6 months before trusting a symbol-level result.
9Code & Reports
orb_research/ — Python package: Bybit v5 API client, ORB strategy core with filters, risk management, metrics, walk-forward (54 unit tests)
scripts/ — sample runner, regime-gate sweep, edge investigation, lever tests, OOS symbol-selection validation, 180d prefetch
report/ORB_PERP_RESEARCH.md — the complete research write-up
report/orb_research_top50_90d_report.json & ..._180d_report.json — raw per-symbol + walk-forward data
Run it yourself: pip install requests && python scripts/test_enhanced_orb_sample.py --top 20 --days 90 --wf (candle cache is gitignored — regenerable from the free Bybit API).
Next steps: forward-test the two-factor watchlist (ZEC, CYS, ETH, SUI, CL, FARTCOIN, HEMI) on the Bybit testnet · drop the universal regime gate · map sizing to real qty steps · add funding + slippage · re-run this protocol quarterly.