VolModel
Create free accountUpgrade
Account

Every number on this site has a definition, and this is where it lives.

VolModel is an earnings-options research site. This page defines each figure on the site: how we work it out, what time of day we read it, and where we know it is wrong. We mark each place we depart from a published method, and label each measurement as one. Our only claim about accuracy is the track record, which is graded in public.

Plain words used on this page

the pair
the call and the put at the strike nearest the share price (the at-the-money straddle)
price reading
the volatility an option's price implies (implied volatility, IV)
the report move
the part of the priced move that belongs to the report itself (EM_decomp, §3)
ordinary swings
the day-to-day movement priced around it (σ_c, §3)
the collapse
how far the price reading falls across the report (the crush, §4)
the tilt
which way the market's fear leans (the skew, §11)

§1When each number is read

Why the time of day is part of what a number means.

Every priced number is read once a day at 15:46 ET, fourteen minutes before the closing bell. Because the read is set from the bell, half-days and daylight-saving changes need no special case. The day before read is the last one taken while the report is still ahead; the day after read is the first full session once it is out. A report before the bell on day D is read on D−1 and again on D. A report after the bell on day D is read on D and again on D+1.

Two more reads exist only on the buying-back side (§4, §8): the open, taken at 09:31 because there is never a 09:30 quote, and 10:00. Both come from the option's own quote or trade in that minute, not from the daily read.

read once a day at 15:46 ETD−1DD+1beforereportday beforeday afterafterreportday beforeday afterevery day-after session also carries the 09:31 open and 10:00read once a day at 15:46 ETD−1DD+1beforereportday beforeday afterafterreportday beforeday afterevery day-after session also carriesthe 09:31 open and 10:00
By design§1
Nothing on this site is live, and we show no raw option prices. Every figure is computed here from delayed data. Our data licence allows more; we chose to use less.

§1.1A reading one session old

The board is rebuilt overnight, so the reading you trade on before a report is the close of the session before. We checked what that costs: we ranked past reports on that earlier close and set the result beside the ranks from the last reading before each report. Measured 2 November 2026.

  • Rich and cheap stay apart. Over 3,337 reports with at least eight earlier reports of their own, enough to rank, the cheap fifth moved 98% of its priced report move, close to close, when ranked a session early and 94% when ranked on the last reading. The rich fifth moved 85% and 81%. The gap between the two is 12.6 points against 12.5.
  • Ranks shift a little overnight. 76% of reports stayed in the same band, rich, middle or cheap. 1.3% went from rich to cheap or the other way.
  • The size of the move is read slightly better on the last reading. Over 8,333 reports, the rank correlation between the report move and the actual move is 0.453 a session early and 0.464 on the last reading. The earlier reading is close, and a little worse.
  • The live record is too short to settle it. On the 825 of those reports published live, the gap between rich and cheap is 28.8 points ranked a session early and 39.0 on the last reading. With that few reports the difference could run from 29 points against the earlier reading to 8 points in its favour.

§2The priced move

The simple number every tool shows, defined so ours can be compared with theirs, and the one constant behind it.

§2.1The quoted move

FormulaEM_naive
EM_naive = M / S

M = mid of the ATM straddle at the first expiry after the report
S = spot at the same 15:46 read
K* = the listed strike nearest S; both legs at K*
EM_naive = M / SM = mid of the ATM straddle at the first expiry after the reportS = spot at the same 15:46 readK* = the listed strike nearest S; both legs at K*
NVDA example, 26 August 2026: M/S = 5.9%. We show it beside the report move (§3) so ours can be compared with other tools. The report move is our headline.

The quoted move depends on how long the option has left. An expiry five sessions out carries five sessions of ordinary movement on top of the report, so sorting companies by it partly sorts them by the calendar. That is why it is our second column (§3).

§2.2The √(2/π) factor

The pair costs the average size of the move, E|S_T − F|. Turning that cost into a standard-deviation figure needs a factor. The rules of thumb (0.8, 0.85, "about one sigma") disagree and are rarely written down, so we use the exact factor for a normal move:

Constant√(2/π)
√(2/π) ≈ 0.7979

σ_straddle-implied = EM_naive / √(2/π)
√(2/π) ≈ 0.7979σ_straddle-implied = EM_naive / √(2/π)
A supplier's own reading for the pair is worked back from that same cost, so the factor cancels on the report move (§3.3). It does not cancel on the ordinary swings.
Other tools§2.2
Other tools use 0.8 or 0.85 and rarely say which. 0.8 is √(2/π) rounded; 0.85 is a fudge that partly makes up for the pair mispricing the largest moves. On the same options, a figure worked out with 0.85 reads about 6% higher than ours, which is more than most comparisons between tools are arguing about.

