SYSTEMATIC EQUITY RESEARCH · 2018–2026 · FREE DATA · NO LOOKAHEAD

Post-Earnings Announcement Drift —
the reaction-day filter is dead.
Surprise magnitude is the edge.

A no-lookahead, cost-aware backtest across 1,004 US & AU stocks: 45 US large-caps, 37 US small/mid-caps, 13 ASX large-caps, then a survivorship-bias-free expansion to the full Jan-2016 Russell 2000 (909 names with data). Does a YouTube-style “concordant” filter (beat + price rose / miss + price fell) add value — or is it just the magnitude of the earnings surprise (Bernard–Thomas / Livnat–Mendenhall)?

Window 2018-01-01 → 2026-08-27 Events 27,564 resolvable Universe 45+37+13+909 Data Yahoo Finance + Market Index

01 The verdict

Four numbers that summarise 8.6 years and 27,564 earnings events.

The real edge
+0.97pp / 60d

LONG EPS beats ≥10% outpace the universe baseline 60 trading days out — p = 0.0001 (n = 11,858) on the broad Russell 2000. Magnitude is monotonic: the bigger the beat, the stronger the drift.

Concordant filter
−0.4 to −44%

Filtering on announcement-day price direction adds nothing and actively loses money in the realistic portfolio model at every holding period (30–90d).

Mega-caps & ASX
no edge

US large-caps and ASX large-caps are efficiently priced. Big compounded $ on large caps is leveraged beta, not drift.

Investability
≤ 20 bps

The edge survives ~20 bps round-trip costs, dies at 50 bps. Realistic portfolio returns (+26% to +71%) underperform equal-weight buy & hold (+799%).

02 Strategy & methodology

Event-driven backtest, strict point-in-time handling, no lookahead. Reaction window uses only prices known before entry; entry at the open of the session after the full reaction; exit at the close of the 60th trading day.

ComponentDefinition
Concordant signalLONG: beat consensus and announcement-day return > 0 · SHORT: miss and return < 0
Magnitude signalSurprise buckets: 0–2% / 2–5% / 5–10% / >10% of consensus EPS
TimingBMO/AMC recovered from announcement timestamp (≤12:00 → BMO, ~16:00 → AMC)
Entry / exitOpen of session after full reaction · close of 60th trading day (Bernard & Thomas)
Execution modelsFixed-fraction (10% of initial, no compounding) + concurrent portfolio with daily MTM and 100% gross-exposure cap
Costs0 / 10 / 20 / 50 bps round-trip sensitivity
Beta controlEvery result is a differential vs equal-weight buy-and-hold benchmark of the same universe, with Welch t-tests
Why the differential matters: unconditional 60-day forward returns were +4.2% (large) and +4.7% (small) — that's just beta. Every long rule compounds into huge fake $ numbers. The real signal is the per-event differential vs that baseline, with a p-value.

03 Universes & data

Three curated universes first, then a survivorship-bias-free expansion to the full point-in-time Russell 2000.

UniverseNamesEventsConsensus sourceNotes
US large-cap451,524Yahoo analyst estimatesMega-caps: no edge
US small/mid-cap371,231Yahoo analyst estimatesWhere the edge first appeared (p=0.002)
ASX large-cap13173Time-series YoY EPS from PDFsNo free keyless ASX consensus
Russell 2000 (2016 PIT)90926,674Yahoo analyst estimates1,909 listed; 862 delisted since → bias killed
Survivorship-bias kill: the R2000 expansion uses the Jan-2016 constituent list — a point-in-time snapshot that includes the 862 names since acquired, delisted or bankrupt. A 2026 list would silently flatter every result.

04 Results — the edge analysis

60-trading-day forward returns vs universe baseline, gross.

US small/mid caps (37 names) — where the edge first appeared

SignalnAvg 60d fwdDiff vs baseline (+4.72%)pVerdict
beat >10% (LONG)462+8.12%+3.40pp0.0021The edge
beat 5–10%191+5.08%+0.37ppn.s.not significant
beat 2–5%164+1.02%−3.70ppn.s.not significant
beat 0–2%72+1.95%−2.77ppn.s.not significant
beat_up (concordant)503+4.90%+0.18pp0.84dead — no value
miss_down (concordant short)188+1.54%−3.18pp0.035sig differential, poor $

US large caps (45) & ASX (13)

