Market Making in Prediction Markets
How market makers quote prediction markets: why a payoff capped at $1 makes inventory risk computable up front, and why spreads widen into resolution.
Market making in prediction markets is the job of posting a two-sided quote on an event contract and getting paid the spread for standing there. The structure underneath that job is unusual. The contract settles at $1 if the event happens and $0 if it does not, so the worst outcome on any position is a known number before the trade prints, and the same bound applies to every contract in the series.
One boundary before the mechanics. This post covers how a maker prices a quote and manages the position behind it. Matching-engine detail and queue priority sit outside it.
How market making in prediction markets differs from an equity book
An equity maker who ends the day long 1,000 shares of a $40 stock carries an open question into tomorrow. The loss has no defined floor short of zero, and the position has to be hedged or worked out of over time.
An event contract maker who ends the day long 10,000 yes contracts at 62 cents already knows the full range. The position pays $10,000 on a yes resolution and $0 on a no resolution. The cash committed is $6,200. Nothing that happens tomorrow moves those numbers. Inventory risk is capped at a dollar per contract and computable before the quote goes up.
The second structural difference is that the two-sided book is one book. Buying a yes at 62 cents and selling a no at 38 cents leave a trader in the same place, so a bid for yes at 61 is an offer of no at 39. A maker quoting both sides of an event is not running two inventories against each other. There is one position, expressed in whichever unit the venue prints.
Price does the work of probability in these markets, which our page on event contract prices as probabilities treats in full. A quote at 62 cents carries an implied chance near 62%, before the spread is stripped out.
What the spread has to cover
The spread pays for adverse selection: the standing risk that whoever lifts the quote knows something the maker does not. The general version of that trade-off is in how market makers make money. Event books sharpen it. Informed flow in an equity book is diffuse and slow. Informed flow in an event book concerns one question with one answer on one date, and the people who learn that answer early are a small, identifiable group.
There is a second sharpening. In an equity book the arrival rate of new information is roughly stationary across the life of a position. In an event book it is not. The hazard climbs into the resolution date, and the final hours carry more of the total information than the first month did.
Listed options give the closest measurable version of that mechanic. An option's delta is the rate its price moves per $1 of underlying, and for a call it runs from 0 to 1, which makes it a serviceable stand-in for the market's implied chance the contract finishes in the money. The panel below takes every SPY contract expiring on May 15, 2026 that traded, and tracks where those deltas sat on each session from April 1 into expiry.
| session | session_label | coin_flip_pct | near_settled_pct | contract_count |
|---|---|---|---|---|
| 2026-04-01 | Apr 1 | 18.8 | 41.7 | 218 |
| 2026-04-02 | Apr 2 | 20.4 | 39.3 | 211 |
| 2026-04-06 | Apr 6 | 19.8 | 42.5 | 207 |
| 2026-04-07 | Apr 7 | 21.2 | 40.8 | 184 |
| 2026-04-08 | Apr 8 | 15.1 | 35.6 | 239 |
| 2026-04-09 | Apr 9 | 15.7 | 35.6 | 216 |
| 2026-04-10 | Apr 10 | 12.6 | 40 | 270 |
| 2026-04-13 | Apr 13 | 11.7 | 40.2 | 256 |
| 2026-04-14 | Apr 14 | 11.3 | 44.5 | 265 |
| 2026-04-15 | Apr 15 | 11.4 | 50.2 | 263 |
| 2026-04-16 | Apr 16 | 10.5 | 53.3 | 276 |
| 2026-04-17 | Apr 17 | 6.8 | 60.4 | 293 |
| 2026-04-20 | Apr 20 | 9.4 | 52.3 | 298 |
| 2026-04-21 | Apr 21 | 8.8 | 51.6 | 318 |
| 2026-04-22 | Apr 22 | 9.5 | 50.3 | 296 |
| 2026-04-23 | Apr 23 | 9.7 | 50.3 | 300 |
| 2026-04-24 | Apr 24 | 8.2 | 53.8 | 316 |
| 2026-04-27 | Apr 27 | 8.4 | 57.3 | 274 |
| 2026-04-28 | Apr 28 | 8.6 | 56.3 | 279 |
| 2026-04-29 | Apr 29 | 9.3 | 57.3 | 248 |
The exact SQL behind every number
SELECT
toString(date) AS session,
formatDateTime(date, '%b %e') AS session_label,
round(100 * countIf(abs(delta) >= 0.4 AND abs(delta) <= 0.6) / count(), 1) AS coin_flip_pct,
round(100 * countIf(abs(delta) < 0.1 OR abs(delta) > 0.9) / count(), 1) AS near_settled_pct,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND expiration_date = '2026-05-15'
AND date >= '2026-04-01'
AND date <= '2026-05-15'
AND iv_converged = 1
AND volume > 0
GROUP BY date
ORDER BY dateOn Apr 1, 18.8% of the traded contracts sat in the coin-flip band, a delta between 0.4 and 0.6, and 41.7% were already parked near 0 or near 1. By May 14, the coin-flip band held 1.8% and the parked group held 86.6%, across the 31 sessions in view. The middle drains. An event contract book does the same thing on its way to settlement, and a maker holding inventory watches the range of surviving outcomes narrow onto one of the two ends.
Why quotes widen ahead of resolution
The draining is gradual. The sensitivity underneath it is not. The next panel groups near-the-money SPY contracts by days left and reports two measurements: the implied volatility carried in the price, and how far delta travels on a 1% move in the underlying.
| dte_bucket | atm_iv_pct | delta_shift | contract_count |
|---|---|---|---|
| 0-1d | 20.4 | 0.275 | 2387 |
| 2-3d | 17.4 | 0.229 | 3666 |
| 4-7d | 14.7 | 0.191 | 9744 |
| 8-14d | 14.8 | 0.149 | 13644 |
| 15-30d | 15.7 | 0.103 | 9574 |
| 31-60d | 15.7 | 0.075 | 10446 |
The exact SQL behind every number
SELECT
multiIf(days_to_expiry <= 1, '0-1d',
days_to_expiry <= 3, '2-3d',
days_to_expiry <= 7, '4-7d',
days_to_expiry <= 14, '8-14d',
days_to_expiry <= 30, '15-30d',
'31-60d') AS dte_bucket,
round(100 * avg(toFloat64(implied_volatility)), 1) AS atm_iv_pct,
round(avg(toFloat64(gamma) * toFloat64(underlying_close)) / 100, 3) AS delta_shift,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date >= '2026-04-01'
AND date <= '2026-06-30'
AND iv_converged = 1
AND volume > 0
AND days_to_expiry >= 0
AND days_to_expiry <= 60
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.02
GROUP BY dte_bucket
ORDER BY min(days_to_expiry)Inside a day of expiry, a 1% move in the underlying shifted delta by 0.275. In the 31-60d bucket the same move shifted it by 0.075. Implied volatility on the same near-the-money contracts ran 20.4% at the front of the curve against 15.7% at the back.
Translate that into an event book. A month out, a headline moves a contract a few cents and the maker's inventory reprices gently. Twenty minutes before a scheduled release, the same headline can carry the price from 20 cents to 90, and every contract of inventory moves with it. Quoting behaviour around those windows follows the sensitivity: spreads widen ahead of scheduled resolution events, and some makers withdraw across the window entirely. A book that looks abandoned half an hour before a number lands is usually a book whose makers have priced that window and declined it.
Inventory skewing on a bounded payoff
A maker filled repeatedly on the yes side does not usually pull the quote. The standard response is a skew: keep quoting both sides, with both prices shifted a tick or two toward the inventory the maker wants to shed. In a bounded market the skew has a natural reference point. Every contract of yes inventory carries a known worst case, so the skew can be sized against a loss number rather than against a volatility estimate.
The yes and no symmetry is measurable in options as well. At a matched strike, a call delta and a put delta describe the same event from opposite ends, and the pair adds to about 1.
| strike_vs_spot | call_delta | put_delta_abs | delta_sum | contract_count |
|---|---|---|---|---|
| -5% | 0.836 | 0.176 | 1.012 | 1391 |
| -4% | 0.808 | 0.206 | 1.014 | 2864 |
| -3% | 0.758 | 0.254 | 1.011 | 3087 |
| -2% | 0.699 | 0.312 | 1.011 | 3387 |
| -1% | 0.623 | 0.382 | 1.005 | 3510 |
| +0% | 0.537 | 0.463 | 1.001 | 3678 |
| +1% | 0.442 | 0.552 | 0.994 | 3282 |
| +2% | 0.343 | 0.643 | 0.986 | 2739 |
| +3% | 0.245 | 0.725 | 0.97 | 2263 |
| +4% | 0.165 | 0.793 | 0.958 | 1919 |
| +5% | 0.115 | 0.822 | 0.937 | 817 |
The exact SQL behind every number
SELECT
concat(if(strike_pct >= 0, '+', ''), toString(strike_pct), '%') AS strike_vs_spot,
round(avgIf(d, is_call), 3) AS call_delta,
round(-avgIf(d, NOT is_call), 3) AS put_delta_abs,
round(avgIf(d, is_call) - avgIf(d, NOT is_call), 3) AS delta_sum,
count() AS contract_count
FROM
(
SELECT
toFloat64(delta) AS d,
startsWith(lower(option_type), 'c') AS is_call,
toInt32(round(100 * (toFloat64(strike_price) / toFloat64(underlying_close) - 1))) AS strike_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date >= '2026-04-01'
AND date <= '2026-06-30'
AND iv_converged = 1
AND volume > 0
AND days_to_expiry >= 20
AND days_to_expiry <= 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) <= 0.05
)
GROUP BY strike_pct
HAVING countIf(is_call) > 0 AND countIf(NOT is_call) > 0
ORDER BY strike_pctAt the -5% bucket, the average call delta was 0.836 and the average put delta, sign removed, was 0.176. The pair sums to 1.012. At +5%, the far end of the panel, the same sum came to 0.937. Across all 11 strike buckets the sum holds near 1. That is the options version of a yes and a no that always add up to a dollar.
What a quote costs to show
Spread and depth move together through a session in any book. The panel below takes every national best bid and offer printed for Coca-Cola, ticker KO, across one Wednesday session in June 2026, and buckets them into half hours of New York clock time.
| et_time | median_spread_bps | median_quoted_size |
|---|---|---|
| 04:00 | 31.78 | 200 |
| 04:30 | 12.48 | 300 |
| 05:00 | 19.34 | 250 |
| 05:30 | 13.72 | 200 |
| 06:00 | 8.74 | 300 |
| 06:30 | 6.24 | 300 |
| 07:00 | 6.24 | 300 |
| 07:30 | 10 | 300 |
| 08:00 | 11.26 | 300 |
| 08:30 | 13.76 | 500 |
| 09:00 | 21.28 | 300 |
| 09:30 | 2.53 | 900 |
| 10:00 | 1.26 | 1000 |
| 10:30 | 1.26 | 900 |
| 11:00 | 1.25 | 1100 |
| 11:30 | 1.25 | 1200 |
| 12:00 | 1.25 | 1200 |
| 12:30 | 1.25 | 1200 |
| 13:00 | 1.25 | 1200 |
| 13:30 | 1.25 | 1200 |
The exact SQL behind every number
SELECT
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(quantileDeterministic(0.5)(10000 * (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2), toUInt64(sequence_number)), 2) AS median_spread_bps,
round(quantileDeterministic(0.5)(toFloat64(bid_size) + toFloat64(ask_size), toUInt64(sequence_number)), 0) AS median_quoted_size
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'KO'
AND sip_timestamp >= '2026-06-17 08:00:00'
AND sip_timestamp < '2026-06-18 00:00:00'
AND bid_price > 0
AND ask_price > bid_price
AND sequence_number >= 0
GROUP BY et_time
ORDER BY et_timeThe first half hour with quotes on the tape, 04:00 ET, carried a median spread of 31.78 basis points with a combined 200 of size across the two sides. The final bucket, 19:30 ET, printed 10.01 basis points. Between them sits the regular session, where participation is heaviest and the quote is tightest. Event books show the same daily shape. A quote is always priced against who else is standing there at that hour.
Collateral sets the ceiling on size
An event contract maker posts the full loss as collateral. Showing 10,000 yes at 62 cents ties up $6,200 against that quote, and a quote on the no side carries its own requirement. There is no leverage inside the position, so the size a maker can display is a direct function of the capital on deposit. That arithmetic is worked through in event contract collateral and max loss.
Two practical reads follow for anyone watching an event book. Thin depth is frequently a capital constraint rather than a view on the price. And depth tends to rebuild once a contract settles and releases the collateral behind it, which is part of why settlement timing matters to liquidity; how event contracts settle covers that sequence.
One more thing the screen hides. The yes ask and the no ask usually sum above a dollar, and that gap is the maker's gross edge in the same sense that vig is a sportsbook's. Recovering the underlying probability means removing it, which is the exercise in how to devig betting odds.
What the venues actually disclose
Public disclosure stops well short of the quoting logic. Robinhood's explainer of its event contract structure names the market makers that provide liquidity and describes the exchange relationship, then stops before anything about how those quotes get priced. Venues publish market data interfaces without publishing the risk framework sitting behind a quote.
Public code repositories, meanwhile, carry open-source market making bots aimed at Polymarket, some of them actively maintained as of September 2026. Read those as evidence that the demand to quote these books is real. They are not desk strategies, and they run without the collateral base or the risk limits of the firms they imitate.
FAQ
How do market makers make money on prediction markets?
They quote a bid and an offer on the same event contract and collect the difference when both sides fill, less whatever informed flow takes out of them. The gross edge shows up as the amount by which the yes ask and the no ask sum above a dollar.
What is inventory risk on an event contract?
It is the risk of holding a position when the event resolves. That risk is bounded: every contract is worth either $1 or $0 at settlement, so the maximum loss on a long yes is the price paid, and on a short yes it is a dollar minus the price received.
Why do prediction market spreads widen before resolution?
The rate at which decisive information arrives climbs as the resolution date approaches, and the same news moves the price further the closer a contract sits to settlement. Widening the quote, or withdrawing it, is how a maker prices that window.
Is buying yes the same as selling no?
In payoff terms, yes. A long yes and a short no at mirrored prices leave the same exposure, which is why a two-sided event book behaves as one position rather than two.
Every panel above ships with the SQL that produced it. Open one and change the ticker or the expiry to test the same mechanic somewhere else on the Strasmore terminal.