Strasmore Research
Learn Matt ConnorBy Matt Connor

Event Contract Prices as Probabilities

An event contract settles at $1 or $0, so its price is a probability. See why Yes plus No costs more than $1, and how to strip the spread back out.

An event contract price is a probability with a spread wrapped around it. The contract pays $1.00 if the stated outcome happens and $0.00 if it does not, and that fixed payout is what makes the arithmetic work: 30 cents on a contract that pays a dollar is the market quoting roughly a 30% chance. Reading the number honestly takes one adjustment for the spread and one for the mechanics sitting behind settlement.

What an event contract price says about probability

Everything follows from the payout. Buy a Yes contract at price p and you collect $1.00 if the outcome resolves Yes and nothing if it resolves No. Over many repetitions the average payout is the true probability of Yes. Pay exactly that probability and you break even. The price paid is the break-even probability, which is why one number does duty as both.

Four terms, defined once:

  • Yes contract: pays $1.00 on the outcome happening, $0.00 otherwise.
  • No contract: pays $1.00 on the outcome not happening. Yes and No are two halves of one coin.
  • Settlement: the moment the contract resolves and one side collects the dollar.
  • Resolution source: the named report or feed the contract settles against. It pays on what that source states, not on what happened.

Event contract quotes are not part of the data set behind this page. Every panel below measures the identical arithmetic where it can be measured directly, in listed US equity options. A call option's delta runs from 0 to 1 and approximates the market's odds that the contract expires in the money, the same binary question an event contract asks: above the line on the settlement date, or not. Delta is an approximation of that probability, and a risk-neutral one rather than a forecast. Both limits show up in the panels. The option delta guide covers the measure itself.

Why do Yes and No add up to more than $1?

A Yes and its matching No cover the whole outcome space, and exactly one of them pays. In an options chain the same pair is a call and a put at one strike and one expiry: the call finishes in the money above the strike, the put finishes in the money below it. Their probabilities have to total 100%. Here is that pair across one SPY chain on one day, grouped into 2% bands around the spot price.

QueryYes and No probabilities across one SPY chain: call side, put side, and the pair total
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 band
Run this yourself

At -8% vs spot the call side reads 91.6% and the put side 7.8%, a pair total of 99.5%. At the far end of the ladder, +6% vs spot, the two read 3.6% and 82.5%, totalling 86.2%. All 8 bands land within rounding of 100. That flat line across the chart is the constraint every binary market lives under. Aggregate positioning on the two sides is what the put call ratio counts.

Model values behave. Quotes do not. Say a contract is quoted 62 bid at 66 ask, and its No side 36 bid at 40 ask. Buy Yes at 66 and No at 40 and you have paid $1.06 for a position guaranteed to return $1.00. Sell both at their bids and you collect 98 cents against a $1.00 liability. The 6 cent gap between the two asks is the overround, the quantity a sports bettor calls the vig, and it is what the venue and the market maker are paid for standing there. The bid ask spread page covers why that gap exists at all.

The de-vig arithmetic, step by step

Two quoted prices go in. Two fair probabilities that sum to one come out.

  1. Take the mid of each side. Yes mid is 64 cents, No mid is 38 cents.
  2. Add them. The book totals 102 cents.
  3. Divide each mid by that total. 64 / 102 is 62.7%. 38 / 102 is 37.3%.
  4. Check the sum. The pair now reads 100%.

That rescaling is all de-vigging means, and it is the same normalization a bettor applies to decimal odds.

Now run it on a tighter market. Quote the same contract 63 bid at 64 ask, with No at 36 bid and 37 ask. The mids are 63.5 and 36.5, the book totals exactly 100 cents, and the de-vigged probability is 63.5%. The two answers, 62.7% off the wide market and 63.5% off the tight one, sit less than a point apart. The honest band around them does not. Any probability between the 62 cent bid and the 66 cent ask is consistent with the wide quote, so a 4 cent market pins the odds to within about 4 points and no further. Writing "62.7%" from a 4 cent market states three digits of precision the market does not contain. Spread width is precision.

Does a 30% price mean it happens 30% of the time?

Calibration is the test: gather everything the market priced near 30%, then count how often it happened. Every SPY call contract on file from January 2022, snapshotted about 30 days before expiry, sorted into implied probability buckets, against whether SPY closed above that strike on the expiration date.

QueryImplied probability vs what happened: SPY calls 30 days from expiry, 2022 through June 2026
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_pct
Run this yourself

The implied column rises across the ladder by construction. The realized column is the part nobody knew in advance. At the bottom, the 2-10% bucket averaged 4.7% implied across 4276 contracts and finished above its strike 4.9% of the time. At the top, 90-98% averaged 94.3% and landed 97.8%. The realized share at the bottom of the ladder sits far below the realized share at the top, which is what calibration looks like when it roughly holds.

Two caveats travel with any table like this. The window matters: a sample covering mostly rising prices lifts the realized column on every call bucket, and a different period moves the same measurement. And delta answers what probability makes the pricing internally consistent, not what any forecaster believes. The same chain prices a whole distribution rather than one threshold (the expected move).

