What Happens After a Big One-Day Gain
How the next session split: gapped up, gapped up and faded, closed highertable ·
2026-10-04 · 5×5
Overnight gap versus intraday run: what the next session didtable ·
2026-10-04 · 3×5
Next-session returns after a big one-day gain, by size of the gaintable ·
2026-10-04 · 5×5
The full spread of next-session returns for top-20 daily gainersranking ·
2026-10-04 · 5×3
Sample coverage and next-session medians, year by yeartable ·
2026-10-04 · 4×5
The 7% Sell Rule Explained: O'Neil's Stop-Loss
Position size allowed by a $500 risk budget at each stop distanceranking ·
2026-09-12 · 3×2
Gain needed to get back to even after a lossranking ·
2026-09-12 · 6×3
Stop Order vs Stop-Limit Order: How Each Fills
Average one-minute high-low range by time of dayseries ·
2026-08-08 · 13×3
Sessions that gapped through a 2% stop, and whether the limit price tradedranking ·
2026-08-08 · 5×3
NVDA's largest gap-down opens and the 30 minutes that followedseries ·
2026-08-08 · 8×3
How often each stock opened below the prior closeranking ·
2026-08-08 · 5×3
Do Stock Gaps Always Get Filled? The Data
Average one-minute range and volume by time of day, 2025series ·
2026-08-06 · 26×3
Same-session gap fill rate by gap size, eight large caps, 2021 to 2026ranking ·
2026-08-06 · 5×3
Gap fill rate by how heavy the gap day's volume wasranking ·
2026-08-06 · 3×4
Share of 1%+ gaps filled, by how long you waitranking ·
2026-08-06 · 4×3
Why Do Stocks Gap Up or Down Overnight?
Overnight gaps by ticker, H1 2026: average absolute gap and the single biggest gapseries ·
2026-07-26 · 6×5
MSFT straddle prices at the close before the gap: Jan 28, 2026, Jan 30 expirytable ·
2026-07-26 · 4×5
MSFT: how the January 29, 2026 gap formed, 30-minute premarket bucketsseries ·
2026-07-26 · 11×8
SPY, H1 2026: average absolute overnight gap vs average absolute intraday movescalar ·
2026-07-26 · 1×4123
What crossed the wire during SPY's biggest overnight gap of H1 2026table ·
2026-07-26 · 2×3
SPY overnight gaps by weekday: every session, January 2024 through June 2026series ·
2026-07-26 · 5×4
SPY's six biggest overnight gaps of H1 2026: and the same day's open-to-close moveseries ·
2026-07-26 · 6×3
How the next session split: gapped up, gapped up and faded, closed higher
How the next session split: gapped up, gapped up and faded, closed higher
| gain_bucket | observations | gapped_up_pct | gapped_up_then_faded_pct | closed_higher_pct |
|---|---|---|---|---|
| under 10% | 663 | 49.6 | 24.9 | 47.5 |
| 10 to 15% | 2752 | 48.4 | 27.4 | 44.7 |
| 15 to 25% | 5743 | 45.8 | 26.1 | 43.1 |
| 25 to 50% | 4133 | 42.3 | 24.4 | 41.1 |
| 50% and up | 1689 | 31.2 | 19.5 | 32.7 |
the exact SQL behind every number
WITH bars AS
(
SELECT
ticker,
date,
max(toFloat64(open)) AS o,
max(toFloat64(close)) AS c,
max(toFloat64(volume)) AS vol
FROM global_markets.stocks_daily_aggs
WHERE date >= today() - 1095
AND date <= today() - 2
AND ifNull(otc, 0) = 0
AND ticker NOT IN ('SPCX')
GROUP BY ticker, date
),
seq AS
(
SELECT
ticker,
date,
c,
vol,
lagInFrame(c) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_c,
leadInFrame(o) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_o,
leadInFrame(c) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_c,
leadInFrame(date) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_date
FROM bars
),
movers AS
(
SELECT
date,
ticker,
100 * (c / prev_c - 1) AS gain_pct,
100 * (next_o / c - 1) AS next_gap_pct,
100 * (next_c / next_o - 1) AS next_oc_pct,
100 * (next_c / c - 1) AS next_cc_pct,
row_number() OVER (PARTITION BY date ORDER BY c / prev_c DESC, ticker ASC) AS rnk
FROM seq
WHERE prev_c >= 5
AND next_o > 0
AND next_c > 0
AND c * vol >= 5000000
AND dateDiff('day', date, next_date) <= 6
)
SELECT
multiIf(gain_pct < 10, 'under 10%',
gain_pct < 15, '10 to 15%',
gain_pct < 25, '15 to 25%',
gain_pct < 50, '25 to 50%',
'50% and up') AS gain_bucket,
count() AS observations,
round(100 * countIf(next_gap_pct > 0) / count(), 1) AS gapped_up_pct,
round(100 * countIf(next_gap_pct > 0 AND next_oc_pct < 0) / count(), 1) AS gapped_up_then_faded_pct,
round(100 * countIf(next_cc_pct > 0) / count(), 1) AS closed_higher_pct
FROM movers
WHERE rnk <= 20
GROUP BY gain_bucket
ORDER BY min(gain_pct) ASC
More from this analysisWhat Happens After a Big One-Day Gain
Next-session returns after a big one-day gain, by size of the gain
table 5×5
→
Sample coverage and next-session medians, year by year
table 4×5
→
Overnight gap versus intraday run: what the next session did
table 3×5
→
The full spread of next-session returns for top-20 daily gainers
ranking 5×3
→
See all 3,256 queries →