breaks_by_year
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-01, from buy-side-vs-sell-side-liquidity.
| year | sessions | cleared_prior_high | closed_back_below | rejection_rate_pct | period_avg_rejection_pct |
|---|---|---|---|---|---|
| 2015 | 251 | 27 | 12 | 44.4 | 39.9 |
| 2016 | 252 | 53 | 19 | 35.8 | 39.9 |
| 2017 | 251 | 66 | 28 | 42.4 | 39.9 |
| 2018 | 251 | 40 | 10 | 25 | 39.9 |
| 2019 | 252 | 75 | 29 | 38.7 | 39.9 |
| 2020 | 253 | 71 | 26 | 36.6 | 39.9 |
| 2021 | 252 | 84 | 31 | 36.9 | 39.9 |
| 2022 | 251 | 33 | 13 | 39.4 | 39.9 |
| 2023 | 250 | 58 | 28 | 48.3 | 39.9 |
| 2024 | 252 | 73 | 37 | 50.7 | 39.9 |
| 2025 | 250 | 69 | 29 | 42 | 39.9 |
| 2026 | 187 | 33 | 10 | 30.3 | 39.9 |
- Rows × columns
- 12 × 6
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
year |
text | 12 distinct values (2015, 2016, 2017…) | |
sessions |
number | 187 to 253 | |
cleared_prior_high |
number | 27 to 84 | US dollars |
closed_back_below |
number | 10 to 37 | |
rejection_rate_pct |
number | 25 to 50.7 | percent |
period_avg_rejection_pct |
number | every row is 39.9 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH bars AS
(
SELECT
date,
max(toFloat64(high)) AS day_high,
max(toFloat64(close)) AS day_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2015-01-01'
AND date < '2026-10-01'
GROUP BY date
),
flagged AS
(
SELECT
date,
day_high,
day_close,
max(day_high) OVER (ORDER BY date ASC ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS prior_high
FROM bars
),
yearly AS
(
SELECT
toString(toYear(date)) AS year,
count() AS sessions,
countIf(day_high > prior_high) AS cleared_prior_high,
countIf(day_high > prior_high AND day_close < prior_high) AS closed_back_below
FROM flagged
WHERE prior_high > 0
GROUP BY year
)
SELECT
year,
sessions,
cleared_prior_high,
closed_back_below,
round(100 * closed_back_below / cleared_prior_high, 1) AS rejection_rate_pct,
round(100 * sum(closed_back_below) OVER () / sum(cleared_prior_high) OVER (), 1) AS period_avg_rejection_pct
FROM yearly
ORDER BY year
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.