Earnings Beat Streaks: Does Consecutive Beating Drive Stock Returns?

We analyzed 71,150 beat streak events on US exchanges, 2000-2025. A second consecutive beat produces +1.42% T+21 abnormal return vs SPY. Streak 2 and 3 are the sweet spot. Update August 2026: the mirror leg is now computed. Miss streaks drift -2.31% at T+21, so the signal passes its own inverse.

Grouped bar chart showing cumulative abnormal returns by beat streak length at T+1, T+5, T+21, and T+63 windows for US stocks 2000-2025.
Correction, August 2026. This study originally had no control leg: we measured returns after streak-extending beats and never measured returns after a streak breaks, so the drift below had not been tested against its own inverse. That gap is now closed. On 2026-08-29 we ran the mirror as a fresh paired run: consecutive misses drift -2.31% at T+21 (t=-25.9) while consecutive beats drift +1.05%, and the announcement that breaks a streak costs -1.20% on day one. The signal passes its own inverse; see "The Mirror Test" section. The numbers in the original tables are unchanged. See Limitations for why our global comparison post shows +0.55% at T+21 where this one shows +1.08%.ContentsMethodWhat We FoundStreak Length BreakdownThe SQL ScreenWhy It WorksThe Mirror Test (run 2026-08-29)LimitationsTakeaway

When a company beats analyst EPS estimates for two or more consecutive quarters, something measurable happens after each additional beat. We tracked this across NYSE, NASDAQ, and AMEX from 2000 to 2025 and found statistically significant cumulative abnormal returns at every window out to 63 days. The drift is real, but it's compressing.

Method

Universe: NYSE, NASDAQ, and AMEX-listed stocks with market cap above $1B USD. We required at least two consecutive quarters of EPS beats to enter the sample. Data sourced from FMP's earnings surprises endpoint, 2000–2025.

Beat definition: epsActual > epsEstimated where ABS(epsEstimated) > 0.01. The floor on estimated EPS filters near-zero estimates where percentage beats carry no information.

Windows: Cumulative abnormal return (CAR) measured at T+1, T+5, T+21, and T+63 trading days after each streak-extending announcement. The base price is the last close before the announcement, so the announcement-day move is inside every window. An earlier version of this line said T+0 was excluded, which was true of the earlier run our global comparison post uses, not of this one. See Limitations.

Benchmark: SPY (SPDR S&P 500 ETF). CAR = stock return minus SPY return over each window.

Streak counting: A streak resets to zero on any miss. Streak length is the count at the time of announcement. A company on its 4th consecutive beat contributes one event to the "streak 4" bucket.

Total events: 71,150

Data: FMP financial data warehouse, 2000–2025. Updated April 2026.


What We Found

The T+1 drift is immediate and robust. +0.51% with a t-stat of 33.90 across 71,150 events is not noise. The market reacts when a company extends a streak, but the reaction doesn't stop there.

The more interesting finding is the sustained drift. The 21-day window shows +1.08% (t=26.99), more than double the T+1 reaction. This is consistent with slow incorporation of earnings beat information. Even at T+63, the cumulative abnormal return remains at +0.93% (t=14.72), with a 51% hit rate.

This sustained drift contradicts the efficient market hypothesis. If beat streaks were immediately priced in, T+21 and T+63 returns would compress back to zero. They don't. The signal persists for months, suggesting institutional investors systematically underprice consecutive earnings beats.

Window Mean CAR t-stat N Hit Rate
T+1 +0.51% 33.90 71,150 54.3%
T+5 +1.01% 35.02 71,134 55.1%
T+21 +1.08% 26.99 71,102 53.5%
T+63 +0.93% 14.72 70,956 51.0%

Streak Length Breakdown

Streak 2 is the strongest category. The second consecutive beat produces a +1.42% CAR at T+21 and +1.21% at T+63, both statistically significant (t=17.22 and t=9.24 respectively). By streak 5+, the drift compresses to +0.86% at T+21 and +0.62% at T+63, but remains significant given the large sample.

Streak N T+1 T+21 T+63 t(21)
Streak 2 18,770 +0.60% +1.42% +1.21% 17.22
Streak 3 12,142 +0.50% +1.12% +1.03% 11.28
Streak 4 8,370 +0.55% +1.18% +1.30% 10.09
Streak 5+ 31,868 +0.45% +0.86% +0.62% 14.94

