How to Screen for Earnings Surprises with AI

EPS beats and misses, consecutive streak screening, and post-earnings price drift in plain English

← Back to shibui.finance

An earnings surprise is the difference between what a company reported (EPS actual) and what Wall Street analysts expected (EPS estimate). The surprise percentage is pre-computed as (actual - estimate) / abs(estimate) * 100. Academic research on post-earnings announcement drift (PEAD) shows that the direction and magnitude of the surprise contain information about future price movement, especially for the 30 to 60 trading days following the announcement.

Shibui lets you screen 10,000+ US stocks for surprise patterns in plain English. Not just "who beat this quarter," but "who beat every quarter for 3 years," or "what happens to prices after a 20%+ surprise." This guide walks through the methodology step by step. To jump straight to running the screen, use the Earnings Surprise Screener.

What is an earnings surprise?

Every quarter, publicly traded companies report their earnings per share. Before the announcement, sell-side analysts publish consensus estimates of what they expect EPS to be. The earnings surprise is the gap between the two: a "beat" when actual exceeds the estimate, a "miss" when it falls short.

The surprise percentage standardizes the comparison across companies of different sizes. A $0.10 beat on a $2.00 estimate is a 5% surprise. A $0.10 beat on a $0.20 estimate is a 50% surprise. The percentage tells you how far off the consensus was.

Why surprises matter beyond the announcement day: Ball and Brown (1968) first documented that stocks with positive surprises tend to continue outperforming for weeks after the report. This post-earnings announcement drift (PEAD) has been replicated across decades and markets. It is one of the most persistent anomalies in financial economics.

The data you need

Shibui has pre-computed columns for earnings surprise analysis:

  • EPS surprises: eps_actual, eps_estimate, eps_difference, and surprise_percent in earnings_quarterly, one row per company per quarter
  • Report timing: report_date (actual announcement date) and before_after_market (pre-market or after-hours) in earnings_quarterly
  • Revenue context: quarterly revenue and net_income in fundamentals_quarterly, joinable on (symbol, year, quarter)
  • EPS growth: eps_growth_yoy and revenue_growth_yoy in fundamentals_derived_quarterly for trend context
  • Forward estimates: eps_estimate_current_quarter, eps_estimate_next_quarter, and forward_pe in analyst_estimates
  • Daily prices: OHLCV data in stock_quotes for post-earnings price reaction analysis

What Shibui does not have: revenue estimates or revenue surprises (only EPS), analyst count or consensus dispersion, estimate revision history, whisper numbers, options-implied expected moves, or earnings call transcripts. One edge case to watch: when the consensus estimate is very close to zero, the surprise percentage can be extreme (a $0.01 estimate with a $0.05 actual produces a 400% surprise). For universe-wide screens, adding a floor filter like abs(eps_estimate) > 0.05 avoids misleading results.

Step 1: Look up one company's surprise history

Start with a single ticker to understand the data shape before screening the full market.

On Shibui, you ask

"Show me NVDA's last 8 quarters of earnings: EPS estimate, EPS actual, surprise percentage, report date, and whether it was reported before or after market."

