Skip to main content
US market 17 min read

Post-Earnings Announcement Drift Strategy: A US Earnings Surprise Backtest (2016-2026)

Post-earnings announcement drift strategy tested on US stocks: 19,933 earnings events, decile and IC tests, and a breadth-gated ETF backtest at 32.0% CAGR.

Do stocks really keep drifting after an earnings beat? CAGR 32.0% Sharpe 1.47

Post-earnings announcement drift strategy backtest equity curve vs QQQ, SPY and naive TQQQ, 2016-2026

Reproduce it

Run this strategy

Copy the prompt to reproduce the evidence above with the article’s data, assumptions, and risk checks.

Tell your AI:

Help me set up FinLab and reproduce the U.S. earnings-surprise breadth strategy in this article. Please read: https://finlab.finance/en/setup?relatedUrl=/en/blog/us-earnings-surprise-strategy

No install, open FinLab Studio

A post-earnings announcement drift strategy bets that stocks which beat analyst estimates keep outperforming for weeks after the report. The effect is one of the oldest documented anomalies in finance, and this article tests it the hard way: a 19,933-event study and decile sorts across the full liquid US universe first, then a tradable strategy built from what the data actually supports, backtested with real, downloadable finlab code.

Two findings shape everything below. First, picking individual stocks by earnings surprise barely worked in liquid US large caps over 2016-2026; the single-name edge is small and driven mostly by avoiding misses. Second, the breadth of positive surprises across the market turned out to be a useful risk-on signal, and that is the version that trades: 32.0% CAGR at a 1.57 monthly Sharpe and a -21.1% maximum drawdown, against 20.7% / 1.09 / -35.1% for buying and holding the Nasdaq-100 (QQQ) over the same dates. The strategy never holds the surprise stocks themselves. It holds leveraged growth ETFs when surprise breadth and the market trend agree, and defensive ETFs otherwise. It also passes all three robustness checks further down: neighbouring parameters, the two halves of the backtest, and a 0.1% trading cost on every buy and sell. This is one of ten US systems built on the same execution engine, compared side by side in the US quant trading strategies overview.

The numbers at a glance

Metric This strategy QQQ (buy & hold) SPY (buy & hold) TQQQ (naive buy & hold)
CAGR 32.0% 20.7% 15.1% 40.6%
Monthly Sharpe (no risk-free rate) 1.57 1.09 1.01 0.87
Monthly Sortino 4.28 1.75 1.45 1.46
Max drawdown -21.1% -35.1% -33.7% -81.7%
Annualized volatility 19.9% 22.0% 17.5% 65.2%

Window: 2016-05-02 to 2026-10-26 for every column, with Sharpe and Sortino computed from monthly returns without a risk-free rate. finlab's own report statistic, which subtracts a 2% risk-free rate, puts the strategy's monthly Sharpe at 1.47. On the chart above, where every line starts at 1on2016−05−02,thestrategyendsatabout1 on 2016-05-02, the strategy ends at about 18.4, QQQ at 7.2,SPYat7.2, SPY at 4.4, and a naive TQQQ buy-and-hold at $35.5 after an -81.7% drawdown along the way. As with the momentum version of this engine, the raw return of 3x leverage was always available; the strategy's contribution is deciding when not to hold it. Benchmarks use total-return (dividend-adjusted) prices, and the default simulation charges no fees or slippage; the cost check and the method section cover what that leaves out.

What post-earnings announcement drift is

Post-earnings announcement drift (PEAD) is the tendency of stock prices to keep moving in the direction of an earnings surprise for weeks or months after the announcement, instead of adjusting instantly. Markets underreacting to earnings news was first documented by Ball & Brown (1968), and the drift was established as a systematic, exploitable pattern by Bernard & Thomas (1989), who showed prices respond to earnings news with a delay rather than all at once. Foster, Olsen & Shevlin (1984) found the drift scales with the size of the surprise and is stronger in smaller firms — a detail that matters here, because this test deliberately restricts itself to the most liquid 500 US names, where the anomaly faces its toughest conditions.

