Alphanume
EarningsPro

Earnings Implied vs Realized

See what the options market charged for an earnings move before the report, and how far the stock actually went after it. Every event pairs the pre-earnings straddle price with the realized move, alongside a running record of how often that name has been priced too high.

GET /v1/earnings-move-historyUpdated daily after the close
  • Price the report before it happens.

    implied_move_pct is what the pre-earnings straddle charged for the move, with implied_move_dollars carrying the same number in dollars.

  • Check the name's own record.

    hit_rate_to_date is the running share of that ticker's events where the straddle was too expensive, and n_events_to_date says how many events it rests on.

  • Measure the gap after the fact.

    over_under_pct and move_ratio compare what was implied against realized_abs_move_pct once the reaction session closes.

Ask your agent
Prompt · MCP or REST

Which stocks tend to have their earnings reactions overpriced by the options market? Rank them by how consistently that has happened and show me the history you are basing it on.

Your agent translates this into per-ticker running hit rates, implied moves measured against realized ones, and the event counts behind each number.

What this dataset is

What the market charged, and what the stock did.

Before a company reports, the options market puts a price on how far the stock is about to move. Buying the call and the put at the strike closest to the current price, a pair known as a straddle, costs roughly what a move of that size is worth, so the price of that pair is the market's implied move. Each row captures that price on the last session before the report, then measures what the stock actually did on the session that prices the reaction.

One row is one earnings event for one company. Alongside the event it carries that ticker's record up to that date: how many events have been observed, how often the straddle turned out to be too expensive, and the trailing averages of implied and realized moves.

Each row includes:

  • The pre-earnings straddle: at-the-money strike, call price, put price, and the expiration used.
  • The implied move in percent and in dollars, with the at-the-money implied volatility at capture.
  • The realized reaction: signed return, absolute move, and the ratio of realized to implied.
  • Consensus and reported EPS for the quarter, plus options notional volume as liquidity context.
  • Announcement timing, before the open or after the close, and the two dates that bracket the event.
  • Running point-in-time statistics for the ticker: event count, overpricing hit rate, and trailing averages.

A high hit rate is a record, not a forecast. The events that break through the implied move are the ones no track record warned about, and a single uncapped move can hand back a long run of small wins.

What you can do with it

Trade the gap between the implied move and the real one.

The reason to care is the gap. Across 3,554 earnings events since 2024, the straddle overpriced the realized move 64% of the time, worth roughly 1.1% of spot per event before costs. That is the volatility risk premium showing up somewhere you can date precisely, one report at a time.

The market-wide average is the starting point, not the trade. The per-ticker fields are what turn a statistic into a screen: names whose straddles have been consistently expensive, names that consistently break through them, and the ones whose behavior changed partway through. Because the statistics are point-in-time, you can rank on what was knowable the morning of the event instead of on the full-sample answer.

  • Screen ahead of earnings season on hit_rate_to_date, with n_events_to_date as the sample-size guard.
  • Compare implied_move_pct against avg_realized_abs_to_date to find names priced above their own history.
  • Study the distribution of move_ratio rather than its average, since the tail is what sizes the position.
  • Split results by time to keep before-the-open reports separate from after-the-close ones.
  • Join eps_actual to eps_estimated to test whether surprise size explains the events that broke through.
Where the data comes from

Priced at the close before, measured at the close after.

The straddle is priced from the option chain on capture_date, the last trading session before the announcement, using the strike nearest spot and the expiration in exp_date. The realized move is measured on reaction_date, the session that prices the reaction. time records whether the company reported before the open or after the close, which is what decides which session is which.

Rows are written daily after the close. An event whose reaction session has not closed yet arrives with the straddle fields filled and the realized fields empty, so no outcome is ever stamped onto a date where it was not known. Once the reaction session resolves, the values are fixed and are not revised. The running statistics count only events up to and including their own row, which is what makes them safe to rank on inside a backtest.

Fields that matter

The fields that separate the price from the outcome.

The headline fields below are a subset. Every field, with exact types and semantics, is documented in the API reference.

