Does the NY 15-minute Opening Range Breakout survive validation?
Toby Crabel's opening range, as the YouTube default: first 15 minutes, one break, done by the close.
Credit. The opening-range family goes back at least to Toby Crabel, Day Trading with Short Term Price Patterns and Opening Range Breakout (1990). The rule we locked is the 2024–2026 retail YouTube / TradingView default, not a page-for-page reconstruction of Crabel: first 15 minutes of the New York cash session set the range, one break, flat by the close. Opening range is the public description we used as the source link. We reimplement the idea clean-room in Python — no Pine, no MQL, no vendor script — and put it through the same costs, out-of-sample split, and Deflated Sharpe Ratio as every other teardown here.
1 / The pitch: a range, a break, done by the close
It is one of the most-copied day-trading pictures on YouTube: mark the high and low of the first 15 minutes of the New York cash session, trade the first break, be flat by the close. The pitch fits under a 5-minute chart:
- Cash open 09:30 America/New_York. The first 15 minutes print an opening range.
- After 09:45, the first break of that high or low is the trade.
- One attempt per session. Flatten at the cash close.
Sold as a session-structure edge: the open is where overnight information hits the cash auction, the first 15 minutes “discover” value, and the rest of the day is a breakout from that discovery. If that sentence is true as a standalone system on liquid index ETFs, a clean-room backtest with real friction, a frozen search, and a Deflated Sharpe bar of 0.95 should not need a miracle sample to show it.
We ran that named 15-minute rule on SPY and QQQ. It does not clear the bar we use for a tradeable edge. That is not the same as “the opening range is empty.” A ~51% win rate on a 60-day tape is an optical illusion. We still publish, because a failed DSR is a lesson, not a reason to hide the tape.
2 / Why Alpaca is the headline, and Yahoo is not
Three tapes. One family of rules. Only one of them is allowed to be the lede.
- Alpaca SIP 5-minute bars — the named 15-minute opening range, on years of SPY and QQQ. This is the headline.
- Yahoo 5-minute, ~60 trading days — the window a YouTube backtest actually has. We run it so you can see the screenshot. We do not headline it.
- Yahoo 1-hour, 60-minute opening range — the longest cousin of the same session-break logic Yahoo can support. Same family, different bar. Not a substitute for 15 minutes.
Costs are the same everywhere we quote a net number: fees 0, slippage 1.5e-4 (1.5 bps). Signal on the close; the fill is the next bar. Searches use n_trials=40 (Optuna). The survive bar is DSR ≥ 0.95. Engine: vectorbt 2026.6.27.
Sharpes below are per bar, the units the run actually emitted. We are not going to annualize them, we are not going to invent a CAGR, and we are not going to quote a buy-and-hold Sharpe just because buy-and-hold is on the chart. Fields the run did not emit are omitted on purpose.
3 / SPY: the named 15-minute rule, on the tape that can actually hold it
Universe: Alpaca SIP 5-minute SPY. 492,026 bars. Span: 2015-12-31 19:00−05:00 to 2026-08-28 19:55−04:00. Forty trials on the named 15-minute opening range. Best trial: or_minutes=15, buffer_bps=4, long_only=true.
| SPY · Alpaca SIP 5m · 15-minute OR · 40 trials | |
|---|---|
| Bars | 492,026 |
| Span | 2015-12-31 → 2026-08-28 |
| Best params | 15m OR, 4 bp buffer, long only |
| In-sample Sharpe (per bar) | −0.0015 |
| Out-of-sample Sharpe (per bar) | 0.0002 |
| Deflated Sharpe (DSR) | 0.4011 |
| OOS return | 0.24% |
| OOS max drawdown | −12.25% |
| OOS trades / win rate | 545 / 52.66% |
The YouTube default length was the in-sample pick. It still did not get paid. In-sample Sharpe is already negative. Out-of-sample Sharpe is 0.0002 per bar on 0.24% of return, with a −12.25% hole and a photogenic 52.66% win rate across 545 trades. DSR 0.4011 against a bar of 0.95. The search did not find a winner hiding in the buffer. It found the least-bad way to go nowhere: long-only, four basis points of extra room, still a coin-flip that failed to compound.
4 / QQQ: same named rule, same fail
Universe: Alpaca SIP 5-minute QQQ. 476,656 bars. Same named 15-minute opening range, same 40 trials. Best trial: buffer_bps=3, long_only=true.
| QQQ · Alpaca SIP 5m · 15-minute OR · 40 trials | |
|---|---|
| Bars | 476,656 |
| Best params | 3 bp buffer, long only |
| In-sample Sharpe (per bar) | −0.0005 |
| Out-of-sample Sharpe (per bar) | 0.0006 |
| Deflated Sharpe (DSR) | 0.2793 |
| OOS return | 2.51% |
| OOS max drawdown | −13.71% |
| OOS trades / win rate | 514 / 54.86% |
Slightly better window-dressing than SPY — 2.51% out-of-sample, win rate 54.86% — and a worse Deflated Sharpe: 0.2793. In-sample Sharpe is still negative. The Nasdaq-100 ETF is not the hidden parameter that rescues a 15-minute breakout. A 54.86% win rate is what you put on a thumbnail. DSR 0.28 is what you put in the headline.
5 / The unlocked default is a coin-flip with thousands of trades
Before anyone says “you over-tuned it”: lock the YouTube default on the full Alpaca sample — 15-minute range, buffer 0, long/short — and count.
| Default full sample · 15m · buffer 0 · long/short | SPY | QQQ |
|---|---|---|
| Trades | 2,673 | 2,669 |
| Win rate | 49.31% | 49.42% |
| Sharpe (per bar) | −0.0021 | −0.0016 |
Win rate 49.31% on SPY (2,673 trades), 49.42% on QQQ (2,669 trades). Per-bar Sharpe negative on both. That is not a quiet edge waiting for a better buffer. That is a fair coin with a session costume. The 40-trial search then dropped the short side and added a few basis points of room, which is SPY and QQQ talking — a structural bid — and still failed to clear DSR. “Trade less on a bad opening-range break” is not alpha.
6 / The 60-day YouTube window is the wrong sample
Yahoo’s 5-minute history is about 60 trading days. That is the tape a video can actually download, so that is the tape a video backtests. We ran the locked default there too — SPY: 15-minute OR, buffer 0, long/short — because the screenshot is part of the phenomenon. We are not going to let it become the lede.
| Yahoo 5m · ~60 days · do not headline | SPY | QQQ |
|---|---|---|
| Bars | 4,680 | 4,680 |
| Span | 2026-06-04 → 2026-08-28 | 2026-06-04 → 2026-08-28 |
| Trades | 59 | 60 |
| Win rate | 50.85% | 51.67% |
| Sharpe (per bar) | 0.0025 | −0.0103 |
Fifty-nine trades. Win rate 50.85%. Positive per-bar Sharpe on SPY, −0.0103 on QQQ over the same 4,680-bar length. Pick the ticker that matches the thumbnail you wanted. We are not going to annualize 0.0025, we are not going to print a Deflated Sharpe on this window, and we are not going to let “about 51%” become the title. Yahoo cannot give this rule a long 15-minute history. Pretending otherwise is how 15-minute YouTube backtests get written.
What the short tape does show, and only this: the default long/short, zero-buffer rule does trade on recent SPY and QQQ. It is not vacuous. It is also not a sample you can defend a strategy with.
7 / The 60-minute cousin does not rescue the family
Same session-break idea. Different bar. Opening range is the first 60 minutes, on Yahoo hourly bars, searched 40 ways. This is the longest cousin of the YouTube rule that vendor can support. It is not the 15-minute default. If the family had a fat standalone edge, 40 tries on a coarser bar should have been able to trip over it.
SPY 1h · 60-minute OR
5,072 bars, 2023-10-02 to 2026-08-28. Best trial: 60m, buffer 1, long_only=true.
| SPY 1h · 60-minute OR · 40 trials | |
|---|---|
| Best params | 60m OR, 1 bp buffer, long only |
| In-sample Sharpe (per bar) | −0.0137 |
| Out-of-sample Sharpe (per bar) | −0.0189 |
| Deflated Sharpe (DSR) | 0.1519 |
| OOS return | −2.97% |
| OOS max drawdown | −4.06% |
| OOS trades / win rate | 104 / 45.19% |
QQQ 1h · 60-minute OR
5,073 bars. Best trial: 60m, buffer 1, long_only=false.
| QQQ 1h · 60-minute OR · 40 trials | |
|---|---|
| Best params | 60m OR, 1 bp buffer, long/short |
| In-sample Sharpe (per bar) | −0.0 |
| Out-of-sample Sharpe (per bar) | −0.0267 |
| Deflated Sharpe (DSR) | 0.1135 |
| OOS return | −7.44% |
| OOS max drawdown | −7.51% |
| OOS trades / win rate | 167 / 46.71% |
This is the opposite of the usual overfitting cartoon (a huge in-sample Sharpe that melts under DSR). The search never got aloft. SPY’s best trial is still negative in-sample and worse out-of-sample; DSR 0.1519. QQQ’s best trial kept both sides, in-sample Sharpe −0.0, out-of-sample −0.0267, DSR 0.1135, out-of-sample return −7.44%. Deflation is then almost ceremonial: you cannot deflate your way into an edge the in-sample peak already refused to show.
8 / Verdict
Not a tradeable standalone edge on this tape. Still a question worth deforming.
The named 15-minute NY opening-range breakout, as the YouTube default, does not survive validation on Alpaca SIP 5-minute SPY and QQQ. After 40 trials, SPY’s winner (15m, 4 bp buffer, long only) posts in-sample Sharpe −0.0015, out-of-sample Sharpe 0.0002, DSR 0.4011, out-of-sample return 0.24%, max drawdown −12.25%, 545 trades, 52.66% wins. QQQ’s winner (3 bp buffer, long only) posts in-sample Sharpe −0.0005, out-of-sample Sharpe 0.0006, DSR 0.2793, out-of-sample return 2.51%, max drawdown −13.71%, 514 trades, 54.86% wins. The survive bar is DSR ≥ 0.95. Neither clears it. The unlocked default on the full sample is a coin-flip: 2,673 SPY trades at 49.31% wins, 2,669 QQQ trades at 49.42%.
The 60-day Yahoo window is the wrong sample: 59 SPY trades at 50.85%, 60 QQQ trades at 51.67%, and a per-bar Sharpe that changes sign with the ticker. The 60-minute hourly cousin, searched 40 times, loses slowly (SPY DSR 0.1519, QQQ DSR 0.1135). Win rate is the most photogenic statistic in day-trading screenshots, and here it is doing what it always does: hovering near a coin while the equity line fails to compound.
We do not believe “DSR failed, delete the opening range from your brain.” The open is still where a cash index eats overnight information. That is a reason to keep measuring. It is not a reason to ship.
9 / What this does not kill (untested on purpose)
A failed DSR on this vendor, these two ETFs, this implementation is not a ban on the opening range as a question. These are the next attempts we would actually run. None of the lines below have numbers attached, because this pipeline did not produce them.
- Range-quality filters. Skip the day when the opening range is tiny versus recent ATR (noise) or huge versus ATR (the move already happened). The tests above take every session. A lot of retail ORB variants don’t. That is a different rule, and it is the first variation we would add — with the trial count going up, and DSR coming with it.
- Gap / overnight-move filters. If the overnight gap already pierced what will become the opening range, the “discovery” story is different. Untested here.
- The break definition. Close-through of the range, stop-through of the high/low, last-price, or a buffer in ticks instead of bps are all different fills. We did not search fill semantics. Next-bar fills are also not a Pine
strategy()fill. Anyone pasting this next to a TradingView report is comparing two clocks. - The exit. Flatten at the cash close is the YouTube default and a harsh time stop. An earlier flatten (11:30, lunch), a stop at the other side of the range, or a hold that is allowed to run — each one is a new strategy. Untested.
- ORB as a feature, not a system. Opening-range width, minutes-until-break, and break direction are features you can feed a different edge (a trend overlay, a mean-reversion fade of a failed break, a vol-target on days the OR is wide). This run tests standalone “break and hope until the close.” A failed standalone test is the beginning of that feature conversation, not the end of it.
- Not these ETFs, or not cash. Liquid single names, a small-cap tape, ES or NQ versus SPY/QQQ basis, London open instead of New York. Supertrend already taught us the market is the hidden parameter. We ran two index ETFs.
If you take one research prompt from this piece, take a pre-trade filter on opening-range width versus ATR, with the trial count disclosed in the headline. That is the smallest change that still resembles the video, and the one this standalone “every session, one break, done by the close” test structurally did not run.
Check the next claim the same way
ToolDeflated Sharpe Ratio — 40 trials, SPY DSR 0.4011, QQQ DSR 0.2793, bar 0.95 Tool
Net-vs-Gross Costs — this run used fees 0 and slippage 1.5e-4; it did not emit a break-even Related · Teardown
Supertrend — another simple rule that lives or dies with the sample market Learn · Module 5
The validation gauntlet — overfitting, OOS, DSR, and costs in one place