The surprise measure used throughout is the standard one: (actual EPS − analyst estimate) / |estimate|, from FinLab's us_earnings_surprises dataset. The actual EPS in that dataset is on the same basis as the analyst estimate (mostly adjusted EPS, split-adjusted afterwards), so it can differ from the GAAP EPS in the income statement. Surprises exist only on announcement dates, so this is event data, and each stock's factor value is its most recent surprise within the last 63 trading days (one quarter).

See the U.S. earnings-surprise strategy page for more details.

Copy this prompt to your AI agent

FinLab's setup path is now one prompt. Paste it into Codex app or Claude cowork, and the AI will read https://finlab.finance/en/setup, install the FinLab skill when needed, then run or modify the strategy in this article.

Show Code
Help me set up FinLab and build an earnings surprise strategy: https://finlab.finance/en/setup

The setup page is https://finlab.finance/en/setup.

Layer one: does earnings surprise pick stocks?

Before building anything tradable, the factor has to be tested across the whole universe: the top 500 US stocks by 60-day average dollar volume, with a 5minimumprice,an5 minimum price, an 8M dollar-volume floor, and a rolling filter that removes any name for a year after a single-day move of 50% or more. About 478 names carry a fresh surprise ranking in an average month. Sorting them into deciles by their most recent earnings surprise and measuring the next month's average return gives the cleanest read.

Average next-month return by US earnings surprise decile, biggest miss to biggest beat

Surprise decile Avg. next-month return
D1 (biggest miss) 1.08%
D2 0.99%
D5 1.16%
D8 1.80%
D9 1.35%
D10 (biggest beat) 1.34%

The gradient is weak and lumpy. Deciles D1 through D7 sit in a narrow band between 0.99% and 1.21% a month, D8 stands alone at 1.80%, and the biggest beats in D10 (1.34%) did no better than D9 (1.35%). A long-short portfolio of top minus bottom decile returned only +3.11% annualized (0.26% a month) with a 52.3% monthly hit rate, and the top decile beat the equal-weight universe in just 49.2% of months. Compare that with the same universe sorted by 12-1 momentum, where the top decile out-earned the bottom by 1.84% per month in the US momentum study. As a stock-picking signal in liquid large caps after 2016, earnings surprise produced about one seventh of that spread.

The event study sharpens the picture. Across 19,933 in-universe earnings announcements (10,067 beats above 5%, 5,932 small beats of 0-5%, 3,934 misses), abnormal returns are measured against the equal-weight liquid universe for 60 trading days after each report:

PEAD event study: 60-day abnormal returns after US earnings beats and misses, 19,933 events

Stocks that beat estimates by more than 5% held a +0.40% abnormal return after 20 trading days and +0.55% after 60, while misses drifted down to -1.41% — a beat-minus-miss spread of about 1.96 percentage points, with most of it coming from the miss side. Small beats of 0-5% drifted down as well, to -0.93% after 60 days, so a narrow beat behaved more like a miss than like a clear beat. The drift survives in modern large caps, but mainly as a warning to avoid disappointments rather than a reason to chase beats: only 48.6% of big beats went on to outperform the universe over the next 60 days, so the positive average rides on a right tail of large winners. Measured against cap-weighted QQQ instead of the equal-weight universe, every bucket drifts negative (-0.7% for beats, -3.0% for misses), because a handful of mega-cap tech names beat the average stock over this decade regardless of anyone's earnings surprise.

One result cuts against intuition. Beats that fell on the report day went on to drift +0.95% over the next 60 days, while beats greeted with a positive day-0 pop added only +0.25%. At the single-stock level, the obvious trade of buying strength after a good report had little left to capture in this sample; the same-day reaction matters later as a market-level confirmation, where it filters which events count toward the regime signal.

The rank information coefficient confirms how thin the cross-sectional signal is. The rank IC is the rank correlation between this month's surprise and the next period's return; consistently positive values mean the factor carries predictive information.

Rolling 12-month rank IC of the US earnings surprise factor with strategy equity overlay

Horizon Mean rank IC IC information ratio
1 month 0.010 0.12
2 months 0.011 0.14
3 months 0.009 0.11
6 months 0.013 0.14