§3Splitting the move

Our headline number: the report's own move, with ordinary day-to-day movement taken out, and the ordinary swings that are left behind.

§3.1Two expiries, two unknowns

The risk priced into an expiry is the ordinary risk built up over its sessions, plus one lump for the report if the report falls inside it. Two expiries that both cover the report give two equations with two unknowns.

Formulaσ_e², σ_c
σ_i² · T_i = σ_c² · (T_i − 1) + σ_e²             for each expiry i after the report

σ_c² = (σ_2²T_2 − σ_1²T_1) / (T_2 − T_1)         ordinary-swing variance
σ_e² =  σ_1²T_1 − σ_c²(T_1 − 1)                  report variance

EM_decomp = √(2/π) · √(σ_e²)                    the headline move
σ_c  the ordinary swings, one level shared across the expiries
σ_e  the report session's own volatility
T_i  trading sessions to expiry i; the report session counts once, in σ_e²
σ_i² · T_i = σ_c² · (T_i − 1) + σ_e²for each expiry i after the reportσ_c² = (σ_2²T_2 − σ_1²T_1) / (T_2 − T_1)ordinary-swing varianceσ_e² = σ_1²T_1 − σ_c²(T_1 − 1)report varianceEM_decomp = √(2/π) · √(σ_e²)the headline moveσ_c the ordinary swings, one level shared across the expiriesσ_e the report session's own volatilityT_i trading sessions to expiry i; the report session counts once, in σ_e²
NVDA example, 26 August 2026: the near expiry read 98.9% with 2 sessions to run, the next 65.7%. That gives a report move of 5.6%, and the report as 91% of the near expiry's risk.

With two expiries the answer comes straight out of the two equations. With three or more we fit the same identity by weighted least squares, weighting each expiry by the width of its own quote, so a wide quote shows up as wider error bars instead of as a hidden lean in the answer. We publish the fit's χ² as a sanity check, and build the fit on distinct expiries: the same expiry counted twice would narrow the error bars while reporting a perfect fit.

quoted 5.9% the report 5.6% ordinary 1.8% end to end: 7.4%, a sum that is false quoted 5.9% the report 5.6% ordinary 1.8% end to end: 7.4%, a sum that is false
NVDA, 26 August 2026. The two parts combine as squares: 5.6² + 1.8² ≈ 5.9². A stacked bar would show their plain sum, 7.4, which is wrong; a right triangle draws the quoted move as its long side.

§3.2The error bars

How wide the quotes are counts twice: once as the weights in the fit, and once as the error bars around the answer. The bars are ±2 standard errors on the report's own risk, then square rooted, which leaves them lopsided, wider above than below. With two expiries we carry the error through directly; with three or more we take it from the fit.

Rulelow confidence
if  band(EM_decomp) > threshold  or  post-report expiries in solve == 1:
    flag  low_confidence            (class: demote)
    keep  the number, shown
    drop  the report from the default sort and from the forecast (§7)
if band(EM_decomp) > threshold or post-report expiries in solve == 1:flag low_confidence(class: demote)keep the number, showndrop the report from the default sort and from the forecast (§7)
The threshold is a standard error above 15% of the estimate. Above it the report is marked low-confidence, and it is still shown, with its error bars.

§3.3What we know is wrong, and by how much

The √(2/π) factor assumes a report day shaped like a bell curve, and real report days are not. The error this leaves lands on the ordinary swings and not on the report move, because the supplier's own reading was already worked back from the same average-size cost and the factor takes out exactly what that put in.

  • A typical report: about 0.5 points of the forecast collapse either way (−0.2 once the signs are counted), and −1.8% to +0.4% on the ordinary swings. Priced against the chain shapes Alexiou, Goyal, Kostakis and Rompolis (2025) measured before real reports: 2,229 single-company chains, averaging 6.5 days to expiry.
  • The worst case: up to ±7 points of forecast collapse and −41% to +22% on the ordinary swings, when the report holds about 96% of the near expiry's risk and the day splits two ways. No published measurement supports that shape. We publish it so the typical figure is not read as a limit.
  • It runs both ways: the error is a mixture that partly cancels in the average, so the lean we publish on the track record is about half the size of the error on a single report. More reports will neither fix that nor show it.
  • It cancels only while the report dominates: below roughly 60–70% report share, the leftover moves onto the report move itself, which then reads about 5–9% low when the reaction is sharply peaked. Those reports look cheap on the board when they are not.

§3.4Where we differ from the papers