Two things stand out. First, the T+21 and T+63 returns for streaks 2-4 are remarkably consistent, all above +1%. The decay only becomes pronounced at streak 5+, suggesting the market discounts very long streaks. Second, streak 4 actually outperforms streak 3 at T+63 (+1.30% vs +1.03%), indicating non-monotonic decay.

The practical implication: streak 2 is the best entry for T+21 drift. Streak 4 shows a secondary peak at T+63, possibly due to underpricing of sustained consistency.


The SQL Screen

This query finds stocks currently on a beat streak of 3 or more consecutive quarters, ranked by streak length:

WITH ordered_earnings AS (
    SELECT symbol,
        CAST(date AS DATE) AS event_date,
        epsActual AS actual,
        epsEstimated AS estimated,
        CASE WHEN epsActual > epsEstimated THEN 1 ELSE 0 END AS is_beat,
        ROUND((epsActual - epsEstimated) / ABS(NULLIF(epsEstimated, 0)) * 100, 1) AS surprise_pct,
        ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY date DESC) AS recency_rank
    FROM earnings_surprises
    WHERE epsEstimated IS NOT NULL
      AND ABS(epsEstimated) > 0.01
      AND epsActual IS NOT NULL
),
streak_calc AS (
    SELECT *, SUM(CASE WHEN is_beat = 0 THEN 1 ELSE 0 END)
        OVER (PARTITION BY symbol ORDER BY recency_rank
              ROWS UNBOUNDED PRECEDING) AS streak_breaker
    FROM ordered_earnings
),
streaks AS (
    SELECT symbol,
        COUNT(*) AS current_streak,
        ROUND(AVG(surprise_pct), 1) AS avg_surprise_pct,
        MIN(event_date) AS streak_start,
        MAX(event_date) AS latest_beat
    FROM streak_calc
    WHERE streak_breaker = 0 AND is_beat = 1
    GROUP BY symbol
    HAVING COUNT(*) >= 3
)
SELECT s.symbol, s.current_streak, s.avg_surprise_pct,
    s.streak_start, s.latest_beat,
    ROUND(k.mktCapUSD / 1e9, 1) AS mktcap_bn
FROM streaks s
JOIN key_metrics k ON s.symbol = k.symbol AND k.period = 'TTM'
WHERE k.mktCapUSD > 1000000000
QUALIFY ROW_NUMBER() OVER (PARTITION BY s.symbol ORDER BY k.date DESC) = 1
ORDER BY s.current_streak DESC, s.avg_surprise_pct DESC
LIMIT 30

The streak_breaker column is the key logic. Earnings are ordered from most recent to oldest (recency_rank). Each time a miss appears, the running sum increments. Filtering to streak_breaker = 0 keeps only quarters from the current unbroken run. The QUALIFY clause deduplicates the key_metrics join to the most recent TTM row per symbol.

Run this screen live on Ceta Research → (pre-loaded query, no account required)


Why It Works

Post-earnings announcement drift (PEAD) has been documented since Ball and Brown (1968). The beat streaks variation adds a layer: the market appears to underweight the information content of a continuing streak.

Myers, Myers, and Skinner (2007) showed that companies with long EPS streaks are valued as if analysts expect the streak to continue, but stock price reactions to individual beats within a streak are subdued. The market discounts each beat as "expected" rather than informative.

Loh and Warachka (2012) found that stocks with high idiosyncratic volatility show stronger PEAD after earnings beats. Streak stocks tend to be lower-volatility compounders, which partly explains why the T+1 reaction is moderate rather than explosive. The slow drift out to T+21 is consistent with their findings on investor under-reaction to streak information specifically.

The mechanistic explanation: most investors anchor to the streak and don't recalibrate their forward expectations aggressively enough after each beat. The signal is that the market keeps being surprised by something that is, in retrospect, predictable.


The Mirror Test (run 2026-08-29)

Everything above measures one side of the coin: streak-extending beats. If the drift were just generic post-earnings drift, or a large-cap universe outrunning SPY, stocks on consecutive miss streaks should drift the same way. They don't.

We ran the inverse leg with the same pipeline, universe, and benchmark, flipping the event to a second or later consecutive miss (epsActual < epsEstimated, strict, so an exact meet breaks both kinds of streak). Fresh run, so the beat leg re-ran too; it reproduced this post's numbers almost exactly (+1.05% at T+21, t=26.2, n=72,026 vs the published +1.08%, n=71,150).