A mean 1-month IC of 0.010 is positive but small, a little below the 0.012 that 12-1 momentum shows on the same universe. The rolling 12-month IC in the chart also spends long stretches below zero, including most of 2022. The IC stays positive at every horizon out to six months and is highest there (0.013), with a dip at three months; there is no sign of the reversal you would expect if the initial reaction were an overshoot, which fits the delayed-response mechanism in Bernard & Thomas. The close relationship between earnings news and price continuation is also why Chordia & Shivakumar (2006) found that earnings momentum largely subsumes price momentum: the two anomalies share an engine, and by 2016-2026 the large-cap version of this one had been mostly arbitraged thin.

An unlevered portfolio that simply holds the top surprise decile, equal weight, rebalanced monthly, makes the verdict concrete:

Top-decile earnings surprise stocks vs equal-weight universe vs QQQ, unlevered growth of $1

The top-decile basket ran ahead of the equal-weight universe through 2021, fell behind it for most of 2022-2025, and finished only slightly above it; both ended far below cap-weighted QQQ. Holding surprise stocks directly would have underperformed an index fund. That is the case, on this data, for using the factor a different way.

Layer two: surprise breadth as a regime gate

If individual surprises barely sort stocks, what does the aggregate say? When a large share of companies are beating estimates and the market is rewarding them the same day, earnings season is confirming the uptrend; when beats dry up or get sold, fundamentals have stopped cooperating. The strategy measures this as surprise breadth: the rolling 20-day count of in-universe events with a surprise above 5% and a positive same-day reaction, divided by the size of the universe.

US positive earnings surprise breadth with 1% risk-on threshold and strategy equity, 2016-2026

Breadth is strongly seasonal: it spikes in every quarterly earnings season, peaking at 28.7% of the universe, and falls toward zero between seasons (the low is 0.2%), averaging 7.0% across the sample. The risk-on threshold of 1% is therefore loose by design — it asks whether the most recent earnings season produced any meaningful cohort of well-received beats, and stays on through the quiet weeks that follow. Risk-on requires three conditions at once: breadth above 1%, QQQ above its 200-day average, and positive 6-month QQQ momentum. All three held on 71% of days. Breadth dips under the 1% line only briefly, near the end of the quiet stretch between seasons, so long risk-off stretches such as 2022 came from the QQQ trend conditions while breadth kept spiking each season.

One data caveat belongs here rather than in a footnote. Only companies with analyst estimates generate surprise events, so the factor's coverage of the universe averages 84% but dipped as low as 40% early in the sample. Breadth built on sparse coverage is noisier, which is one more reason the signal is used as a coarse on/off gate with a low threshold rather than a finely tuned dial.

Layer three: what the strategy actually holds

The execution engine is shared across the whole strategy family and is explained in full in the overview of all ten US systems; the short version is that risk-on buys the two leveraged growth ETFs (TQQQ and TECL, weighted by 126-day momentum), risk-off rotates to the strongest of IEF, GLD, or SHY by 3-month-minus-1-month momentum, rebalancing is monthly, and an 8% intramonth stop moves the book to cash when touched.

One mechanical detail changes how the results should be read: the book is usually a blend, never a clean all-in/all-out switch. The strongest defensive ETF is always held, and risk-on adds the two leveraged ETFs next to it, so the simulator normalizes the book. Over the full backtest the portfolio was a 50% defensive + 25% TQQQ + 25% TECL blend on 63% of days, fully defensive on 30%, fully leveraged on only 4%, and in cash on 2% (after stops). The average leveraged weight was 36% of the book — about 1.1x effective market exposure expressed through 3x funds — which is how a strategy holding TQQQ can keep its worst drawdown near -21%.

The data behind it

Everything runs on FinLab's US datasets, and the readable core of the strategy fits in one block. The full position construction, the extreme-move filter, and the sim() call are in the downloadable script.

Show Code
import finlab
from finlab import data
 
finlab.login()  # finlab opens a login prompt automatically
 