We define the report's term differently from the published methods. The papers (Dubinsky, Johannes, Kaeck and Seeger, 2019; Leung and Santoli, 2014; see §12) treat the report as an instantaneous jump and keep all T_i sessions of ordinary movement beside it: the published forms (Dubinsky–Johannes–Kaeck–Seeger, Alexiou et al. eq. A2, Leung eq. 5.2) put the report at x = T. We put it at x = T − 1 and take the report's term to be the whole session it lands in, the (T_i − 1) in §3.1, so the priced move covers the same span as the actual moves we rank it against. A jump-only priced move set against a full-session actual move would compare two different things.

What it changes§3.4
What the choice changes: the report's own term moves by exactly σ_c², about 1% of the report move, and ours does not go negative on companies with small reports, which the jump-only form does on roughly 0.5% of curves. The ordinary swings, and every forecast built on them, come out the same either way, because shifting x sideways cannot move the slope of a straight-line fit.

The method has two further limits. One level of ordinary swings is shared across the expiries in the fit. That is a modelling choice, so the error bars do not cover it: they widen with noisy quotes, and this does not. And when a scheduled macro release falls inside the window, such as a CPI or FOMC date that the later expiry holds and the near one does not, the report gets a marker and the number is still published. A later expiry about 30 days out nearly always holds one, so leaving those reports out would blank the split for most companies on monthly expiries.

§4The collapse, three ways

How far the price reading falls across the report, in the expiry that holds it, and why three numbers are needed.

Formulacrush
crush_ATM     = IV_ATM(T+1, K*_T+1) / IV_ATM(T−1, K*_T−1) − 1     re-struck
crush_as-sold = IV(T+1, K*_T−1)     / IV(T−1, K*_T−1)     − 1     original strike
crush_open    = IV backed out of the option's 09:55–10:05 quote (or trade) at T+1,
                against the same T−1 read

all at the first expiry after the report; a RELATIVE decay, not a difference
crush_ATM = IV_ATM(T+1, K*_T+1) / IV_ATM(T−1, K*_T−1) − 1re-struckcrush_as-sold = IV(T+1, K*_T−1)/ IV(T−1, K*_T−1) − 1 original strikecrush_open = IV backed out of the option's 09:55–10:05 quote (or trade) at T+1,against the same T−1 readall at the first expiry after the report; a RELATIVE decay, not a difference
NVDA example, 26 August 2026: −35% at the new strike, −34% at 10:00 the next morning.
  • At the new strike is the clean reading of the report's own risk going away, and it is what the forecast (§7) is graded against.
  • At the old strike is what a held position saw. After a big move the strike you sold is no longer nearest the price, so it falls less. The gap between the two comes from the move.
  • The next morning is what buying back in the first hour meets, read at the strike nearest the 10:00 price. We take the option's trades between 09:55 and 10:05; where the call or the put did not trade, we read both from the midpoint of their quoted bid and ask over the same ten minutes, as long as the quote is less than 50% wide. Some reports have neither, and those stay blank rather than estimated.
Known gap§4

The old-strike reading is missing on some reports, and more often as the move grows. It needs the strike that was nearest the price the day before to still be quoted the day after, and it reads the out-of-the-money option at that strike, only when that option has a bid. On thinly traded names that bid is often missing even after a quiet day, and after a large move the old strike is far from the price, where options often stop trading. Over the 41,108 settled reports with a 15:46 collapse, the old-strike number is there on 78.4% of reports that moved under 3% close to close and 38.1% of those that moved over 25%, falling as the move grows. The collapse at the new strike picks its strike again the day after, so it is unaffected; it is what the track record grades and what every average on this site uses.

The missing reports bias the column, in the direction that is easy to get backwards. Where both readings exist, they agree on reports that moved under 3%, and the old-strike collapse runs shallower as the move grows: by a median of 4.9 points at 10–25% and 10.1 points above 25%. So the large-move reports this column loses would have pulled its average up, and averaging what remains reads a deeper collapse than the full set gives.

Not comparable§4
Our headline collapse runs from 15:46 the day before to 15:46 the day after, so it covers the opening collapse plus a full session of drift. A collapse measured at the open is a different number, usually a smaller one, and ours is not comparable with it. The ticker page labels every reading with its time, and the board's collapse columns are all the 15:46 read.

We also take a second reading at the buy-back times. At the open and in the 09:55–10:05 window the day after, we work the price reading out of the option's own bar in that minute. Fewer reports have it than have the 15:46 read, because the option has to have traded or been quoted near that time. Each report says whether its reading came from the middle of a quote or from a trade, and older reports, from before minute-by-minute quotes exist, are all priced from trades and carry a trade marker. A trade happens at the bid or the ask, so its price is off by half the spread in a direction we cannot know.