This pulls directly from the earnings_quarterly table. The report_date is the actual announcement date, which is different from date (the calendar month-end that labels the fiscal quarter, not the period-end itself: AAPL's Q4 2024 is dated 2024-09-30 while its books closed 2024-09-28). The before_after_market column tells you whether the announcement was pre-market or after-hours. About half of all records have this field populated. The result is a simple table showing beat/miss history for one stock. This is the most common query pattern in the database, used by traders doing due diligence before earnings events or reviewing a stock's consistency record.

Step 2: Screen the market for the biggest recent surprises

Move from one ticker to the full universe. Find the companies with the largest positive or negative surprises in the most recent quarter.

On Shibui, you ask

"Show the 20 largest positive earnings surprises in the most recent quarter among US stocks with a market cap above $2 billion. Include the company name, sector, EPS estimate, EPS actual, and surprise percentage."

Claude uses ROW_NUMBER to get each company's latest quarter, filters by surprise_percent, and ranks. The market cap filter keeps the results to widely followed names. For this type of magnitude screen, consider adding abs(eps_estimate) > 0.05 to filter out extreme percentages from near-zero estimates. You can also flip the sort to find the biggest misses, or narrow by sector to see which industries had the strongest or weakest earnings season.

Step 3: Add revenue context to separate quality beats

An EPS beat tells you the company exceeded expectations. Revenue context tells you how. An EPS beat with 20%+ revenue growth suggests organic strength: more customers, higher prices, or expanding markets. An EPS beat with flat or declining revenue suggests the company hit the number through cost cuts, share buybacks, or one-time items. Both are beats, but they signal different things about the business trajectory.

On Shibui, you ask

"For the 20 largest positive EPS surprises last quarter among large-caps, also show year-over-year revenue growth from fundamentals_quarterly. Join on symbol, year, and quarter. Flag any company where EPS beat but revenue declined."

The join between earnings_quarterly and fundamentals_quarterly must use (symbol, year, quarter), not (symbol, date). This is the most common mistake in earnings analysis queries. Earnings dates are calendar month-end dates. Fundamentals dates are fiscal period-end dates. These differ for about 40% of companies (any company whose fiscal year does not end in December). Joining on date silently drops those companies from the results. Claude handles this correctly when you specify the join columns, and the prompt above makes the join explicit.

Step 4: Screen for consecutive beat streaks

This is the temporal query that traditional screeners cannot run. A consecutive beat streak means the company has beaten analyst estimates in every single quarter for N quarters. Not just "mostly beats," but "zero misses."

On Shibui, you ask

"Find US stocks with market cap above $5 billion that have beaten earnings estimates every single quarter for the last 12 quarters. Show the beat streak length, average surprise percentage, and sector."

Claude checks each individual quarter's surprise_percent and rejects any company where even one was negative. A 12-quarter perfect beat streak, three years without a single miss, typically filters the entire market down to fewer than 20 companies. This is a strong signal of management consistently guiding conservatively.

You can combine this with other criteria in the same request. Add revenue growth, P/E thresholds, technical signals, or sector filters. For example, "12-quarter beat streak, revenue growth above 10%, P/E under 30, technology sector" narrows the list further. The beat streak is just one filter among many; it stacks with everything else Shibui can check. For screening by absolute earnings growth rather than beats vs. estimates, see the consecutive earnings growth screener.

Step 5: Study post-earnings price drift (PEAD)

Post-earnings announcement drift is a well-documented pattern in academic finance. Stocks with positive earnings surprises tend to continue drifting higher for 30 to 60 trading days after the announcement. Stocks with negative surprises tend to keep drifting lower. The effect has been studied since Ball and Brown (1968) and persists across decades.

On Shibui, you ask

"Across all US stocks since 2015, calculate the average price change 5, 10, and 30 trading days after a positive earnings surprise above 15%. Compare to the average after a negative surprise below -15%. Filter to stocks with market cap above $1 billion. Show the number of events in each bucket."

This is a full event study. Claude identifies every qualifying surprise event in the earnings_quarterly table, joins to stock_quotes to measure subsequent price changes at the specified offsets, and summarizes the average drift. The count of events gives you statistical weight, so you know whether the average is based on 50 events or 5,000.

Shibui's 25+ years of earnings data and 64 years of daily prices make this analysis possible in a single query. You can segment further by market cap tier, sector, surprise magnitude bucket, or time period. You can also run this for a single stock to see its individual post-earnings behavior over the last several years.

What Shibui cannot do

Shibui does not assign earnings surprise scores or rankings. It provides the raw data (EPS actuals, estimates, surprise percentages); you describe the criteria and Claude checks them. There is no built-in surprise quality rating or automated signal.

There are no revenue estimates or revenue surprises. You can see whether revenue grew, but not whether it beat the consensus estimate. There is no analyst count, consensus dispersion, or estimate revision history. No whisper numbers. No options-implied expected moves. No earnings call transcripts or management guidance text.

The surprise percentage can produce extreme values when the consensus estimate is near zero. A $0.01 estimate with a $0.05 actual yields a 400% surprise. This is mathematically correct but not always meaningful. For universe-wide screens, adding abs(eps_estimate) > 0.05 filters out these edge cases.

There are no real-time alerts. Data is end-of-day, updated after market close. You cannot trade the initial post-announcement gap, but for screening and historical analysis, end-of-day data is standard. Data is US equities only (NYSE and NASDAQ). For full coverage details, see the data sources page. For a quick screen without the step-by-step walkthrough, use the Earnings Surprise Screener. To see whether insiders bought ahead of earnings beats, see the insider buying screener.

Frequently asked questions

Can AI screen for earnings surprises?

Shibui Finance connects to Claude and lets you describe earnings surprise criteria in plain English. Claude checks EPS actuals vs. estimates, surprise percentages, and consecutive beat/miss patterns across 10,000+ US stocks. It does not assign scores; it checks the numeric criteria you define.

What data do I need for an earnings surprise screen?

You need EPS actuals and estimates (for the surprise calculation), quarterly revenue data (for context on whether the beat was revenue-driven), daily stock prices (for post-earnings drift analysis), and forward analyst estimates (for the setup going into next quarter). Shibui has all of these as pre-computed columns.

How do I distinguish a revenue-driven beat from a cost-cutting beat?

Join earnings_quarterly with fundamentals_quarterly on (symbol, year, quarter) to see whether revenue also grew. An EPS beat where revenue grew year-over-year suggests organic strength. An EPS beat with flat or declining revenue suggests cost cuts or share buybacks. Shibui lets you check both in one query.

Is this a replacement for Zacks or Seeking Alpha earnings data?

No. Zacks has proprietary earnings rankings. Seeking Alpha has analyst commentary and estimates from multiple sources. Shibui does not have Zacks ranks, analyst count, revision history, or revenue estimates. What Shibui does is let you screen the entire market for surprise patterns, check consecutive beat streaks, and run historical price-reaction studies across decades.

Connect Shibui to Claude in 2 minutes

Shibui is free. Connect it to Claude and screen 10,000+ US stocks for earnings surprises, beat streaks, and post-earnings drift alongside any financial conditions you define.

Connect to Claude →