# Single-stock market: prices, volume, and the earnings-surprise events
data.set_market("us")
close = data.get("us_price:adj_close")      # adjusted: used for returns
raw_close = data.get("us_price:close")      # unadjusted: used for dollar volume and the $5 floor
volume = data.get("us_price:volume")        # not split-adjusted
eps_actual = data.get("us_earnings_surprises:eps_actual")
eps_estimated = data.get("us_earnings_surprises:eps_estimated")
 
# ETF market: what the strategy actually holds
fund_close = data.get("us_fund_price:adj_close")[["QQQ", "TQQQ", "TECL", "IEF", "GLD", "SHY"]]
 
# 1. Liquid universe: top 500 by 60-day dollar volume, price above $5
dollar_volume = (raw_close * volume).rolling(60, min_periods=20).mean()
universe = (
    dollar_volume.is_largest(500)
    & (dollar_volume > 8_000_000)
    & (raw_close > 5)
)
 
# 2. Earnings surprise in % of the estimate (values exist only on report days)
surprise = (eps_actual - eps_estimated) / eps_estimated.abs()
 
# 3. Breadth: share of the liquid universe with a >5% beat and a positive
#    same-day reaction over the trailing 20 trading days
reaction = close / close.shift(1) - 1
positive_events = universe & (surprise > 0.05) & (reaction > 0)
event_count = positive_events.rolling(20, min_periods=1).sum().sum(axis=1)
breadth = event_count / universe.sum(axis=1)
 
# 4. Risk-on when surprise breadth and the QQQ trend agree
qqq_trend = fund_close["QQQ"] > fund_close["QQQ"].rolling(200, min_periods=100).mean()
qqq_momentum = fund_close["QQQ"] / fund_close["QQQ"].shift(126) - 1
risk_on = (breadth > 0.01) & (qqq_trend & (qqq_momentum > 0)).reindex(breadth.index)
 
# 5. Always hold the strongest of IEF / GLD / SHY; risk-on adds TQQQ + TECL
#    (position construction and sim() are in the downloadable strategy.py)

us_price:adj_close is dividend- and split-adjusted, so reactions and benchmarks are not distorted by corporate actions. us_price:volume is not split-adjusted, which is why dollar volume and the price floor use the unadjusted close. The leveraged ETF series already embed each fund's daily-reset behavior and expense ratio.

Results and the out-of-sample test

Here is the interactive finlab report — drawdowns, monthly returns, and the trade list — so you can inspect the result directly rather than trust a summary:

The parameters were chosen on 2016-2021 data and left untouched on 2022-present, an unseen stretch that includes the 2022 bear market.

US earnings surprise strategy CAGR and Sharpe, research 2016-2021 vs out-of-sample 2022-present

Period Strategy CAGR Strategy Sharpe (monthly, no risk-free rate) Strategy max DD QQQ CAGR QQQ Sharpe (monthly, no risk-free rate)
Research (2016-2021) 34.4% 1.61 -21.1% 27.2% 1.53
Out-of-sample (2022-present) 29.2% 1.53 -19.3% 13.3% 0.82

The split deserves a careful reading. In the research window the strategy's monthly Sharpe of 1.61 was barely above QQQ's 1.53 — in the long 2016-2021 bull market, the gate added return (34.4% against 27.2% CAGR) but almost nothing on a risk-adjusted basis. Out of sample, the strategy's own Sharpe slipped to 1.53 and its CAGR to 29.2%, while QQQ's Sharpe fell much further, to 0.82. Most of that gap is 2022: the strategy lost 5.8% in the calendar year against QQQ's 32.6%, and its worst out-of-sample drawdown was -19.3% (March to September 2022) against QQQ's -34.8%. SPY's monthly Sharpe fell the same way, from 1.21 in-sample to 0.89 out-of-sample. The strategy held its level on unseen data, which is a point in its favor, but the gap over QQQ there rests mostly on one bear market the gate happened to handle well.

Robustness checks: neighbouring parameters, two halves, trading costs

Each check asks one question: does the strategy still beat QQQ? Here "beats QQQ" means a higher daily Sharpe ratio (mean daily return over its standard deviation, annualized with √252, no risk-free rate) than buying and holding QQQ with dividends over exactly the same dates.