Other tools§4
Other tools publish a 30-day collapse. A 30-day constant-maturity figure blends the expiry that holds the report with expiries that hold none, so it consistently shows a shallower collapse than the expiry a position is actually in. We store and show the 30-day figure beside ours so the comparison can be checked, though it is the wrong measure for a report.

§4aThe actual move, three ways

What the stock did after each report, measured from the previous close to three points of the next session, plus the two days after that.

  • Close to close. The usual measure, and the one every other tool shows. It assumes you get out at 16:00 the day after the report.
  • To the opening auction. The gap on its own.
  • To the 09:55–10:05 volume-weighted price. Where a position can realistically get out once the opening rush has cleared. We weight by volume instead of taking a plain average, because the first minutes carry most of the trading on exactly the companies that gap.
  • The next close, and two days after. What a position held toward expiry lives through.
Never substituted§4a
These readings are never substituted for one another. A missing reading from inside the day stays missing and is marked as missing. Filling it in from the opening price would look harmless on any single report and would damage the whole series, because the gap between the two readings differs from company to company, and that gap is what our continuation figure measures.

§5Richness

How the board sorts by default: where today's priced move sits against this company's own past reports, not against other companies.

Formularichness percentile
ratio_i  = EM_decomp,i / R_med     i = 1 … N, the last N earlier reports
R_med    = median |move to 10:00| (§4a) over those N, one shared denominator
ratio    = EM_decomp / R_med       today, over the same denominator
richness = 100 · (b + ½e) / N      b = #{ratio_i < ratio}, e = #{ratio_i = ratio}
           today is not one of the N: it is ranked against the earlier reports only

sort key = (richness percentile, richness z-score)       N = 12 window, 8 minimum
ratio_i = EM_decomp,i / R_medi = 1 … N, the last N earlier reportsR_med = median |move to 10:00| (§4a) over those N, one shared denominatorratio = EM_decomp / R_medtoday, over the same denominatorrichness = 100 · (b + ½e) / Nb = #{ratio_i < ratio}, e = #{ratio_i = ratio}today is not one of the N: it is ranked against the earlier reports onlysort key = (richness percentile, richness z-score)N = 12 window, 8 minimum
In words: the share of the earlier reports priced below today’s, with a tie counted as half. Today’s report is not one of them, so a report priced above every earlier one reads 100, and one priced above all but one reads 100·(N − 1)/N. A company with fewer than 8 earlier reports with both a priced move and a 10:00 move gets no percentile and is held out of the ranking. We still show its plain ratio, marked as too few. The window is the last 12 and the number needed to be ranked inside it is 8: two different constants. On the board of 23 September 2026, 40 of 45 companies had 8 and 15 had 12.

Ranking companies against each other mostly ranks them by how rich they habitually are, which is a documented risk premium, and not by anything unusual today. That is why each company is ranked against itself.

What it does not say§5
"Rich for this company" does not mean "profitable to sell". The column says nothing about how the stock moved afterwards, and that follows from the arithmetic: every ratio in the window shares one fixed denominator, so the percentile ranks the priced side alone. We have measured reports at the same percentile whose actual moves were spread very differently.

One measured test of what the reading is worth to a seller, on reports whose options expired the next day: selling earnings options the day before expiry. Only the richest fifth came out clearly ahead.

The ratio column beside the percentile is the plain cross-company read, and it is a ratio of means, one average divided by another, and not a median of ratios. The report move is an average size of move by construction, so dividing it by a median actual move overstates the gap: by roughly 18% for a bell-curve move and about 57% for a realistic earnings gap, enough that a company with no edge at all would display 1.41–1.78×. The percentile keeps the median, because there it only sorts and the median cancels out.

The ratio's denominator is the company's average move to 10:00 the next morning, scaled by 1.07: across every company we cover, moves to the next close run 1.07 times the 10:00 ones, and the priced move runs to the next close. So the 10:00 average we print beside the ratio does not divide into it on its own; the note beside the ratio shows the scaling.

§6Price rank and percentile

The first number an experienced reader will check against another tool's, so we spell out how ours is built.

Formulaiv_rank · iv_percentile
window        = the trailing 252 daily reads, INCLUDING today
                at least 120 of them, or no rank is published
iv_rank       = (IV30 − min) / (max − min) · 100
iv_percentile = mid-rank percentile of IV30 within the window

a fresh 52-week high reads exactly 100; nothing can fall outside [0, 100]
a series that never moved reads 50, not "at its one-year low"
window = the trailing 252 daily reads, INCLUDING todayat least 120 of them, or no rank is publishediv_rank = (IV30 − min) / (max − min) · 100iv_percentile = mid-rank percentile of IV30 within the windowa fresh 52-week high reads exactly 100; nothing can fall outside [0, 100]a series that never moved reads 50, not "at its one-year low"
  • We count the window including today, which is what makes a fresh 52-week high read exactly 100 instead of something above it.
  • We hide the rank when the year's high and low are all but the same, and mark it noisy when the gap is small next to our read error. We would rather show a blank than rounding noise as a percentile.
  • The window length varies from company to company, and that matters for the rank. Unlike the percentile, ranks only compare fairly between companies with similar coverage: a company with 120 reads sits at 0 or 100 on 6.95% of days, against 4.00% for one with 252.

