Calculate how far each reported EPS and revenue came in above or below the analyst consensus, and how the share price reacted to it, in one table per announcement.

  • The EPS Surprise and Revenue Surprise are (reported - estimate) / |estimate|.
  • The SUE (standardized unexpected earnings) divides the EPS surprise (reported - estimate) by the standard deviation (ddof=1) of the EPS surprises of the sue_window announcements before it. Only surprises known at the time are used, so it can be compared across companies and over time. This follows Livnat and Mendenhall (2006), “Comparing the Post-Earnings Announcement Drift for Surprises Calculated from Analyst and Time Series Forecasts”, with the analyst consensus as the expectation. Bernard and Thomas (1989), “Post-Earnings-Announcement Drift: Delayed Price Response or Risk Premium?”, scale a time-series surprise the same way and show that shares keep drifting in the direction of the SUE for weeks after the announcement.
  • The Reaction compounds the share’s (dividend-adjusted) returns over the trading days from window days before to window days after the announcement. Day 0 is the announcement date or, when that isn’t a trading day, the next one.
  • The Benchmark Reaction is the benchmark’s return between the same dates, and the Abnormal Reaction is the Reaction minus the Benchmark Reaction (a market-adjusted return). Both need the Toolkit’s benchmark_ticker.

The source doesn’t say whether a company reported before the open or after the close. The default window of 1 covers days -1, 0 and +1, so the reaction is captured either way: on day 0 for a report before the open and on day +1 for one after the close. This is the three-day window of the post-earnings drift literature.

Each ticker’s own trading days are used. An announcement too close to the start_date or end_date of the Toolkit for its window has no reaction, and the SUE needs sue_window earlier announcements. The full reporting history is retrieved for this, so it is usually available.

Note that this information requires a Premium FMP subscription.

Also known as: earnings surprise, earnings beat or miss, standardized unexpected earnings, SUE, earnings reaction, post-earnings announcement drift (PEAD).

Earnings Surprise in Python or via the MCP

Install the Finance Toolkit with:

pip install financetoolkit -U

Then call get_earnings_surprise as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(
    ["NVDA"],
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2024-06-01",
    end_date="2025-12-31",
)

toolkit.get_earnings_surprise(
    show_columns=["EPS Surprise", "Revenue Surprise", "SUE", "Reaction", "Abnormal Reaction"]
)

Or, after setting up the Finance Toolkit MCP, ask:

By how much did Nvidia beat or miss its earnings and revenue estimates at each announcement from mid-2024 to 2025, and how did the stock react?

Which returns:

date EPS Surprise Revenue Surprise SUE Reaction Abnormal Reaction
2024-08-28 00:00:00 0.0543 0.0438 1.123 -0.0701 -0.0657
2024-11-20 00:00:00 0.08 0.0581 2.2513 0.0466 0.0372
2025-02-26 00:00:00 0.0495 0.0323 2.0736 -0.0778 -0.0574
2025-05-28 00:00:00 0.0991 0.0168 4.8777 0.0602 0.0413
2025-08-27 00:00:00 0.0396 0.0151 3.3169 0.002 -0.008
2025-11-19 00:00:00 0.0317 0.0372 3.0966 -0.0319 -0.0122

Parameters

get_earnings_surprise accepts the following parameters.

ParameterTypeDescriptionExample
windowintThe trading days before and after the announcement the reaction covers. Defaults to 1, the three days -1, 0 and +1.20
sue_windowintThe number of earlier announcements whose EPS surprises scale the SUE. Defaults to 8 (two years of quarterly reports).8 (two years of quarterly reports)
roundingint | NoneThe number of decimals to round the results to. Defaults to None, which uses the rounding set on the Toolkit.2
show_columnslist[str] | NoneA list of column names to keep in the result. Invalid names are reported and ignored. Defaults to None, which keeps every column.None, which keeps every column
Share