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) — and finally a point-in-time re-run with the actual Russell 2000 membership at each announcement date (4,220-name union, 104 monthly IWM snapshots). 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 (+32,040 PIT) Universe 45+37+13+909 (+4,220 PIT) Data Yahoo Finance + Market Index + BlackRock IWM API

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 from announcement timestamp (07:00–12:00 → BMO, afternoon → AMC). Midnight/unknown stamps are AMC (conservative).
Entry / exitOpen of session after full reaction · close of Nth trading day. Portfolio exits are stored on filled positions only (skipped overlaps cannot close a later trade).
Execution modelsFixed-fraction (10% of initial, no compounding) + concurrent portfolio with daily MTM and 100% gross-exposure cap
CostsRound-trip bps charged to cash on entry and exit (0 / 10 / 20 / 50). Equity, Sharpe and maxDD move with costs; PF is computed from the same net pnl.
Beta controlEvery event-study result is a differential vs the complement (Welch two-sample t-test), plus a weekly calendar-time cluster. Not a one-sample test against the same sample's mean.
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 Jan-2016 Russell 2000 snapshot (Yahoo coverage is incomplete for delistings) and a true point-in-time membership re-run.

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 snapshot)90926,674Yahoo analyst estimates1,909 listed; Yahoo served 909 — delistings drop out
Survivorship: the R2000 expansion starts from the Jan-2016 constituent list. Yahoo still only returned 909 of ~1,909 names — delisted names the vendor dropped never enter the file. Equal-weight buy-and-hold of that remainder is not an IWM return. Prefer the point-in-time membership benchmark in section 06.

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). Re-run after the cash-cost fix to refresh equity paths; PF in the saved JSON did move with bps.

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 Point-in-time membership — the actual Russell 2000, window by window

The headline R2000 result used a fixed Jan-2016 snapshot. This section re-runs the whole 2018–2026 window with the actual index membership at each announcement date — 104 monthly IWM holdings snapshots, 4,220-name union universe, membership gate = nearest snapshot on or before the announcement (no lookahead).

Data discovery: BlackRock's IWM product-data API serves historical holdings by as-of date (component=holdings&asOfDate=YYYYMMDD) — monthly snapshots from 2016 to today, ~2,000 names each. Actual Russell 2000 membership is free and keyless; no Wayback, no paid vendor.

Universe: the gate changes the names every window

UniverseNamesNote
Fixed Jan-2016 snapshot909the original study's pool
PIT union (2018–2026)4,220every name that was a member at any point
Churned via reconstitution~1,547+added/removed (e.g. Jun-2024: +228 / −131)

Portfolio economics — PIT membership-gated vs controls (10% / trade, 100% gross cap, 10bps)

CaseHoldTradesNetPFWin%Sharpe
PIT membership-gated60d897+62.2%1.1954.0%0.32
PIT membership-gated90d792+80.5%1.2550.4%0.36
Union, no gate60d955+3.4%0.9952.7%0.15
Union, no gate90d840+42.7%1.1449.2%0.27
Fixed 2016 pool (artifact)60d846+1.99%/60d1.0854.4%—
PIT benchmark (actual members)——+167%——0.56

Drift curve — raw vs index-excess

Big-beat (≥10%) event forward returns at 5–90d holds: raw (drift) vs excess over the same-window equal-weight membership index. Raw is the tape; excess is the timing edge.

New-entrant premium, full window

OLS excess ~ new + momentum_z + new×momentum_z at 30/60/90d. The 2023–26 interaction signal does NOT survive 2018–2026; only momentum itself is robust.

The honest read: gating to actual members is correctness, not cherry-picking — and it matters: full-window gated beats the ungated union decisively (+62.2% vs +3.4% at 60d, PF 1.19 vs 0.99). But the broad-universe big-beat strategy still underperforms just holding the actual membership (best +80.5% vs benchmark +167%) — the same beta lesson as the original study. And the new-entrant "fresh attention" edge does not generalize: significant in 2023–26 (interaction p=0.008), absent across 2018–2026 (p=0.21–0.90); the only robust factor is plain momentum (60d, p<0.03).
Artifacts: src/collect_iwm_membership.py (IWM API collector), src/build_r2000_pit_data.py (union build), src/run_r2000_pit.py (gated backtest + controls), src/analyze_drift_curve.py, src/analyze_new_vs_existing.py, src/analyze_momentum_match.py (splits + momentum-matched OLS). Full narrative: docs/PIT_R2000_BACKTEST_RESULTS.md.

07 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: round-trip bps now hit cash, so equity/Sharpe/maxDD will move in a re-run. The saved JSON PF series still declined toward 1.0 by 50bps; do not treat the old identical-equity cost sweep as a real path.
  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.

08 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 + IWM API) sequential + concurrent portfolio models Welch vs complement + weekly cluster
Artifacts: src/backtest_engine.py (engine), src/build_r2000_data.py (data), src/run_r2000.py (edge analysis + sweeps), src/collect_iwm_membership.py + src/build_r2000_pit_data.py + src/run_r2000_pit.py (point-in-time membership pipeline), results/us_r2000_results.json (full JSON), results/trades_r2000_bigbeat_portfolio.csv (trade-by-trade). Full narrative: docs/PIT_R2000_BACKTEST_RESULTS.md + Research/StrategyBacktests/pead-post-earnings-announcement-drift.md in the companion vault.