The rank and the percentile both use the supplier's own 30-day reading, for the whole window and for today. That is not the IV30 shown elsewhere on the page, which is ours, interpolated from the option chain. The two track each other closely on heavily traded companies and drift apart on thin ones. Ranking our reading inside their history would move the published rank by more than one point on 45% of daily reads and by more than five on 6%, always the same way for a given company, so each figure uses one reading throughout. We keep our own daily history alongside, and once it is a full year deep the rank moves onto it.

The supplier's rank§6
Where ours differs from the supplier's: other tools build their rank and percentile on their own windows and their own rules, and ours are written down here so a difference has an explanation. Our options supplier ships its own one-year rank and percentile. We publish ours instead, and we measured the difference. Their window is also 252 rows and also includes today. The one convention that really differs is ties: their percentile counts a tie as fully below and ours splits it, which is why a company whose reading never moved reads 50 here and would read 100, "at its one-year high", under theirs. Across twenty companies our rank sits within a third of a point of theirs on average and our percentile about six points below. Most of that gap is the reading, not a convention: their published rank uses a slightly different reading from the one we rank.

The noisy marker mixes our number with the supplier's. It divides our read error, taken from the width of the option's own quote, by the width of the supplier's range over the same window. A quote's width is a fact about the market whoever works a reading out of it, and the supplier publishes no read error of its own, so this is the best construction available, though not a clean one.

§7The forecast and its grade

A forecast of the collapse, published the day before and graded the day after, in public. The report move (§3) is our headline; this is a second opinion.

The split implies where the price reading of the expiry holding the report should fall once the news is out: the ordinary swings, restated over the sessions that expiry has left. That is the textbook forecast. We correct it (below), publish the corrected forecast the day before, and grade it against the collapse measured the day after, at the 15:46 read and again at 10:00, each with its own coverage ratio.

