Methodology
Data sources, calculations, and known limitations
Every number on this site traces back to a step documented here. Nothing is recomputed live in the browser — all of it comes from a pipeline that runs on a schedule, writes its output to disk, and gets served as-is.
Universe
The current S&P 500 constituent list (scraped from Wikipedia), plus companies that were removed from the index at some point during the 2021–2026 study window but aren't in the current list — identified using a free, community-maintained historical constituents dataset and backfilled with the same pipeline used for everything else, where Yahoo Finance still has usable data for them (many fully-delisted or acquired companies don't).
This reduces, but doesn't eliminate, survivorship bias — see Caveats below for exactly what's still not corrected.
Reaction-day detection
Yahoo Finance stamps every earnings date at a fixed time regardless of whether the report was actually released before market open or after market close, so the reaction day is inferred from a relative trading-volume spike, aggregated per company across all of that company's own earnings events (a single event's volume signal is often close to a coin flip) with a confidence score. The upcoming calendar page can show real before/after-market timing for near-term upcoming reports (via Nasdaq's public calendar), but that source has no historical timing data, so it can't retroactively fix the inferred classification used everywhere else.
Gaps, buckets, forward returns
gap_pct = (post-earnings open − pre-earnings close) / pre-earnings close, using the detected reaction day. Five configurable buckets by gap size; forward returns measured from the post-earnings open to the close 1/5/20/60 trading days later.
Market adjustment
The primary metric throughout is excess return= raw return − SPY's own return over the identical window — raw returns are dominated by general market beta, which SPY-adjustment nets out.
SPY-only adjustment doesn't account for sector momentum, company size, or value/growth exposure, so the Findings page separately re-tests the sector/market-cap segmentation against a proper Fama-French 5-factor model (market, size, value, profitability, investment), using each stock's own factor exposure estimated from a trailing year of returns ending before each event — never using future data to estimate the exposure being applied to that event.
Statistics & validation
One-sample t-test of each bucket's return distribution against zero, per horizon, with 95% confidence intervals and Benjamini-Hochberg FDR correction shown alongside raw p-values on segmented (sector/cap) tables where hundreds of comparisons are run.
The most important check: every pattern is identified on an in-sample period (2021-07–2023-12) and re-tested, unmodified, against a held-out out-of-sample period (2024-01–2026-07). A pattern only counts as “held up” if it's the same sign and independently significant in both periods.
Expected-move percentiles & the calendar
The median/75th/90th percentile of a company's historical absolute gap size (shown on its Explorer page and on the upcoming calendar) is purely descriptive of past event volatility — it says nothing about the direction or size of the next gap, which the core finding here says isn't predictable anyway. The position-size illustration on each company's page uses the same percentile purely as an educational “how bad could it realistically get” input, not a forecast.
Caveats still not corrected
- Survivorship bias is reduced, not eliminated. Only about 44% of identified removed constituents had usable Yahoo Finance data to backfill (many were fully delisted via bankruptcy or merger, or their ticker was reused by an unrelated instrument after the rename). The free historical constituents source used to find them also has demonstrated gaps for at least one long-standing current member (its data doesn't show that company as a member before a certain point despite it being one) — so it's deliberately used only to ADD companies back, never to remove/restrict a current member's history, to avoid silently deleting good data on an unreliable signal.
- Point-in-time membership isn't applied to current constituents. A company that joined the S&P 500 partway through the study window still has its full pre-joining history counted, for the same reason above.
- Multiple comparisons— hundreds of sector- and market-cap-level tests are run; some “significant” results are expected by chance alone even after FDR correction reduces this risk.
- Short window, one market regime mix— about 5 years, dominated by a bull run with one sharp bear year.
- Not investment advice. This is a research project. Nothing here is a recommendation to buy, sell, or hold anything, or to enter or size any specific position.
Source code, data pipeline, and every analysis script referenced above are on GitHub.