Narrowing to contracts the market called a coin flip, near 50 cents on the dollar, across six household names:

QueryContracts priced near a coin flip: implied vs realized outcome by name, 2023 through June 2026
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 DESC
Run this yourself

Implied probability sits near 50% in every row by construction. The realized column spreads out: SPY finished above its strike 68.4% of the time across 4785 contracts, against 49.9% for XOM. 6 names, one shared implied probability, and a wide range of what actually happened. A price near 50 cents describes the market's odds. Any single contract still settles at $1.00 or $0.00.

What is the break-even on a $0.70 contract?

A contract bought at 70 cents pays $1.00 on Yes and nothing on No. The profit is 30 cents, the loss is 70 cents, and the break-even probability is exactly the price. At a true 70% the position is a coin flip with extra steps. Above 70% the arithmetic runs in the buyer's favor, below it against, all before costs.

Costs move that line unevenly. Add one cent of round trip cost to a 70 cent contract and the break-even shifts from 70% to about 71%, a rounding error on the position. Add the same penny to a 5 cent contract and the break-even moves from 5% to 6%, taking a fifth of the theoretical edge with it. Fixed fees do the most damage on the cheapest long shots, where the fee is the largest fraction of the price paid. Order type works the same way: crossing the spread pays the full ask, while a resting limit order sits at a price you name and may never fill (market order vs limit order).

Why does a near certain outcome trade at $0.97?

An outcome nobody disputes still rarely trades at $1.00. Four things live in those last 3 cents:

  • Time value of money. The dollar arrives at settlement. Paying 97 cents today for $1.00 in three months is a return on capital, and that cash has other uses (parking idle cash).
  • Resolution source risk. The contract settles on what the named source reports, on the schedule that source keeps. Revisions, delays, and ambiguous wording stay live even on an agreed outcome.
  • The spread itself. A market quoted 96 bid at 98 ask has a 97 cent mid and no trades at 97. In percentage terms the book is often widest right at the edges.
  • The tail. "Certain" is a word people use loosely. Contracts settle on the definition in the rulebook.

The convergence is measurable. Take SPY calls priced near a coin flip a month before expiry, split them by what eventually happened, and watch the average implied probability at six checkpoints.

QueryHow a near coin flip resolves: average implied probability by checkpoint, split by outcome
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) DESC
Run this yourself

At 30 days out, the contracts that eventually finished above their strike carried an average implied probability of 52.6%, against 47.8% for the ones that did not. By 1 day out the same two groups read 79.8% and 14.4%. The split is drawn with hindsight. Nobody reading the chain at the first checkpoint could tell the two groups apart, which is the state a live event contract is always in. Certainty arrives on the settlement date, and the price walks there gradually. Settlement rules fix the exact moment: AM vs PM settled options shows how much that timing detail can matter, and implied volatility is the same chain's answer to the size question rather than the direction one.

Data notes and limits

Delta is a stand-in for a Yes price, not the same object. It approximates the risk-neutral odds of expiring in the money and differs slightly from the model probability of the same event. Outcomes here compare the regular-session closing price on the expiration date against the strike, which approximates settlement rather than reproducing an official settlement value. Every options panel filters on converged implied volatility and non-zero volume for that contract on that date, so quiet contracts drop out of the sample. Each contract enters the calibration panels once, at the snapshot closest to 30 days from expiry.

Event contract pricing FAQ

Is an event contract price the same as a probability?

It is a probability carrying two adjustments. The quote includes the spread charged by the venue and the market makers, and it prices a dollar received at settlement rather than today. Strip both out and what remains is the market's clearing estimate of the odds.

What does de-vigging a two sided market do?

It rescales the two mids so they sum to 100%. Add the Yes mid and the No mid, then divide each by that total. A 64 cent Yes beside a 38 cent No totals 102 cents, and the de-vigged pair reads 62.7% and 37.3%.

Why do the Yes and No prices add up to more than a dollar?

One of the two is certain to pay $1.00, so a frictionless pair would cost exactly $1.00 together. The extra cents on the ask side are the overround, the spread revenue built into a two sided market. Selling both sides instead lands you under a dollar, at the mirror image of the same gap.

Does a contract priced at 90 cents fail one time in ten?

Roughly, if the market is well calibrated across many similar contracts. In the SPY panel above, the 90-98% bucket carried an average implied probability of 94.3% and finished above its strike 97.8% of the time. A single contract still resolves at one dollar or zero.

How much does a wide spread change the implied probability?

By about the width of the spread. A 1 cent market pins the odds to within a point. A 4 cent market leaves a 4 point band, and every probability inside that band is consistent with the quote.


Every number above comes from a stored query over listed contract data, with the SQL behind each panel one click away. Run the same de-vig arithmetic against a live chain on the Strasmore terminal.

#prediction markets#event contracts#probability#market mechanics#options