Formulacrush_pred
IV_pred    = post-event front-expiry ATM IV implied by the term structure at T−1
             (the clean vol σ_c, carried to the front expiry's remaining horizon)
textbook   = IV_pred / IV_ATM(T−1) − 1                  stored as crush_pred_naive
crush_pred = a + b · textbook + Σ macro terms           a, b, terms: T−1 quarter's set

scored:  error = crush_ATM − crush_pred        at 15:46, and again at 10:00 (crush_open)
unit:    points of the collapse (the crush is relative), against the sample's mean collapse
IV_pred = post-event front-expiry ATM IV implied by the term structure at T−1(the clean vol σ_c, carried to the front expiry's remaining horizon)textbook = IV_pred / IV_ATM(T−1) − 1stored as crush_pred_naivecrush_pred = a + b · textbook + Σ macro termsa, b, terms: T−1 quarter's setscored: error = crush_ATM − crush_predat 15:46, and again at 10:00 (crush_open)unit: points of the collapse (the crush is relative), against the sample's mean collapse
Sign: a positive miss means the collapse was shallower than we said. The textbook forecast has a known lean, a reversion bias: read off the curve across expiries, it overstates how far the price reading falls, because after a report the reading tends to settle above the ordinary swings we work out. It settles higher still when a Fed decision, an inflation report or a US election is still ahead of the expiry. The correction below takes out most of that lean, and the track record publishes what is left, with its sign.

§7.1The correction, and why it is not a fit to the answers

The textbook forecast missed by 5.67 points on average across 3,855 backfilled reports since 2023, and by 6.34 on the first 187 live ones, almost all of it in one direction. Most of that is predictable, so since November 2026 we correct it: a little less of the textbook forecast, a fixed offset, and a term for each scheduled release still ahead of the expiry or already passed between the two readings. All of it is known the day before. The correction is refitted once a quarter, on reports already graded before that quarter began, and a forecast always uses the correction of the quarter it was written in. So no forecast, past or future, was corrected using its own outcome or any later one.

Graded that way, the average miss falls to 5.05 on the same backfilled reports and to 4.57 on the live ones, and the lean from +3.0 and +4.6 to about +1.4 on each. The next-morning miss improves too, 9.95 to 8.33 backfilled and 10.31 to 7.70 live. Each row records which quarter’s correction it used, and the textbook forecast stays beside it in the data and as its own row on the track record. Reports before 2023 keep the textbook forecast, because fewer than 200 had been graded when their quarter began.

The correction in use for forecasts written in the fourth quarter of 2026 was fitted on the 4,188 reports graded before 1 October 2026. It keeps 87% of the textbook forecast and moves it by −3.4 points, then adds, in points of the collapse: +4.1 when a US election is still ahead of the option’s expiry after the report, +1.7 for a Fed decision ahead, +0.6 for an inflation report ahead, +1.6 when a Fed decision fell between the two readings, and −0.6 when an inflation report did. A positive number means the price reading tends to stay higher than the textbook forecast says.

Two sets are kept apart and never merged. Live forecasts were written before the report, and they are the only ones that prove anything. Backfilled forecasts were worked out over past reports before launch: they show what the method does across many reports, but they cannot show that anything was forecast in advance. Both are graded the same way:

  • A published forecast is frozen. If a calendar later moves the date, the report keeps its forecast and is graded against whatever happened.
  • A report that gets no forecast (§3.2, §9) is still counted, so leaving it out cannot flatter the miss.
  • A forecast read at a report time we could not confirm is graded on its own line and kept out of the headline miss. Either the company's report time was unknown, so the forecast was read a session early, or we found later that it was read after the news was already public, which makes it a reading of the reaction rather than a forecast of it.
  • The day each forecast was read is recorded when it is written, not worked out later from the calendar.

16 live and 2 backfilled forecasts are kept out of the track record’s figures because we could not confirm the report came out after they were read. At the close the live ones missed by 8.2 points on average, the backfilled by 20.7. The live ones are in the track record’s ledger, flagged “Own line”.

§8Selling, then buying back

What selling the pair at the nearest strike would have returned on reports that have already happened, paying the spread both ways.

Formulastraddle P&L
contract the ATM straddle on the expiry that holds the report,
         the same one the quoted move prices (§2)
sold     at the T−1 15:46 BID of that straddle
covered  at the observed ASK of THAT straddle at the anchor (09:31 · 10:00 · 16:00 on T+1)
         or its settlement value, |share price − strike|, if it expires at that close
P&L      = (sold − covered) / sold, per cent of premium collected

mid-to-mid P&L is shown beside it as the frictionless comparable
contract the ATM straddle on the expiry that holds the report,the same one the quoted move prices (§2)sold at the T−1 15:46 BID of that straddlecovered at the observed ASK of THAT straddle at the anchor (09:31 · 10:00 · 16:00 on T+1)or its settlement value, |share price − strike|, if it expires at that closeP&L = (sold − covered) / sold, per cent of premium collectedmid-to-mid P&L is shown beside it as the frictionless comparable
We buy back at the option price that was really there, not at the straddle's intrinsic value. The shortcut, premium collected minus the size of the move (P&L = premium − |move|), assumes the options are worth only their exercise value the morning after, which overstates the seller's result by whatever time and volatility value is left.

The straddle bought back is the one that was sold, and every buy-back names the contract it priced. When the straddle sold expires before the two sessions after, the path is held to its expiry, and its value there is its settlement: no spread, and nothing for the stock delivered on the in-the-money side.

The result pays the spread both ways: sold at the bid, bought back at the ask. The mid-to-mid figure beside it shows what the spread costs, and it is labelled as not achievable.

Coverage at each time is the share of reports with a usable price in that minute. A buy-back price above the share price itself is marked implausible and left in: it happens on about one report in a thousand, and it reflects real trading friction we publish on purpose. None of this is a recommendation; it is a record of past reports.

§9Markers

Every caveat on the site is a marker with a class, and the class says what the marker does to the number, not only what it means.

ClassWhat it doesExamples
advisoryShown, and counted. Nothing else changes: the report is still ranked, sampled and graded. It never raises an alarm.date unconfirmed · sources disagree · noisy rank · buy-back above price · collapse, old strike
demoteWe still show the number, but the report leaves the default sort and, where it applies, the forecast. It counts against a company only if it keeps happening: one bad quarter is not a standing problem.error bars too wide · quotes too wide to trust · the price reading rose, not fell
suppressWe leave the value out and say the reason in its place.the move would not split · the actual move is implausible · the priced move is above what the options allow
outageWe could not fetch it. Fixable, and nothing to do with the data itself, so it is left out of our quality rate, the publishing gate and the coverage we publish: a gap we caused should not count as one the market produced.options data missing
defectA check was missed upstream that should not have been. We alarm on the first one rather than on a rate: this class should stay empty, so a single entry is a bug to fix.(empty, by design)

We choose a marker's class from what it does to a reader, not from how often it fires. One of ours fires on 0.085% of reports, a thousand times under the alarm, so its rate decides nothing. Two markers that fire equally often can sit in opposite classes, and two that look alike can land differently, because one runs with the way the price reading collapses and the other against it.

§10Cross-checks and sources

What is checked against what, and what each feed supplies.

Every option-price reading we use is worked out here from the supplier's quotes, then checked against the supplier's own reading for the same strike. That check runs between two readings of the same quotes, so it catches our mistakes and not theirs. The split (§3) and the forecast (§7) are worked out here and are never taken from a supplier's own earnings field, so changing feeds would change nothing on this page. Option chains, implied volatilities and greeks are licensed from a third-party market data provider, minute bars for stocks and options from a second provider, and the earnings calendar from a separate source, checked against the settled record. All data is delayed, and everything shown is worked out from it by the formulas on this page.

FeedSuppliesUsed for
Daily optionsEnd-of-day chains with a price reading for every strike, taken 14 minutes before the bell, back to 2007Every priced number, the 15:46 collapse, and the history
Minute quotes and tradesOption quotes and trades minute by minute, all exchangesThe 09:31 and 10:00 readings (§4, §8), and moves inside the day
Earnings calendarUpcoming report dates, marked before the bell or afterThe board's window, checked against the filings afterwards

We check report dates afterwards against the timestamps on the filings themselves. Where a supplier carries the same report on two days running, we hide the duplicate from the pages but keep its grade on the track record, because dropping it would hide the entry instead of keeping it.

If yours differs§10
Why our priced move can differ from one you work out yourself: we read the chain at 15:46, 14 minutes before the close (§1). Ahead of a report due after the bell, the near expiry's price reading usually keeps climbing through that last afternoon, so the same pair priced at lunchtime and at 15:46 gives different numbers. For a short-dated option on a jumpy stock the difference can be several percentage points. If you are reconciling our figure with yours, check the time of day first.
  • Repeatability: passes, exactly. The order a supplier sends a chain in cannot move any published number: the priced move, the price readings, the tilt and the whole split come out identical under shuffled input, bit for bit rather than to a tolerance. Within one run over identical inputs, any difference at all would mean the answer depends on order, and a tolerance would let that hide. One limit: the actual moves are not reproducible to the bit, and the cause is in the supplier's data. Their price series, adjusted for splits and dividends, is rescaled and rounded again whenever a company pays a dividend, which moves a stored actual move by about 4 parts in 100,000. We check those against a separate bar of 5 in 10,000.
  • Price readings: 95th percentile between 0.47% and 14%, depending on the company. We work our own reading out of the supplier's mid price and compare it with the reading they publish for the same contract. Across six companies the tail runs 0.47% (Tesla) · 1.30% (Apple) · 1.32% (Amazon) · 3.81% (Microsoft) · 9.02% (Verizon) · 13.96% (Exxon). We publish the range because an average would describe none of them. What separates them is whether the stock goes ex-dividend before the contract expires: our forward price carries no dividend term, so the dividend payers read badly. Re-running the same options against a forward taken from put-call parity, which needs no dividend assumption, improves every company: Exxon's tail falls from 13.96% to 1.31%, and Microsoft's from 3.81% to 0.84%. Most of the gap is that known simplification in our own pricing, not a disagreement about the data.
  • These figures are for out-of-the-money legs at sensible quote widths, the options every number on this site is worked out from. On in-the-money options the same comparison reads a median of 22%: an in-the-money option's price is mostly intrinsic value, so the small remainder that carries the reading is swamped by a cent of rounding in a wide, stale quote. Pooling the two would report a figure for contracts we never read.
Target not met§10
Against the 0.4% target, we do not clear on any of the six companies at the 95th percentile. The target is not an industry standard: it comes from a practitioner describing their own cross-check in public, and it names no statistic. We lead with the 95th percentile on purpose. We fed in each kind of error this check exists to catch (a wrong day count, a wrongly set forward price, single corrupted quotes), and the tail moved every time, while the median stayed put for two of them. An error in the whole chain does not shift every strike evenly, because some strikes respond far more to a change in the reading than others, so it shows at the edge before the centre. The median is the figure that flatters us, so we report it second.
Known error§10
What the missing dividend term costs a published number: on a dividend the size Exxon actually pays, the open collapse for such a company is wrong by five to seven points, against an average miss on that number of about eight. The collapse divides one near-dated contract by another, and an error shared by two numbers cancels in their difference, not in their ratio. A real quarterly payment also drops the whole amount at once, about seventy times more than a smooth yearly rate gives over a nine-day window.
  • The split, against a different method: median ratio 0.99. Our ordinary swings against the supplier's own earnings-adjusted reading, across ten reports whose readings ran from 24% to 94%, with an interquartile spread of 7%. We did not expect them to agree, since their solve is constant-maturity and ours reads this report's own expiries. Landing within about one percent is the strongest independent check on this page, because it is the only one where a different method does the work. Our report move sits at a stable 0.65 of their equivalent field (interquartile spread 8%); a stable ratio points to a difference of method rather than an error. It is partly unexplained: their published definitions do not say whether their figure is a one-standard-deviation move or an average-size move, and ours is the average size. We have asked them.
Limit of the check§10
What the price-reading check cannot do: it compares our working against the same feed our working starts from. That catches copying, day-count, forward and dividend errors, which is most of what goes wrong in practice. It cannot catch the supplier being consistently wrong, because the comparison has no second independent feed. A second check has one: a report whose readings move in a shape a real report rarely produces (the reading after it far below the stock's ordinary swing, or the reading rising by more than 40%) is checked against the exchange quotes for the same options at the same minute, and if the supplier's figure is far outside them, no collapse is published and the forecast is not graded until it is corrected from the quotes. That check found one bad day, 2 May 2024, when the supplier's prices and readings for 17 companies came out at half the market's, and it is why a corrected report says its figures came from the exchange quotes. Everything else, the track record carries, because it is graded against what happened.

Not investment advice. Nothing here is a recommendation, and nothing here forecasts which way a stock will move. The one forward-looking number we publish is a forecast of how far implied volatility will fall, and we grade it in public so it can be judged instead of taken on trust.

§11Method versions

Every stored row says which version of the method made it. This key says what each version means.

The stamp is methodology_version, a whole number stamped on the row when it was written, and the API and the CSV exports print it beside each figure: a row worked out under version 2 still says 2 after version 3 ships. That is how you tell whether two rows in the same column can be compared, and it is why we do not redo old rows without saying so.

StampThe tiltRead error on the price rank (§6)
1Off the option already in profitFrom the wider of the two expiries around 30 days
2Off the option not yet in profitFrom the wider of the two expiries around 30 days
3Off the option not yet in profitThrough the weights that build the rank
4As 3. Version 4 added the corrected forecast of the collapse (§7.1).

The tilt is read off the option not yet in profit. An option already in profit is priced mostly on that profit, so a reading taken from it follows rounding in a wide quote.

The read error is how many rank points the width of the quote alone could move the rank. Taken from the wider expiry, it can come from an expiry that carries no weight in the rank, and since the shorter expiry is nearly always the wider one, it errs the same way across a whole night's board.

Every forecast of the collapse carries the quarterly correction, whatever the row's stamp. crush_cal_set names the quarter whose correction it used, and the textbook forecast stays beside it as crush_pred_naive.

The tilt's code changed on 15 August and the stamp on the 17th, so rows written in between carry the new tilt under stamp 1. A row records only the session it describes, so those rows cannot be picked out afterwards; we redid the one session affected. A report takes its marker from its own day-before reading, so a report stamped 3 can carry a marker worked out under 2.

The rank, the percentile and the length of the window are the same under every stamp. The tilt decides which reports qualify for the track record and does not feed the priced move or the split.

§12The published work this rests on

The method for splitting the move comes from the papers below. The code, the measurements and the public record are ours.

Each entry says what we take from the paper and where we differ from it.

  1. Dubinsky, Johannes, Kaeck and Seeger, “Option Pricing of Earnings Announcement Risks”. Review of Financial Studies 32(2), 2019, 646–687. What we take. Separating the report day's own uncertainty from ordinary day-to-day movement inside an option price, and the method across expiries that solves for it. All of §3 comes from this paper. Where we differ. We treat the report's own term as the whole trading session it lands in, not an instant jump. See §3.4.
  2. Leung and Santoli, “Accounting for Earnings Announcements in the Pricing of Equity Options”. Journal of Financial Engineering 1(4), 2014, 1450031. What we take. A separate derivation of the same two-expiry method, starting from a jump model instead of from the curve across expiries. Two independent routes to one formula are why we treat it as established. Where we differ. The same difference: their jump sits on top of ordinary movement that runs through the report session, and ours is the session.
  3. Alexiou, Goyal, Kostakis and Rompolis, “Pricing Event Risk: Evidence from Concave Implied Volatility Curves”. Review of Finance 29(4), 2025, 963–1007. What we take. The measured shape of real option curves before a report, which is often not the bell curve the arithmetic assumes, and how often that happens. It is where the size of the error we publish against ourselves comes from, and why §3.3 leads with a typical figure instead of a worst case.
The worked examples throughout, the §3 figure included, use NVDA’s report of 26 August 2026. Nothing on this page is investment advice. Every figure about the past is a measurement, not a forecast, and the only claims we make about accuracy are on the track record.