Leg N T+1 T+5 T+21 T+63
Beat streaks (2026-08-29 rerun of this post's leg) 72,026 +0.51% +1.00% +1.05% +0.88%
Miss streaks (mirror) 22,492 -0.76% -1.86% -2.31% -3.16%
Streak breaks (first non-beat after a streak) 17,959 -1.20% -2.63% -2.70% -3.09%

All rows significant at p<0.01; miss-leg t-stats range from -21.9 to -31.7, break-leg from -24.0 to -45.1. Event-level artifacts: beat-streaks/results/mirror-2026-08/ in the public repo.

Three readings. First, the direction test passes: the market distinguishes good streaks from bad ones, which is exactly what a universe-drift artifact can't do. Second, the miss side is bigger than the beat side, -2.31% against +1.05% at T+21, the same short-side asymmetry we found in PEAD, and consistent with short-sale constraints slowing the repricing of bad news. Third, the streak-break penalty Myers, Myers and Skinner (2007) documented on their data is now measured on ours: breaking a streak costs -1.20% by T+1 and keeps costing through T+63.


Limitations

The miss-streak control was run after publication. The original design measured streak-extending beats only, which left the drift untested against its own inverse. The 2026-08-29 mirror run above closes that: miss streaks drift -2.31% at T+21 and streak breaks are punished from day one. What the mirror does not test is the finer claim that streak length carries information; the category-level comparison (does a 5th miss hurt more than a 2nd?) is measured in the mirror artifacts but not analyzed here.

Two conventions, two numbers: Our global comparison post reports +0.55% at T+21 for this same market and period. That post starts the return window at the announcement-day close. This post uses a later run where T+0 is the last pre-announcement close, so the announcement-day move sits inside every window. +0.55% plus the +0.51% T+1 move lands at +1.06%, close to the +1.08% here. Neither is wrong, but the two describe different entry points, and a trader entering after the announcement gets the smaller one. The T+1 figure in the table above is the part that isn't available to anyone who wasn't already holding.

Survivorship bias: This study uses stocks with available earnings data. Companies that delisted due to failure are underrepresented, which biases CAR estimates upward.

Domicile: the universe is selected by exchange, which selects listings rather than companies. On some exchanges that wrecks the result. Not here. We ran the split on the earlier run behind our comparison post (73,386 events, +0.55% at T+21): 83.6% of events belong to US-domiciled companies, and splitting them out strengthens the number rather than weakening it, +0.61% at T+21 (t=15.14, n=61,311) against +0.30% (t=3.02, n=11,990) for the ADR and foreign-issuer block. Dilution, not fabrication.

Market cap filter: The $1B floor excludes small caps, where the effect is likely larger but liquidity is worse. The results here apply to institutional-grade names.

Benchmark simplification: SPY is a US-only market-cap-weighted index. Sector tilts in beat streak stocks (typically technology, healthcare, consumer discretionary) mean SPY may not be the tightest benchmark. Sector-adjusted CARs would likely be smaller.

Transaction costs: The T+1 numbers look tradeable in aggregate, but earnings announcements happen after hours. Getting filled at the open after a surprise can be expensive for larger positions. The T+21 drift is more practically accessible.

Look-ahead bias in the screen: The SQL query above is designed as a screening tool, not a backtest entry signal. The historical results in this study use point-in-time data. Applying the screen as-is to historical dates would require careful data snapshotting.


Takeaway

US beat streaks produce statistically reliable drift across all measured windows. The T+21 window (+1.08%, t=26.99) is particularly robust, and the T+63 drift remains significant at +0.93% (t=14.72). Early streaks (streak 2) are the strongest entry point, but even streak 5+ shows meaningful drift.

Two things to hold alongside that. The +0.51% announcement-day move sits inside the +1.08%, and capturing it means holding the stock through the print. And as of the 2026-08-29 mirror run, "beat streaks drift up" has been checked against its inverse: miss streaks drift down -2.31% at T+21 and streak breaks cost -1.20% on day one. The drift is directional, not a universe artifact, which is more than we could honestly claim when this post first went up.

Part of a series: Beat streaks analyzed across 16 exchanges. See Canada, Japan, Taiwan, India, Brazil, and the global comparison.


Data: FMP earnings surprises + key metrics, 2000–2025. NYSE, NASDAQ, AMEX. Market cap > $1B USD. 71,150 streak events. Abnormal returns vs SPY. T+0 is the last pre-announcement close, so the announcement-day move is inside every window. Miss-streak and streak-break mirror legs computed 2026-08-29 as a fresh paired run; see "The Mirror Test" section.


Past performance does not guarantee future results. This is educational content, not investment advice.