Research findings

Do earnings-day gaps predict forward returns?

Tested whether earnings-day price gaps predict forward returns across 10,261 events in the S&P 500. After controlling for general market movement, no tradeable edge survives out-of-sample testing.

Underlying data last refreshed October 11, 2026.

What this rules out — and what it doesn't

Ruled out

  • −A gap-specific momentum or reversal effect independent of general market movement
  • −A tradeable edge that survives realistic transaction costs

Not ruled out

  • ?One borderline pattern (small-gap-down, 20 days) that has replicated out-of-sample at roughly the rate chance alone would produce at this sample size — not evidence of a real effect on its own, and it doesn't survive transaction costs
  • ?Sector- or size-factor-driven patterns (real estate, small-caps) — not independently tested out-of-sample
  • ?A genuine effect too small or noisy to detect with 5 years of data and a SPY-only benchmark
  • ?A cleaner result from a size/sector-matched benchmark instead of SPY alone

This distinction is the difference between rigorous research and a failed experiment: a null result reached by controlling for market beta and testing out-of-sample is a real finding, even though (especially because) it doesn't confirm a tradeable edge.

Methodology, in brief

Universe & data

Current S&P 500 constituents (survivorship-biased), daily OHLCV and historical earnings dates via yfinance, 2021-09-20 to 2026-08-26. 546 companies, 10,261 earnings events, 728,219 price rows.

Reaction-day detection

Earnings timestamps don't reliably say before/after market close, so the reaction day is inferred from a volume-spike heuristic, aggregated per company with a confidence score rather than trusted event-by-event.

Gap buckets & forward returns

Five configurable buckets by overnight gap size; forward returns from the post-earnings open at 1, 5, 20, and 60 trading days.

Market adjustment & validation

Excess return = raw return minus SPY's own return over the identical window. In-sample (2021-07–2023-12) patterns re-tested unmodified against a held-out out-of-sample period (2024-01–2026-07).

Horizon

1.Raw returns are mostly market beta

Same gap buckets, split by whether the S&P 500 itself was up or down over the same forward window. Every bucket swings by a similar magnitude in lockstep with the market — the bucket itself explains very little.

2.Raw vs. market-adjusted (excess) returns

Excess return nets out general market movement. Effect sizes shrink by roughly an order of magnitude once beta is removed — this is the metric that actually isolates a gap-specific effect, if one exists. Error bars are 95% confidence intervals.

3.Out-of-sample validation — the most important check

In-sample (2021-07 to 2023-12) vs. out-of-sample (2024-01 to 2026-07), on excess returns. 2 of the 20 bucket x horizon combinations were significant, same-signed, and significant in both periods. Error bars are 95% confidence intervals.

4.Transaction cost check

A flat 0.1% slippage-and-spread assumption per side (0.2% round trip), subtracted from every individual excess return before re-testing significance.

BucketGross returnNet of costp-value (net)Survives?
Big gap down-0.22%-0.42%0.167No
Big gap up0.13%-0.07%0.801No
Flat-0.45%-0.65%0.000No
Small gap down-0.54%-0.74%0.000No
Small gap up-0.12%-0.32%0.033No

No bucket at this horizon survives a 0.2% round-trip cost assumption net of costs.

More significant hits than pure chance would predict against SPY alone — but SPY doesn't net out sector or size exposure. Re-tested below against a matched benchmark (sector ETF, or a size-tercile ETF) with the same out-of-sample bar used everywhere else on this page.

Against SPY alone (pooled, not yet out-of-sample tested)

BucketSectornMean returnp-value
FlatReal Estate232-1.92%0.0000
FlatConsumer Discretionary192-2.09%0.0003
FlatHealth Care220-1.86%0.0004
Small gap downHealth Care319-1.66%0.0004
Small gap upReal Estate166-1.39%0.0025
Big gap downConsumer Discretionary215-1.76%0.0188
Small gap downReal Estate127-1.32%0.0204
Big gap downInformation Technology3331.51%0.0297
Big gap upInformation Technology3541.60%0.0329

Re-tested: matched benchmark + out-of-sample

Of 220 sector × bucket × horizon combinations, 2held up out-of-sample against its own sector's benchmark (same-signed and significant in both periods). Of 60 market-cap combinations, 0held up. Both are close to the ~5% false-positive rate chance alone would produce at this sample size — the SPY-flagged effects mostly don't survive a fairer test. The table below shows exactly what happened to each SPY-flagged effect from above.

BucketSectornvs. SPYvs. matched benchmarkHeld up OOS?
FlatReal Estate232-1.92% (p=<0.001)-0.75% (p=0.054)No
FlatConsumer Discretionary192-2.09% (p=<0.001)-1.71% (p=0.007)No
FlatHealth Care220-1.86% (p=<0.001)-0.94% (p=0.053)No
Small gap downHealth Care319-1.66% (p=<0.001)-1.39% (p=0.001)Yes
Small gap upReal Estate166-1.39% (p=0.002)-0.60% (p=0.133)No
Big gap downConsumer Discretionary215-1.76% (p=0.019)-1.23% (p=0.093)No
Small gap downReal Estate127-1.32% (p=0.020)-0.73% (p=0.142)No
Big gap downInformation Technology3331.51% (p=0.030)0.54% (p=0.416)No
Big gap upInformation Technology3541.60% (p=0.033)0.86% (p=0.223)No

