trigger_levels
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-09-18, from market-wide-circuit-breakers-explained.
| level | threshold | halt_rule | reference_close_label | spy_reference_close | spy_trigger_level | spy_points_to_trigger |
|---|---|---|---|---|---|---|
| Level 1 | 7% below the prior close | 15-minute halt if crossed before 3:25 p.m. ET | September 18 | 762.35 | 708.98 | 53.36 |
| Level 2 | 13% below the prior close | 15-minute halt if crossed before 3:25 p.m. ET | September 18 | 762.35 | 663.24 | 99.11 |
| Level 3 | 20% below the prior close | Halt for the rest of the day, at any time | September 18 | 762.35 | 609.88 | 152.47 |
- Rows × columns
- 3 × 7
- 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 |
|---|---|---|---|
level |
text | 3 distinct values (Level 1, Level 2, Level 3) | |
threshold |
text | 3 distinct values | |
halt_rule |
text | 2 distinct values | |
reference_close_label |
text | 1 distinct value (September 18) | |
spy_reference_close |
number | every row is 762.35 | US dollars |
spy_trigger_level |
number | 609.88 to 708.98 | |
spy_points_to_trigger |
number | 53.36 to 152.47 |
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.
the exact SQL behind every number
SELECT
concat('Level ', toString(multiIf(lv.decline_pct = 7, 1, lv.decline_pct = 13, 2, 3))) AS level,
concat(toString(lv.decline_pct), '% below the prior close') AS threshold,
if(lv.decline_pct = 20,
'Halt for the rest of the day, at any time',
'15-minute halt if crossed before 3:25 p.m. ET') AS halt_rule,
concat(monthName(ref.d), ' ', toString(toDayOfMonth(ref.d))) AS reference_close_label,
round(ref.c, 2) AS spy_reference_close,
round(ref.c * (100 - lv.decline_pct) / 100, 2) AS spy_trigger_level,
round(ref.c * lv.decline_pct / 100, 2) AS spy_points_to_trigger
FROM
(
SELECT arrayJoin([7, 13, 20]) AS decline_pct
) AS lv
CROSS JOIN
(
SELECT
date AS d,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= today() - 14
GROUP BY date
ORDER BY date DESC
LIMIT 1
) AS ref
ORDER BY lv.decline_pct
Run your own version of this
The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.
More from this analysismarket-wide-circuit-breakers-explained
march_2020_sessions
series 22×6
→
daily_recalc
series 15×5
→
halt_days
series 4×8
→
The 2s10s spread, every print of the half
table 124×2
→
The 2s10s spread, every print of the half
table 124×2
→
Every half-year since 1976: the 2y and 10y change, the twist between them, and the half's lowest 2s10s print
table 100×7
→
See all 2,358 queries →