{"slug":"event-contract-prices-as-probabilities","qid":"convergence","label":"How a near coin flip resolves: average implied probability by checkpoint, split by outcome","post_title":"Event Contract Prices as Probabilities","post_url":"/blog/event-contract-prices-as-probabilities#q-convergence","columns":["checkpoint","eventual_yes_pct","eventual_no_pct","contract_days"],"rows":[{"checkpoint":"30 days out","eventual_yes_pct":52.6,"eventual_no_pct":47.8,"contract_days":5650},{"checkpoint":"21 days out","eventual_yes_pct":61.3,"eventual_no_pct":41.9,"contract_days":3871},{"checkpoint":"14 days out","eventual_yes_pct":66.3,"eventual_no_pct":36.8,"contract_days":3666},{"checkpoint":"7 days out","eventual_yes_pct":73.3,"eventual_no_pct":29.2,"contract_days":2177},{"checkpoint":"3 days out","eventual_yes_pct":76.8,"eventual_no_pct":27.2,"contract_days":1779},{"checkpoint":"1 day out","eventual_yes_pct":79.8,"eventual_no_pct":14.4,"contract_days":785}],"shape":"ranking","sql":"WITH px AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session,\n           argMax(toFloat64(close), window_start) AS close_px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-06-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY session\n),\ncoin_flips AS (\n    SELECT ticker AS contract\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol = 'SPY'\n      AND date >= toDate('2025-06-01')\n      AND expiration_date <= toDate('2026-06-30')\n      AND days_to_expiry BETWEEN 28 AND 32\n      AND iv_converged = 1\n      AND volume > 0\n      AND delta > 0\n    GROUP BY contract\n    HAVING avg(delta) BETWEEN 0.35 AND 0.65\n),\nobs AS (\n    SELECT g.days_to_expiry AS dte,\n           g.delta AS implied_prob,\n           if(px.close_px > toFloat64(g.strike_price), 1, 0) AS finished_above\n    FROM global_markets.options_greeks AS g\n    INNER JOIN coin_flips AS c ON g.ticker = c.contract\n    INNER JOIN px ON px.session = g.expiration_date\n    WHERE g.underlying_symbol = 'SPY'\n      AND g.date >= toDate('2025-06-01')\n      AND g.expiration_date <= toDate('2026-06-30')\n      AND g.iv_converged = 1\n      AND g.volume > 0\n      AND g.delta > 0\n      AND (g.days_to_expiry BETWEEN 28 AND 32\n        OR g.days_to_expiry BETWEEN 19 AND 23\n        OR g.days_to_expiry BETWEEN 12 AND 16\n        OR g.days_to_expiry BETWEEN 6 AND 8\n        OR g.days_to_expiry BETWEEN 3 AND 4\n        OR g.days_to_expiry <= 1)\n)\nSELECT multiIf(dte >= 28, '30 days out',\n               dte >= 19, '21 days out',\n               dte >= 12, '14 days out',\n               dte >= 6, '7 days out',\n               dte >= 3, '3 days out',\n                         '1 day out') AS checkpoint,\n       round(100 * avgIf(implied_prob, finished_above = 1), 1) AS eventual_yes_pct,\n       round(100 * avgIf(implied_prob, finished_above = 0), 1) AS eventual_no_pct,\n       count() AS contract_days\nFROM obs\nGROUP BY checkpoint\nHAVING countIf(finished_above = 1) > 0 AND countIf(finished_above = 0) > 0\nORDER BY avg(dte) DESC","computed_at":"2026-08-03T10:23:48.064847+00:00","elapsed":0.005472598}