UniverseBaseline /60dbeat_up diffbeat >10% diffVerdict
US large+4.21%+0.05pp (p=0.93)+1.38pp (p=0.073)No exploitable edge
ASX large+0.84pp beatsn.s.No PEAD edge; all variants < buy & hold (+104%)
Takeaway: the concordant filter was never the source of the edge. On small caps, beats that fell on announcement day had higher forward returns than beats that rose (mean-reversion on the reaction day). Magnitude is what matters.

05 The Russell 2000 expansion — does it survive at scale?

909 tickers, 26,674 events, survivorship-bias-free. Realistic concurrent-portfolio model (100% gross cap, daily MTM, 10bps).

Surprise magnitude is monotonic

Avg 60d forward return by EPS-surprise bucket (beats only, broad R2000).

Concordant filter destroys value

Portfolio-model total return by holding period: beat>10% long vs base_concordant (incl. shorts).

Portfolio economics by holding period (100% gross cap, 10bps, ≥$2M ADV)

Holdbeat>10% longPFbase_concordantPF
30d+39.2%1.08−44.7%0.85
45d+42.6%1.11−4.0%0.96
60d+26.4%1.08−11.7%0.92
90d+70.5%1.29−23.0%0.90

Liquidity filter sweep (60d hold, beat>10%, 10bps)

Min ADVEventsPortfolio totalPF
none26,560+71.6%1.23
$2M22,113+26.4%1.08
$10M13,238−8.7%0.94
$50M3,247+67.5%1.17

Cost sensitivity — the edge's real capacity

Profit factor vs round-trip cost (60d, ≥$2M ADV). Survives ~20bps, dies at 50bps.

Edge differentials vs baseline

60d forward-return differential by signal group (broad R2000, baseline +3.14%).

Equity curve: beat>10% long portfolio vs equal-weight buy-and-hold benchmark
Equity ($100k start): beat>10% long portfolio (blue, 10bps) vs equal-weight buy & hold of the same universe (orange) and daily-rebalanced equal weight (green), 2018–2026. The differential is real — the absolute return is not competitive with just holding the universe.
The honest bottom line: the >10% beat edge is statistically real at scale (+0.97pp/60d, p=0.0001, monotone in magnitude) and the concordant filter still destroys value. But the per-event edge is ~3× thinner than on the curated 37-name set (+0.97pp vs +3.40pp — the broad universe's higher-beta baseline eats it), and realistic portfolio returns (+26% to +71% over 8.6y, PF 1.1–1.3) underperform just holding the equal-weight universe (+799%). Same lesson as ORB-on-perps and overnight-drift: a statistically real differential is not automatically an investable standalone edge.

06 Key findings

  1. The concordant filter adds no value — and on small caps it hurts. Beats that fell on announcement day had higher forward returns than beats that rose (mean-reversion on the reaction day).
  2. The real edge is surprise magnitude: LONG EPS beats ≥10% → +3.40pp/60d (p=0.002) on curated small caps, confirmed at +0.97pp/60d (p=0.0001) on the full Russell 2000. The classic Bernard–Thomas / Livnat–Mendenhall effect.
  3. Mega-caps (US + ASX) are efficiently priced — no edge, just leveraged beta.
  4. Shorting miss+down has a significant differential (−3.18pp, p=0.035) but poor absolute economics — a hedge, not a standalone book.
  5. Costs are the binding constraint: the edge survives ~20bps round-trip and dies at 50bps. Only low-cost vehicles can express it.
  6. Best config found: 90d hold, ≥$2M ADV, >10% beat, long-only → +70.5%, PF 1.29 over 8.6 years.
  7. Don't trade the transcript's concordant rule as-is. It systematically loses in the realistic portfolio model at every holding period.

07 Reproduce it

Everything is free-data and keyless. Full pipeline, engine and results live in the pead_strategy/ workspace.

yfinance (Yahoo) — US prices + analyst consensus Market Index API — ASX announcements pypdf — ASX EPS extraction event-driven engine, no lookahead point-in-time Russell 2000 (Jan-2016) sequential + concurrent portfolio models Welch t-tests, cost sensitivity, beta control
Artifacts: src/backtest_engine.py (engine), src/build_r2000_data.py (data), src/run_r2000.py (edge analysis + sweeps), results/us_r2000_results.json (full JSON), results/trades_r2000_bigbeat_portfolio.csv (trade-by-trade). Full narrative: Research/StrategyBacktests/pead-post-earnings-announcement-drift.md in the companion vault.