Earnings surprise strategy daily Sharpe across 9 neighbouring parameter sets: surprise-breadth threshold 0.75%, 1.00%, 1.25% by QQQ trend average 150, 200, 250 days, all above QQQ's 0.95

Neighbouring parameters: 9 of 9 beat QQQ. The two parameters varied are the surprise-breadth threshold (0.75%, 1.00%, or 1.25% of the liquid universe; the strategy uses 1.00%) and the length of the QQQ trend average (150, 200, or 250 days; the strategy uses 200). Across the nine combinations the daily Sharpe ranges from 1.37 to 1.47, against 0.95 for QQQ. The 150-day and 200-day columns give identical results in this run.

Two halves: both beat QQQ. The backtest window is cut in half by trading days, and each half is scored on its own:

Half Dates Strategy daily Sharpe QQQ daily Sharpe
First half 2016-05-02 to 2021-07-08 1.60 1.20
Second half 2021-07-08 to 2026-10-26 1.34 0.71

Trading costs: still beats QQQ. finlab's US market defaults charge zero commission and zero tax, so the default run has no cost at all. Charging 0.1% on every buy and every sell, as a stand-in for spread and slippage, brings CAGR to 30.4% and the daily Sharpe to 1.41, against QQQ's 0.95.

Verdict: passes all three checks. To rerun them yourself: python strategy.py --validate.

Backtest method and limits

Item This backtest
Transaction costs Zero in the default run — finlab's US market defaults charge no commission and no tax (zero-commission brokers). The cost check above charges 0.1% per buy and per sell: CAGR 30.4%, daily Sharpe 1.41, still above QQQ's 0.95.
Slippage Not modeled in the default run; the 0.1%-per-side cost check stands in for spread and slippage.
Leverage decay Already reflected — TQQQ/TECL price series include daily-reset drag and expense ratios.
Universe / point-in-time Top 500 by 60-day dollar volume, price > 5,5, 8M dollar-volume floor, extreme-move exclusion; each date uses only then-available data; surprises exist only on announcement dates. Dollar volume and the $5 floor use the unadjusted close, because FinLab's volume is not split-adjusted: adjusted close × volume overstated a tiny stock's dollar volume before a reverse split by the split ratio and let some of them into the top 500. Returns still use the adjusted close.
Data coverage Fresh-surprise coverage averages 84% of the universe but fell to 40% early in the sample; breadth is noisier where coverage is thin.
Turnover About 4.7x per year, 257 trades over the decade.
Position rule Blended book as described above; 8% touched stop (in cash ~2% of days).
Sample 2016-2021 calibration; 2022-present out-of-sample; plus the two-halves check above.
Capacity Not estimated. Leveraged ETF liquidity is large, but real impact depends on your size.

This October 2026 refresh reruns every number with finlab 2.2.20 on FinLab data through 2026-10-26. In October FinLab added missing dividends to US adjusted prices and fixed split and spin-off adjustments, and finlab 2.2.20 changed how a stop-loss on a rebalance day is costed, so the historical figures moved along with the last four months. The universe fix above also changed the decile and IC results.

The gate this strategy is judged against is a risk-adjusted ratio of at least 1.5. On monthly returns without a risk-free rate the strategy clears it over the full period (1.57), the research window (1.61), and the out-of-sample window (1.53), though the out-of-sample margin is thin. The monthly Sortino (4.28 full period, 4.02 out-of-sample) also clears it, but Sortino is inflated by how few negative months a monthly-sampled, regime-gated curve produces, so Sharpe is the number to anchor on.

The leveraged-ETF risk you must understand

The leverage, not the earnings data, is the main thing that can hurt you here:

  • Daily reset and path dependency. A 3x daily ETF compounds daily, so a choppy, sideways market erodes value even if the index ends flat. The naive TQQQ row in the first table (-81.7% drawdown) is what unmanaged 3x exposure looks like.
  • Gaps can beat stops. The 8% stop is a touched level in the backtest; a large overnight gap can fill worse in live trading.
  • Monthly switching is not crash protection. A fast crash inside a month is taken at whatever leverage the book holds until the stop or the next rebalance.
  • The signal itself is sparse and seasonal. Breadth depends on analyst coverage and goes quiet between earnings seasons; the strategy's own max drawdown was -21.1% with the gate working as designed.
  • Concentration. The leveraged sleeve is two funds on one theme (large-cap US growth).

