Event Contract Price as Probability: How E Work
Event contract price na implied probability: $1 payout if Yes, $0 if No. See why Yes plus No fit pass $1, and how to remove spread for cleaner odds.
Event contract price na probability wey get spread around am. Contract go pay $1.00 if the outcome wey dem state happen, and $0.00 if e no happen. Na this fixed payout dey make the arithmetic work: 30 cents for contract wey go pay one dollar mean say market dey quote roughly 30% chance. To read the number correctly, you need adjust once for the spread and once for the mechanics behind settlement.
Wetin event contract price dey tell you about probability
Everything dey follow from the payout. Buy Yes contract for price p, and you go collect $1.00 if outcome resolve as Yes, but nothing if e resolve as No. Across many repetitions, average payout na the true probability of Yes. If you pay exactly that probability, you break even. The price wey you pay na the break-even probability, na why one number dey serve both purposes.
Four terms, make we define dem once:
- Yes contract: e pay $1.00 if the outcome happen, and $0.00 otherwise.
- No contract: e pay $1.00 if the outcome no happen. Yes and No na two sides of one coin.
- Settlement: na the moment wey contract resolve and one side collect the dollar.
- Resolution source: na the named report or feed wey contract settle against. E pay based on wetin that source state, no be based on wetin really happen.
Event contract quotes no dey part of the data set behind this page. Every panel below dey measure the same arithmetic where dem fit measure am directly, for listed US equity options. Call option delta dey run from 0 to 1, and e dey approximate the market odds say the contract go expire in the money. Na the same binary question event contract dey ask: price go dey above the line on settlement date, or e no go dey above am? Delta na approximation of that probability, and e dey use risk-neutral assumption, no be forecast. Both limits dey show for the panels. The option delta guide explain the measure itself.
Why Yes and No dey add up to pass $1?
Yes and the matching No cover the whole outcome space, and na only one of dem go pay. For options chain, the same pair na call and put for one strike and one expiry: call go finish in the money above the strike, while put go finish in the money below am. Their probabilities must total 100%. Na this pair for one SPY chain on one day, grouped into 2% bands around the spot price.
| strike vs spot | yes prob pct | no prob pct | pair total pct | strikes |
|---|---|---|---|---|
| -8% vs spot | 91.6 | 7.8 | 99.5 | 4 |
| -6% vs spot | 91.2 | 11.5 | 102.7 | 5 |
| -4% vs spot | 80.6 | 18.3 | 98.9 | 13 |
| -2% vs spot | 68.8 | 29.8 | 98.6 | 13 |
| 0% vs spot | 54.1 | 45.7 | 99.8 | 15 |
| +2% vs spot | 36.2 | 63.3 | 99.5 | 11 |
| +4% vs spot | 18.4 | 81.9 | 100.3 | 7 |
| +6% vs spot | 3.6 | 82.5 | 86.2 | 1 |
The exact SQL behind every number
WITH chain AS (
SELECT strike_price,
toFloat64(any(underlying_close)) AS spot,
avgIf(delta, delta > 0) AS call_delta,
avgIf(-delta, delta < 0) AS put_delta_abs,
countIf(delta > 0) AS calls,
countIf(delta < 0) AS puts
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = toDate('2026-06-30')
AND expiration_date = toDate('2026-07-31')
AND iv_converged = 1
AND volume > 0
GROUP BY strike_price
HAVING calls > 0 AND puts > 0
),
banded AS (
SELECT toInt32(round(100 * (toFloat64(strike_price) / spot - 1) / 2) * 2) AS band,
call_delta,
put_delta_abs
FROM chain
)
SELECT concat(if(band > 0, '+', ''), toString(band), '% vs spot') AS strike_vs_spot,
round(100 * avg(call_delta), 1) AS yes_prob_pct,
round(100 * avg(put_delta_abs), 1) AS no_prob_pct,
round(100 * avg(call_delta + put_delta_abs), 1) AS pair_total_pct,
count() AS strikes
FROM banded
WHERE abs(band) <= 8
GROUP BY band
ORDER BY bandFor -8% vs spot, the call side show 91.6% and the put side show 7.8%, making pair total of 99.5%. For the far end of the ladder, +6% vs spot, the two show 3.6% and 82.5%, totalling 86.2%. All 8 bands dey fall within rounding of 100. That flat line across the chart na the constraint wey every binary market dey follow. Aggregate positioning for both sides na wetin the put call ratio dey count.
Model values dey behave well. Quotes no dey. Suppose contract get 62 bid and 66 ask, while e No side get 36 bid and 40 ask. If you buy Yes at 66 and No at 40, you don pay $1.06 for position wey guaranteed to return $1.00. If you sell both at their bids, you collect 98 cents against $1.00 liability. The 6-cent gap between the two asks na overround, the quantity wey sports bettor dey call vig. Na this one venue and market maker dey collect for standing ready to trade. The bid ask spread page explain why that gap dey exist at all.
De-vig arithmetic, step by step
Two quoted prices dey enter. Two fair probabilities wey total one dey come out.
- Take the mid for each side. Yes mid na 64 cents, No mid na 38 cents.
- Add dem together. The book total na 102 cents.
- Divide each mid by that total. 64 / 102 na 62.7%. 38 / 102 na 37.3%.
- Check the sum. The pair don reach 100%.
Na all be this de-vigging mean, and na the same normalization wey bettor dey use for decimal odds.
Now apply am to tighter market. Quote the same contract at 63 bid and 64 ask, with No at 36 bid and 37 ask. The mids na 63.5 and 36.5. The book total exactly 100 cents, and the de-vigged probability na 63.5%. The two answers — 62.7% from the wide market and 63.5% from the tight one — dey less than one point apart. But the honest band around dem no be the same. Any probability between the 62 cent bid and the 66 cent ask fit agree with the wide quote. So, 4 cent market fit pin the odds to about 4 points, but no pass that. If you write “62.7%” from a 4 cent market, you dey claim three digits of precision wey the market no contain. Spread width na precision.
Price wey be 30% mean say e go happen 30% of the time?
Calibration na the test: gather everything wey market price near 30%, then count how many times e happen. Na every SPY call contract for record from January 2022, wey dem snapshot about 30 days before expiry, sort into implied probability buckets, then compare am with whether SPY close above that strike on expiration date.
| implied bucket | contracts | implied prob pct | finished above pct |
|---|---|---|---|
| 2-10% | 4276 | 4.7 | 4.9 |
| 10-20% | 2262 | 14.8 | 19.1 |
| 20-30% | 1874 | 25 | 32.3 |
| 30-40% | 1832 | 35 | 42.8 |
| 40-50% | 1933 | 45 | 52.6 |
| 50-60% | 2213 | 55.1 | 60.9 |
| 60-70% | 2581 | 65.2 | 70.6 |
| 70-80% | 3071 | 75.2 | 79.2 |
| 80-90% | 3858 | 85.3 | 91.1 |
| 90-98% | 4806 | 94.3 | 97.8 |
The exact SQL behind every number
WITH px AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2022-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session
),
snap AS (
SELECT ticker AS contract,
argMin(delta, abs(days_to_expiry - 30)) AS implied_prob,
toFloat64(any(strike_price)) AS strike,
any(expiration_date) AS expiry
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date >= toDate('2022-01-01')
AND expiration_date <= toDate('2026-06-30')
AND days_to_expiry BETWEEN 25 AND 35
AND iv_converged = 1
AND volume > 0
AND delta > 0.02
AND delta < 0.98
GROUP BY contract
)
SELECT multiIf(implied_prob < 0.10, '2-10%',
implied_prob < 0.20, '10-20%',
implied_prob < 0.30, '20-30%',
implied_prob < 0.40, '30-40%',
implied_prob < 0.50, '40-50%',
implied_prob < 0.60, '50-60%',
implied_prob < 0.70, '60-70%',
implied_prob < 0.80, '70-80%',
implied_prob < 0.90, '80-90%',
'90-98%') AS implied_bucket,
count() AS contracts,
round(100 * avg(implied_prob), 1) AS implied_prob_pct,
round(100 * avg(close_px > strike), 1) AS finished_above_pct
FROM snap
INNER JOIN px ON px.session = snap.expiry
GROUP BY implied_bucket
ORDER BY implied_prob_pctThe implied column dey rise across the ladder by construction. The realized column na the part wey nobody know beforehand. For bottom, the 2-10% bucket average 4.7% implied across 4276 contracts and finish above its strike 4.9% of the time. For top, 90-98% average 94.3% and land 97.8%. The realized share for bottom of the ladder dey far below the realized share for top. Na so calibration dey look when e roughly hold.
Two caveats dey follow any table like this. The window matter: sample wey mostly cover rising prices go lift the realized column for every call bucket, while another period fit change the same measurement. And delta answer the probability wey make the pricing internally consistent, no be wetin any forecaster believe. The same chain price a whole distribution, no be only one threshold (the expected move).
If we narrow am to contracts wey market call a coin flip, near 50 cents on the dollar, across six household names:
| symbol | contracts | implied prob pct | finished above pct |
|---|---|---|---|
| SPY | 4785 | 50.6 | 68.4 |
| AAPL | 716 | 50.4 | 62.4 |
| NVDA | 2641 | 50.2 | 57 |
| KO | 525 | 50.3 | 52.4 |
| MSFT | 1156 | 50 | 51 |
| XOM | 1280 | 49.9 | 49.9 |
The exact SQL behind every number
WITH px AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'XOM')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2023-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session
),
snap AS (
SELECT underlying_symbol AS symbol,
ticker AS contract,
argMin(delta, abs(days_to_expiry - 30)) AS implied_prob,
toFloat64(any(strike_price)) AS strike,
any(expiration_date) AS expiry
FROM global_markets.options_greeks
WHERE underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'XOM')
AND date >= toDate('2023-01-01')
AND expiration_date <= toDate('2026-06-30')
AND days_to_expiry BETWEEN 25 AND 35
AND iv_converged = 1
AND volume > 0
AND delta BETWEEN 0.40 AND 0.60
GROUP BY symbol, contract
)
SELECT snap.symbol AS symbol,
count() AS contracts,
round(100 * avg(implied_prob), 1) AS implied_prob_pct,
round(100 * avg(close_px > strike), 1) AS finished_above_pct
FROM snap
INNER JOIN px ON px.ticker = snap.symbol AND px.session = snap.expiry
GROUP BY symbol
ORDER BY finished_above_pct DESCImplied probability dey near 50% for every row by construction. The realized column spread out: SPY finish above its strike 68.4% of the time across 4785 contracts, against 49.9% for XOM. 6 names, one shared implied probability, and wide range of wetin actually happen. Price wey dey near 50 cents describe market odds. But any single contract still settle at $1.00 or $0.00.
$0.70 contract get break-even for where?
Contract wey person buy for 70 cents go pay $1.00 if na Yes, and nothing if na No. Profit na 30 cents, while loss na 70 cents. Break-even probability na exactly the price. If true probability na 70%, the position na coin flip with extra steps. Above 70%, the arithmetic dey favor buyer. Below am, e dey work against buyer, before costs enter.
Costs fit move that line for different levels. If you add one cent round-trip cost to 70-cent contract, break-even go shift from 70% to about 71%. For that position, na small rounding difference. But if you add the same penny to 5-cent contract, break-even go move from 5% to 6%. That one go carry one-fifth of the theoretical edge. Fixed fees dey cause the biggest damage for the cheapest long shots, because the fee take up the biggest part of the price wey person pay. Order type work the same way. Crossing the spread means say you pay the full ask. Resting limit order dey wait for the price wey you name, and e fit never fill (market order vs limit order).
Why near-certain outcome dey trade for $0.97?
Even when nobody dey argue about the outcome, e still hardly trade for $1.00. Four things dey inside those last 3 cents:
- Time value of money. The dollar go come at settlement. To pay 97 cents today for $1.00 wey you go receive in three months na return on capital, and that cash fit serve other purposes (keeping idle cash somewhere).
- Resolution source risk. Contract go settle based on wetin the named source report, according to the schedule wey that source follow. Revisions, delays and unclear wording still matter, even when everybody agree on the outcome.
- The spread itself. If market quote na 96 bid and 98 ask, the mid na 97 cents, but no trade happen for 97. In percentage terms, the book often get the widest spread near the edges.
- The tail. People dey use “certain” loosely. Contracts settle according to the definition inside the rulebook.
You fit measure the convergence. Take SPY calls wey price near a coin flip one month before expiry. Split dem based on wetin eventually happen, then check the average implied probability at six checkpoints.
| checkpoint | eventual yes pct | eventual no pct | contract days |
|---|---|---|---|
| 30 days out | 52.6 | 47.8 | 5650 |
| 21 days out | 61.3 | 41.9 | 3871 |
| 14 days out | 66.3 | 36.8 | 3666 |
| 7 days out | 73.3 | 29.2 | 2177 |
| 3 days out | 76.8 | 27.2 | 1779 |
| 1 day out | 79.8 | 14.4 | 785 |
The exact SQL behind every number
WITH px AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-06-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session
),
coin_flips AS (
SELECT ticker AS contract
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date >= toDate('2025-06-01')
AND expiration_date <= toDate('2026-06-30')
AND days_to_expiry BETWEEN 28 AND 32
AND iv_converged = 1
AND volume > 0
AND delta > 0
GROUP BY contract
HAVING avg(delta) BETWEEN 0.35 AND 0.65
),
obs AS (
SELECT g.days_to_expiry AS dte,
g.delta AS implied_prob,
if(px.close_px > toFloat64(g.strike_price), 1, 0) AS finished_above
FROM global_markets.options_greeks AS g
INNER JOIN coin_flips AS c ON g.ticker = c.contract
INNER JOIN px ON px.session = g.expiration_date
WHERE g.underlying_symbol = 'SPY'
AND g.date >= toDate('2025-06-01')
AND g.expiration_date <= toDate('2026-06-30')
AND g.iv_converged = 1
AND g.volume > 0
AND g.delta > 0
AND (g.days_to_expiry BETWEEN 28 AND 32
OR g.days_to_expiry BETWEEN 19 AND 23
OR g.days_to_expiry BETWEEN 12 AND 16
OR g.days_to_expiry BETWEEN 6 AND 8
OR g.days_to_expiry BETWEEN 3 AND 4
OR g.days_to_expiry <= 1)
)
SELECT multiIf(dte >= 28, '30 days out',
dte >= 19, '21 days out',
dte >= 12, '14 days out',
dte >= 6, '7 days out',
dte >= 3, '3 days out',
'1 day out') AS checkpoint,
round(100 * avgIf(implied_prob, finished_above = 1), 1) AS eventual_yes_pct,
round(100 * avgIf(implied_prob, finished_above = 0), 1) AS eventual_no_pct,
count() AS contract_days
FROM obs
GROUP BY checkpoint
HAVING countIf(finished_above = 1) > 0 AND countIf(finished_above = 0) > 0
ORDER BY avg(dte) DESCAt 30 days out, the contracts wey eventually finish above their strike get average implied probability of 52.6%, compared with 47.8% for the ones wey no finish above am. By 1 day out, the same two groups show 79.8% and 14.4%. Na hindsight draw this split. Nobody wey dey read the chain at the first checkpoint fit know which contract belong to which group. Na the same situation live event contract always dey face. Certainty come on the settlement date, and price dey move there gradually. Settlement rules determine the exact moment: AM versus PM settled options show how much that timing detail fit matter, while implied volatility answer the question of size, not direction, for that same chain.
Data notes and limits
Delta na stand-in for a Yes price, but e no be the same thing. E dey approximate the risk-neutral odds of expiring in the money, and e differ small from the model probability of that same event. The outcomes here compare the regular-session closing price on the expiration date with the strike. That one approximate settlement, but e no reproduce official settlement value. Every options panel filters for converged implied volatility and non-zero volume for that contract on that date, so quiet contracts no enter the sample. Each contract enter the calibration panels once, at the snapshot wey dey closest to 30 days before expiry.
Event contract pricing FAQ
Event contract price na the same thing as probability?
Na probability wey get two adjustments. The quote include the spread wey venue and market makers charge. E also price dollar wey dem go receive for settlement, no be today. If you remove both adjustments, wetin remain na market clearing estimate of the odds.
Wetin de-vigging a two sided market dey do?
E rescale the two mids so dem go add up to 100%. Add the Yes mid and No mid, then divide each one by the total. Yes at 64 cents beside No at 38 cents add up to 102 cents, so the de-vigged pair become 62.7% and 37.3%.
Why Yes and No prices dey add up to more than one dollar?
One of the two must pay $1.00, so frictionless pair suppose cost exactly $1.00 together. The extra cents for the ask side na overround, meaning the spread revenue wey two sided market build inside. If you sell both sides, you go end below one dollar, showing the same gap from the opposite direction.
Contract wey price at 90 cents go fail one time for every ten times?
Roughly, if the market dey well calibrated across many similar contracts. For the SPY panel above, the 90-98% bucket get average implied probability of 94.3% and finish above its strike 97.8% of the time. But one contract still go resolve at one dollar or zero.
How much wide spread dey change the implied probability?
About the same as the spread width. A 1 cent market pin the odds within one point. A 4 cent market leave 4 point band, and every probability inside that band fit match the quote.
Every number above come from stored query over listed contract data, and you fit reach the SQL behind each panel with one click. Run the same de-vig arithmetic against live chain for the Strasmore terminal.