6.Does the EPS surprise itself predict anything?

Every event already carries an EPS surprise % (reported vs. estimated EPS). Tested separately from gap size: does the magnitude of the surprise correlate with the gap, or with forward excess returns?

Surprise magnitude vs. gap size

A handful of extreme outliers (surprise_pct ranges from about −10,000% to +15,900% in this dataset — almost certainly near-zero EPS estimates blowing up the percentage) can dominate a raw correlation, so three views are reported side by side rather than picking one. This one holds up: Spearman correlation is strong both in-sample (ρ=0.35) and out-of-sample (ρ=0.29) — bigger surprises produce bigger gaps, consistently.

PeriodnPearson r (raw)Pearson r (winsorized)Spearman ρSpearman p
Overall102500.026 (p=0.008)0.165 (p=<0.001)0.317<0.001
In-sample47970.031 (p=0.033)0.212 (p=<0.001)0.348<0.001
Out-of-sample54530.024 (p=0.077)0.130 (p=<0.001)0.294<0.001

Trend line fit on winsorized surprise % (clipping extreme outliers) across all 10,250 events: R² = 0.027, slope = 0.00029 (p < 0.001). Chart display clips |surprise| to 100% and samples up to 2,000 points for readability — the fit statistics use every event.

Surprise magnitude vs. 20-day excess return

Correlation with forward returns is much weaker than with gap size, and mostly doesn't hold up out-of-sample — consistent with the project's main finding.

PeriodnPearson r (raw)Pearson r (winsorized)Spearman ρSpearman p
Overall10250-0.003 (p=0.727)0.015 (p=0.119)0.0290.004
In-sample47970.002 (p=0.914)0.012 (p=0.408)0.0210.143
Out-of-sample5453-0.006 (p=0.677)0.027 (p=0.044)0.0350.010

Excess return by surprise quintile, 20d

Faded bars are not statistically significant at this horizon. 1of the 20 quintile × horizon combinations holds up out-of-sample(same sign and significant in both periods) — right around the ~1-in-20 rate chance alone would produce. Which specific combination (if any) clears the bar has flipped before as the underlying data was refreshed and survivorship bias was reduced (see Methodology), so this is treated as noise rather than a discovery either way. Consistent with the project's main finding.

7.Does a proper multifactor benchmark change anything?

SPY-only adjustment nets out broad market beta but not sector, size, value, or profitability exposure. Re-testing against a Fama-French 5-factor model — each stock's own factor exposure estimated from a trailing year of returns ending before each event, never using future data — surfaces slightly more than the SPY-only comparison.

2 of 20bucket × horizon combinations held up out-of-sample under the multifactor adjustment (vs. 2 of 20under SPY-only) — still close to the ~1-in-20 rate expected by chance at a 5% threshold, so this isn't strong evidence of a real effect, but worth naming exactly:

  • Big gap up, 1 day: a small negativefactor-adjusted return, significant in both periods (−0.53% in-sample, −0.40% out-of-sample) — consistent with a short-term reversal after a large positive factor-adjusted gap, not continuation.
  • Small gap down, 60 days: a larger negative factor-adjusted return, significant in both periods (−1.37% in-sample, −2.17% out-of-sample) — further underperformance, not a rebound.

Both are negative (predicting further under-performance, not a buyable edge) and both are exploratory given 2-of-20 is barely above the chance rate — flagged here for completeness, not promoted to a confirmed finding.

Caveats

  • Survivorship bias — the universe is the current S&P 500 list applied retroactively; companies removed from the index during the window are absent.
  • Short window, one market regime mix — 5 years, dominated by a bull run with one sharp bear year.
  • SPY-only market adjustment nets out broad beta but not sector or size-factor exposure — re-tested in Finding 5 against a matched benchmark, and most segmented effects vanish, consistent with them being factor exposure rather than a gap-specific effect. The size-tercile benchmark is itself an approximation (see Finding 5), and headline Findings 1–4 still use SPY only.
  • Reaction-day detection is a heuristic, not ground truth — confidence-scored, and a robustness check excluding the lowest-confidence tickers didn't change conclusions.
  • Multiple comparisons — 220 sector-level and 60 market-cap-level tests were run against SPY; after a Benjamini-Hochberg FDR correction, 13 of 220 sector combinations and 12of 60 market-cap combinations remain significant (down from the raw 5% threshold count) — and per Finding 5, even those don't hold up out-of-sample against a matched benchmark.
  • Daily bars only, no intraday data.