Who this is for

It fits an investor who wants a rules-based, fundamentals-confirmed US strategy, understands leveraged ETFs, and can tolerate 20%+ drawdowns in exchange for higher compounding. It does not fit anyone who needs capital stability, wants to trade individual earnings announcements (layer one shows how little that paid in large caps), or is uncomfortable holding 3x products at any time.

FAQ

Does post-earnings announcement drift still work in US stocks? In liquid large caps over 2016-2026, only weakly at the single-stock level: a +3.11% annualized long-short return and a 0.010 rank IC. The miss side is stronger than the beat side (-1.41% vs +0.55% over 60 days), so the cleanest single-name use of the data is avoiding disappointments. The aggregate breadth of well-received beats remains informative as a market regime signal.

What counts as an earnings surprise in this earnings surprise trading strategy backtest? Actual EPS minus the analyst consensus estimate, divided by the absolute value of the estimate, from FinLab's us_earnings_surprises dataset. Actual EPS there is on the estimate's basis (mostly adjusted EPS), not necessarily the GAAP figure in the income statement. A "strong beat" for the breadth signal means a surprise above 5% with a positive same-day price reaction.

Why not just buy the stocks that beat estimates? The unlevered top-decile basket beat the equal-weight universe in only 49.2% of months, finished only slightly ahead of it, and ended far below QQQ. The selection edge is too small to beat an index fund, which is why the strategy uses surprises as a regime gate instead.

Isn't 32.0% CAGR too good to be true? It comes with zero modeled costs in the default run (30.4% with 0.1% per side), a -21.1% drawdown, 19.9% volatility, and 3x-ETF exposure, and the research-window monthly Sharpe (1.61) was barely above QQQ's (1.53) — most of the edge over QQQ comes from 2022 and from drawdown control. The naive TQQQ comparison (40.6% CAGR, -81.7% drawdown over the same dates) shows the raw return was always available; the strategy's contribution is risk management.

Is the result sensitive to the parameter choices? Not much within one step of the chosen values: all nine combinations of breadth threshold (0.75%, 1.00%, 1.25%) and QQQ trend average (150, 200, 250 days) beat QQQ, with daily Sharpe between 1.37 and 1.47.

How often does it trade? Monthly rebalancing with an 8% intramonth stop; turnover is about 4.7x per year, 257 trades across the decade.

What data do I need? FinLab's us_earnings_surprises:* and us_price:* for the signal, and us_fund_price:* for the ETFs. All are in a standard FinLab account.

Reproduce it yourself

Two files reproduce everything above:

  • strategy.py — the full strategy, ready to run after the AI-assisted setup flow; python strategy.py --validate reruns the three robustness checks.
  • data.csv — daily equity curves for the strategy, QQQ, and SPY.

The fastest path is to use the AI-assisted setup flow and ask your AI agent to run and modify it — tighten the breadth threshold, swap the leveraged ETFs for unlevered ones, or rebuild the event study on a different universe. To see how this system compares with nine related ones, read the US quant trading strategies overview, and for the strongest stock-level factor on the same universe, the US momentum strategy. For related research, see the FinLab research blog. Metric definitions are in the glossary; to see what teams build with finlab, browse the use cases and the team behind FinLab.


Last updated: 2026-10 | Backtest window: 2016-05 to 2026-10 | Benchmark: QQQ total return | Author: FinLab Quant Research (reviewed by a quantitative researcher)

Investing involves risk, and past performance does not represent future results. Leveraged ETFs carry additional risks including volatility decay and amplified losses. This content is for educational purposes only and is not investment advice and does not constitute investment advice; evaluate any strategy against your own risk tolerance.

FinLab AI

Want to build your own strategy?

Describe your stock-picking ideas in natural language. AI automatically validates, backtests, and gives you answers

Start Free

More Multi-Factor research

View all