FieldTypeWhat it tells you
datestringEarnings date, which is also the observation date for the row
tickerstringEquity ticker symbol
timestringAnnouncement timing: bmo for before market open, amc for after market close
capture_datestringSession the straddle was priced; reaction_date is the session the move was measured
straddlefloatPrice of the at-the-money call plus put at capture
implied_move_pctfloatWhat that straddle price implies as a percentage move into earnings
atm_ivfloatAt-the-money implied volatility at capture
realized_abs_move_pctfloatHow far the stock actually moved over the reaction, ignoring direction
over_under_pctfloatImplied minus realized; positive means the straddle overpriced the move
move_ratiofloatRealized move divided by implied move, so 1.0 is a perfectly priced event
overpricedbooleanTrue when the realized move came in under the implied move
hit_rate_to_datefloatRunning share of this ticker's events where the straddle overpriced the move, counting only events up to this row
n_events_to_dateintegerHow many observed events that running hit rate rests on
Query it in one call

One ticker, its whole earnings track record.

One key works across the REST API, the hosted MCP server, and this dashboard. Every response is JSON with a { count, data } envelope.

Python
import requests

url = "https://api.alphanume.com/v1/earnings-move-history"
params = {
    "ticker": "AAPL",
    "date_gte": "2024-01-01",
    "api_key": "alp_abc123"
}

r = requests.get(url, params=params)
print(r.json())
cURL
curl "https://api.alphanume.com/v1/earnings-move-history?ticker=AAPL&date_gte=2024-01-01&api_key=alp_abc123"
Example response
{
  "count": 1,
  "data": [
    {
      "date": "2026-01-29",
      "ticker": "AAPL",
      "time": "amc",
      "capture_date": "2026-01-29",
      "reaction_date": "2026-01-30",
      "spot": 232.14,
      "atm_strike": 232.5,
      "exp_date": "2026-01-30",
      "days_to_exp": 1,
      "atm_call_px": 4.85,
      "atm_put_px": 4.70,
      "straddle": 9.55,
      "implied_move_pct": 4.11,
      "implied_move_dollars": 9.55,
      "atm_iv": 0.68,
      "realized_return_pct": -2.34,
      "realized_abs_move_pct": 2.34,
      "over_under_pct": 1.77,
      "move_ratio": 0.57,
      "overpriced": true,
      "eps_estimated": 2.35,
      "eps_actual": 2.41,
      "notional_volume": 184320000,
      "n_events_to_date": 18,
      "hit_rate_to_date": 0.67,
      "avg_implied_move_to_date": 4.42,
      "avg_realized_abs_to_date": 3.61,
      "avg_over_under_to_date": 0.81
    }
  ]
}
Honest limitations

What this data does not claim.

  • Realized fields stay empty until the reaction session closes, so an event pulled the morning of the report has the straddle priced and the outcome blank.
  • The straddle is a mark at the close, not a fill. Spreads, commissions, and slippage all come out of any edge measured from it, and the published figures are gross of costs.
  • hit_rate_to_date on a name with a handful of events is close to noise. The overpricing tendency is market-wide first and name-specific second, so check n_events_to_date before ranking on it.
  • Once an event resolves, its values are fixed and are not retroactively altered. That is what keeps backtests clean, and it also means the row will not quietly change under you later.
  • Pro includes full history and the latest session.
Common questions

Asked by researchers, answered plainly.

Why does the implied move use such a short-dated expiration?

The straddle is taken at the first expiration after the report, carried in exp_date with days_to_exp counting the calendar days from capture. A short-dated straddle is almost entirely a bet on the earnings move itself. A longer-dated one prices weeks of unrelated volatility on top, which would make the implied move look larger than the report deserves.

What is the difference between over_under_pct and move_ratio?

over_under_pct is a difference in percentage points of spot: implied minus realized, so it says how much was overpaid or underpaid on this event. move_ratio is realized divided by implied, a unitless number where 1.0 is perfect pricing. Use the difference when you care about the dollars and the ratio when you are comparing a quiet name to a volatile one.

How do before-the-open and after-the-close reports differ in this data?

time tells you which one it was. For an after-the-close report, the straddle is captured on the announcement day and the move is measured on the next session. For a before-the-open report, the capture happens on the prior session and the reaction is measured on the announcement day. capture_date and reaction_date always spell out which sessions were used, so you never have to infer it.

What is the volatility risk premium?

It is the tendency for options to be priced above what the underlying ends up doing, because the people selling them are being paid to carry a risk that is unbounded on one side. Earnings is where that premium is easiest to date and measure, since the event is scheduled and the straddle is priced against one known session. over_under_pct is that premium, measured one event at a time.

Start querying

Available with Pro. Enterprise for teams.

New REST API and MCP access requires Pro or Enterprise. Public dashboard previews are separate from a subscription. Pro includes the available historical record, current updates, REST, MCP, dashboard exports, and every standard dataset as it launches. Explore the dashboard preview before subscribing; its existing limits still apply.