Ceny kontraktów zdarzeniowych jako prawdopodobieństwo
Kontrakt zdarzeniowy wypłaca 1 USD albo 0 USD, więc jego cena wskazuje prawdopodobieństwo. Wyjaśniono, dlaczego Yes i No kosztują łącznie więcej niż 1 USD oraz jak skorygować spread.
Cena kontraktu na dane zdarzenie odzwierciedla prawdopodobieństwo, powiększone o spread. Kontrakt wypłaca 1,00 USD, jeśli określony wynik nastąpi, oraz 0,00 USD, jeśli do tego nie dojdzie. To stała wypłata sprawia, że rachunek jest prosty: 30 centów za kontrakt wypłacający dolara oznacza, że rynek wycenia prawdopodobieństwo na około 30%. Aby właściwie zinterpretować tę wartość, należy uwzględnić spread oraz mechanizmy związane z rozliczeniem.
Co mówi cena kontraktu zdarzeniowego o prawdopodobieństwie
Wszystko wynika z wypłaty. Kupując kontrakt Yes po cenie p, otrzymuje się 1,00 USD, jeśli wynik zostanie rozstrzygnięty jako Yes, oraz zero, jeśli zostanie rozstrzygnięty jako No. Przy wielu powtórzeniach średnia wypłata odpowiada rzeczywistemu prawdopodobieństwu wyniku Yes. Zapłata dokładnie tej wartości oznacza wyjście na zero. Zapłacona cena jest więc prawdopodobieństwem progu rentowności, dlatego jedna liczba pełni obie funkcje.
Cztery terminy, zdefiniowane raz:
- Kontrakt Yes: wypłaca 1,00 USD, jeśli dane zdarzenie nastąpi, oraz 0,00 USD w przeciwnym razie.
- Kontrakt No: wypłaca 1,00 USD, jeśli dane zdarzenie nie nastąpi. Yes i No to dwie strony tej samej monety.
- Rozliczenie: moment, w którym kontrakt zostaje rozstrzygnięty i jedna ze stron otrzymuje dolara.
- Źródło rozstrzygnięcia: wskazany raport lub feed, na podstawie którego rozliczany jest kontrakt. Wypłata następuje zgodnie z tym, co stwierdzi to źródło, a nie zgodnie z tym, co faktycznie się wydarzyło.
Kwotowania kontraktów zdarzeniowych nie są częścią zbioru danych wykorzystanego na tej stronie. Każdy z poniższych paneli mierzy identyczne działanie matematyczne tam, gdzie można je bezpośrednio zmierzyć — na rynku notowanych opcji na akcje spółek z USA. Delta opcji call mieści się w przedziale od 0 do 1 i przybliża rynkowe prawdopodobieństwo, że kontrakt wygaśnie w pieniądzu. Jest to to samo pytanie binarne, które stawia kontrakt zdarzeniowy: czy w dniu rozliczenia kurs znajdzie się powyżej określonego poziomu, czy nie. Delta jest przybliżeniem tego prawdopodobieństwa i ma charakter neutralny względem ryzyka, a nie prognostyczny. Oba ograniczenia są widoczne w panelach. W przewodniku delta opcji omówiono samą miarę.
Dlaczego Yes i No sumują się do więcej niż 1 USD?
Yes i odpowiadający mu No obejmują całą przestrzeń wyników, a wypłatę zapewnia dokładnie jedna z tych stron. W łańcuchu opcji ta sama para odpowiada opcji call i put przy tej samej cenie wykonania i terminie wygaśnięcia: call kończy się in the money powyżej ceny wykonania, a put — poniżej niej. Ich prawdopodobieństwa muszą łącznie wynosić 100%. Poniżej przedstawiono tę parę w jednym łańcuchu SPY z jednego dnia, pogrupowaną w przedziały o szerokości 2% wokół bieżącej ceny.
Dokładny kod SQL dla każdej liczby
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 bandDla -8% vs spot strona call wynosi 91.6%, a strona put 7.8%, co daje łącznie 99.5%. Na drugim końcu drabinki, +6% vs spot, wartości wynoszą odpowiednio 3.6% i 82.5%, czyli łącznie 86.2%. Wszystkie 8 przedziały mieszczą się, z uwzględnieniem zaokrągleń, w granicach 100%. Ta stała linia na wykresie odzwierciedla ograniczenie, któremu podlega każdy rynek binarny. Łączne pozycjonowanie po obu stronach mierzy wskaźnik put/call.
Wartości modelowe zachowują się prawidłowo. Notowania już niekoniecznie. Załóżmy, że kontrakt jest kwotowany z ofertą kupna 62 i ofertą sprzedaży 66, a jego strona No — odpowiednio 36 i 40. Kupno Yes po 66 i No po 40 oznacza zapłatę 1,06 USD za pozycję, która gwarantowanie wypłaci 1,00 USD. Sprzedaż obu stron po cenach bid przynosi 98 centów przy zobowiązaniu wynoszącym 1,00 USD. Różnica 6 centów między dwiema ofertami sprzedaży to overround, czyli wartość określana przez obstawiających sportowych jako vig. Stanowi ona wynagrodzenie venue i market makera za zapewnianie płynności. Strona spread bid-ask wyjaśnia, skąd w ogóle bierze się ta różnica.
Obliczenia de-vig krok po kroku
Na wejściu są dwa kwotowania. Na wyjściu otrzymuje się dwie wartości godziwe prawdopodobieństwa, których suma wynosi jeden.
- Należy wyznaczyć środek kwotowania dla każdej strony. Środek dla „Yes” wynosi 64 centy, a dla „No” — 38 centów.
- Należy je dodać. Łączna wartość kwotowań wynosi 102 centy.
- Każdy środek należy podzielić przez tę sumę. 64 / 102 to 62,7%. 38 / 102 to 37,3%.
- Należy sprawdzić sumę. Obie wartości wynoszą teraz łącznie 100%.
Na tym właśnie polega de-vigging. Jest to ta sama normalizacja, którą obstawiający stosuje w przypadku kursów dziesiętnych.
Następnie można przeprowadzić obliczenie dla rynku o węższym spreadzie. Ten sam kontrakt jest kwotowany po 63 centy po stronie bid i 64 centy po stronie ask, a dla „No” kwotowanie wynosi odpowiednio 36 i 37 centów. Środki kwotowań wynoszą 63,5 i 36,5 centa, łączna wartość kwotowań dokładnie 100 centów, a prawdopodobieństwo po de-vig wynosi 63,5%. Obie wartości — 62,7% dla szerokiego rynku i 63,5% dla wąskiego — różnią się o mniej niż punkt procentowy. Przedział uzasadnionych wartości wokół nich już nie jest jednak tak wąski. Każde prawdopodobieństwo między ofertą bid na poziomie 62 centów a ofertą ask na poziomie 66 centów jest zgodne z szerokim kwotowaniem. Oznacza to, że rynek z czterocentowym spreadem określa prawdopodobieństwo z dokładnością do około 4 punktów procentowych i nie zapewnia większej precyzji. Zapis „62,7%” na podstawie rynku z czterocentowym spreadem sugeruje trzy cyfry dokładności, których rynek nie zawiera. Szerokość spreadu określa precyzję.
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.
Dokładny kod SQL dla każdej liczby
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 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:
Dokładny kod SQL dla każdej liczby
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 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.
Jaki jest próg rentowności kontraktu po 0,70 USD?
Kontrakt kupiony po 70 centów wypłaca 1,00 USD w przypadku wyniku Yes i nie wypłaca nic w przypadku wyniku No. Zysk wynosi 30 centów, a strata 70 centów. Prawdopodobieństwo progu rentowności jest dokładnie równe cenie. Przy rzeczywistym prawdopodobieństwie wynoszącym 70% pozycja sprowadza się do rzutu monetą z dodatkowymi etapami. Powyżej 70% rachunek działa na korzyść kupującego, a poniżej tej wartości — przeciwko niemu, jeszcze przed uwzględnieniem kosztów.
Koszty przesuwają ten próg nierównomiernie. Dodanie jednego centa kosztu całej transakcji do kontraktu po 70 centów przesuwa próg rentowności z 70% do około 71%. W przypadku takiej pozycji jest to błąd zaokrąglenia. Dodanie tego samego centa do kontraktu po 5 centów przesuwa próg z 5% do 6%, pochłaniając przy tym jedną piątą teoretycznej przewagi. Stałe opłaty najbardziej obciążają najtańsze zakłady o niskim prawdopodobieństwie, ponieważ stanowią największą część zapłaconej ceny. Rodzaj zlecenia działa podobnie: przekroczenie spreadu oznacza zapłatę pełnej ceny ask, natomiast oczekujące zlecenie z limitem pozostaje po wskazanej przez inwestora cenie i może nigdy nie zostać zrealizowane (zlecenie market a zlecenie z limitem).
Dlaczego wynik niemal pewny jest notowany po 0,97 USD?
Nawet wynik, którego nikt nie kwestionuje, rzadko jest notowany po 1,00 USD. Ostatnie 3 centy odzwierciedlają cztery czynniki:
- Wartość pieniądza w czasie. Dolar zostanie wypłacony w dniu rozliczenia. Zapłata dziś 97 centów za 1,00 USD za trzy miesiące oznacza zwrot z kapitału, a gotówkę można wykorzystać w inny sposób (lokowanie wolnej gotówki).
- Ryzyko związane ze źródłem rozliczenia. Kontrakt jest rozliczany na podstawie danych publikowanych przez wskazane źródło, zgodnie z jego harmonogramem. Korekty, opóźnienia i niejednoznaczne brzmienie pozostają istotne nawet w przypadku uzgodnionego wyniku.
- Sam spread. Rynek z kwotowaniem 96 centów po stronie bid i 98 centów po stronie ask ma średnią cenę 97 centów, ale przy 97 centach nie dochodzi do transakcji. W ujęciu procentowym spread jest często najszerszy właśnie na krańcach przedziału.
- Ryzyko ogona rozkładu. Słowo „pewny” jest używane zbyt swobodnie. Kontrakty są rozliczane zgodnie z definicją zawartą w regulaminie.
Konwergencję można zmierzyć. Wystarczy wybrać opcje call na SPY wyceniane mniej więcej jak rzut monetą na miesiąc przed wygaśnięciem, podzielić je według późniejszego wyniku i prześledzić średnie prawdopodobieństwo implikowane w sześciu punktach kontrolnych.
Dokładny kod SQL dla każdej liczby
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) DESCW punkcie 30 days out kontrakty, które ostatecznie zakończyły się powyżej ceny wykonania, miały średnie prawdopodobieństwo implikowane na poziomie 52.6%, wobec 47.8% w przypadku kontraktów, które tego warunku nie spełniły. W punkcie 1 day out te same dwie grupy miały odpowiednio 79.8% i 14.4%. Podział został dokonany z wykorzystaniem informacji ex post. Na podstawie łańcucha opcji w pierwszym punkcie kontrolnym nie można było rozróżnić obu grup. Taka sytuacja zawsze występuje w przypadku aktywnego kontraktu na wynik określonego zdarzenia. Pewność pojawia się w dniu rozliczenia, a cena stopniowo do niej konwerguje. Zasady rozliczenia określają dokładny moment: opcje rozliczane według kursu AM i PM pokazują, jak duże znaczenie może mieć ten szczegół czasowy, natomiast zmienność implikowana odpowiada na pytanie o skalę ruchu, a nie o jego kierunek.
Uwagi dotyczące danych i ograniczeń
Delta jest przybliżeniem ceny kontraktu typu Yes, ale nie jest z nią tożsama. Przybliża neutralne względem ryzyka prawdopodobieństwo wygaśnięcia w pieniądzu i nieznacznie różni się od modelowego prawdopodobieństwa tego samego zdarzenia. Wyniki porównują regularną cenę zamknięcia sesji w dniu wygaśnięcia z ceną wykonania. Jest to przybliżenie rozliczenia, a nie odtworzenie oficjalnej wartości rozliczeniowej. Każdy panel opcji obejmuje wyłącznie kontrakty ze stabilną zmiennością implikowaną i niezerowym wolumenem w danym dniu, dlatego kontrakty o niskiej aktywności wypadają z próby. Każdy kontrakt trafia do paneli kalibracyjnych jeden raz, w obserwacji najbliższej terminowi 30 dni do wygaśnięcia.
FAQ dotyczące wyceny kontraktów na zdarzenia
Czy cena kontraktu na zdarzenie jest tym samym co prawdopodobieństwo?
Jest prawdopodobieństwem z uwzględnieniem dwóch korekt. Kwotowanie obejmuje spread pobierany przez platformę i animatorów rynku. Uwzględnia także fakt, że rozliczenie następuje w przyszłości, a nie dziś. Po odjęciu obu tych elementów pozostaje rynkowa ocena prawdopodobieństwa wynikająca z równowagi zleceń.
Na czym polega usuwanie marży z rynku dwustronnego?
Polega na przeskalowaniu obu środkowych kwotowań tak, aby ich suma wynosiła 100%. Należy dodać kwotowanie środkowe dla Yes i kwotowanie środkowe dla No, a następnie podzielić każde z nich przez tę sumę. Kwotowanie Yes na poziomie 64 centów i No na poziomie 38 centów daje łącznie 102 centy. Po usunięciu marży odpowiada to wartościom 62,7% i 37,3%.
Dlaczego ceny Yes i No sumują się do kwoty wyższej niż jeden dolar?
Jedna z tych dwóch pozycji z pewnością wypłaci 1,00 USD. W warunkach bez tarć rynkowych ich łączny koszt wynosiłby dokładnie 1,00 USD. Dodatkowe centy po stronie ofert sprzedaży stanowią marżę overround, czyli przychód ze spreadu wbudowany w rynek dwustronny. Sprzedaż obu stron daje natomiast mniej niż jednego dolara, co stanowi lustrzane odzwierciedlenie tej samej różnicy.
Czy kontrakt wyceniony na 90 centów kończy się niepowodzeniem raz na dziesięć przypadków?
W przybliżeniu tak, jeżeli rynek jest dobrze skalibrowany dla wielu podobnych kontraktów. W przedstawionym wyżej panelu SPY koszyk 90-98% miał średnie implikowane prawdopodobieństwo wynoszące 94.3% i zakończył się powyżej ceny wykonania 97.8% razy. Pojedynczy kontrakt i tak kończy się rozliczeniem w wysokości jednego dolara albo zera.
W jakim stopniu szeroki spread zmienia implikowane prawdopodobieństwo?
W przybliżeniu o szerokość spreadu. Rynek ze spreadem wynoszącym 1 cent ogranicza prawdopodobieństwo do przedziału o szerokości jednego punktu procentowego. Rynek ze spreadem wynoszącym 4 centy pozostawia przedział o szerokości 4 punktów procentowych. Każde prawdopodobieństwo mieszczące się w tym przedziale jest zgodne z kwotowaniem.
Wszystkie liczby powyżej pochodzą z zapisanego zapytania obejmującego dane o notowanych kontraktach. Kod SQL dla każdego panelu jest dostępny jednym kliknięciem. Te same obliczenia po usunięciu marży można przeprowadzić na bieżącym łańcuchu kwotowań w terminalu Strasmore.