How Kalshi Pricing Works: Bid, Ask, Depth and the Microprice

Kalshi does not write a price. It shows you a queue, and the number in the middle of it is the wrong answer.

Meet your classmates

Same five, standing in front of an order book.

Two stacks, not one number

On one side, everybody willing to buy and how much. On the other, everybody willing to sell. That is the whole market: two stacks facing each other, with a gap between the best of each.

There is no bookmaker deciding anything. There is just the gap.

Why the middle of the gap lies

Take 40 bid and 44 ask. The obvious answer is 42. The obvious answer is usually wrong.

What matters is how much is stacked on each side. If there are 2,000 contracts wanting to buy at 40 and only 30 willing to sell at 44, that market is not at 42. It is about to trade at 44, because the thin side is the side that is about to get taken.

So we lean the price toward the thin side. That is the microprice, and it is what this site uses everywhere a Kalshi price appears.

And the screen price is a price for a size

"44 cents" means 44 cents for the thirty that are there. Want three hundred? You are paying more than 44 for most of them. Every quoted price on every exchange comes with a quantity attached, and ignoring it is how people talk themselves into edges that are not there.

Kalshi quotes a two-sided order book in whole cents: a best bid, a best ask, and the number of contracts resting at each. The fair price sits between them, but not at the midpoint. The microprice weights each side by the depth on the opposite side, so it leans toward whichever side is thinner.

Want more math?the Nerd Corner

Nerd Corner

Advanced material. Nothing above depends on it.

The book is two stacks

Every contract has one book with two sides. Bids are resting buy orders: what someone will pay, and for how many. Asks are resting sell orders. A quote is four numbers, not two:

bid 49¢×800ask 51¢×200\text{bid } 49\text{¢} \times 800 \quad\big|\quad \text{ask } 51\text{¢} \times 200

Read: 800 contracts are bid at 49¢, 200 offered at 51¢, and the market is 2¢ wide. Prices tick in whole cents from 1 to 99. And because a contract pays $1 or $0, the two sides of the event are one book seen from two ends:

buy NO at 49¢    sell YES at 51¢PNO=1PYES\text{buy NO at } 49\text{¢} \;\equiv\; \text{sell YES at } 51\text{¢} \qquad P_{\text{NO}} = 1 - P_{\text{YES}}

That identity matters when you compare venues. Betfair quotes the same object as decimal back/lay odds; invert to probability first (P=1/dP = 1/d) and it is the same four numbers.

The midpoint is the lazy answer

Nearly every tool prints the midpoint and calls it fair value:

mid=bid+ask2=49+512=50¢\text{mid} = \frac{\text{bid} + \text{ask}}{2} = \frac{49 + 51}{2} = 50\text{¢}

It is cheap, it is symmetric, and it throws away half the information on the screen. Consider two books that a midpoint cannot tell apart:

Book A: 49×800  51×200Book B: 49×200  51×800\text{Book A: } 49 \times 800 \ \big|\ 51 \times 200 \qquad \text{Book B: } 49 \times 200 \ \big|\ 51 \times 800

Both mid at 50¢. But in Book A, 800 contracts of demand sit queued against 200 of supply. The offers are about to be eaten, and the next print is far likelier at 51 than at 49. In Book B the pressure runs the other way. Queue imbalance is information, and the midpoint discards all of it.

The microprice

The fix is one line. Weight each side’s price by the depth resting on the opposite side:

microprice=bid×Qask+ask×QbidQbid+Qask\text{microprice} = \frac{\text{bid} \times Q_{\text{ask}} + \text{ask} \times Q_{\text{bid}}}{Q_{\text{bid}} + Q_{\text{ask}}}

where:

  • bid\text{bid}, ask\text{ask}: best bid and best ask, in dollars (or cents; the formula is scale-free).
  • QbidQ_{\text{bid}}: contracts resting at the best bid.
  • QaskQ_{\text{ask}}: contracts resting at the best ask.

The cross-multiplication is the part that surprises people, and it is exactly right. A big QbidQ_{\text{bid}} means a long queue of buyers, which pulls the estimate up toward the ask: the thin side, the side about to get taken. The idea is Stoikov’s: the microprice is an estimator of where the price is going, not an average of where it has been.[1]

Worked example: same midpoint, two different fair values
Book A=0.49×200+0.51×800800+200=98+4081000=0.506    50.6¢\text{Book A} = \frac{0.49 \times 200 + 0.51 \times 800}{800 + 200} = \frac{98 + 408}{1000} = 0.506 \;\Rightarrow\; 50.6\text{¢}
Book B=0.49×800+0.51×200200+800=392+1021000=0.494    49.4¢\text{Book B} = \frac{0.49 \times 800 + 0.51 \times 200}{200 + 800} = \frac{392 + 102}{1000} = 0.494 \;\Rightarrow\; 49.4\text{¢}
A 1.2¢ gap the midpoint cannot see. And 1.2 probability points is larger than most edges anyone claims to find. Equal depth on both sides collapses the formula back to the midpoint exactly, which is the right behaviour: with no imbalance there is no information to add.

Two edges to handle explicitly rather than quietly. If one side is empty, QQ is zero and the weighted average degenerates onto that empty side’s own price: set Qbid=0Q_{\text{bid}} = 0 and the expression collapses to the bid, which is the limit of “lean toward the thinner side” taken to its extreme.

It is moot anyway: a side with no resting orders has no price to substitute in. Either way a one-sided book is not a market, and the shipped code returns no quote rather than a confident number. Separately, a contract locked at 1¢ or 99¢ has nowhere left to tick, so the microprice there is a floor artefact, not a probability.

Depth: the screen price is a price for a size

Top of book is a quote for the contracts sitting at top of book. Order more than that and you walk up the stack:

Buying 500 when only 200 are offered at 51¢
200 @ 51¢=$102.00,300 @ 53¢=$159.00    $261.00200 \text{ @ } 51\text{¢} = \$102.00, \qquad 300 \text{ @ } 53\text{¢} = \$159.00 \;\Rightarrow\; \$261.00
average fill=$261.00500=52.2¢\text{average fill} = \frac{\$261.00}{500} = 52.2\text{¢}
fees: 0.07×200×0.51×0.49+0.07×300×0.53×0.47=$3.50+$5.24=$8.74\text{fees: } \lceil 0.07 \times 200 \times 0.51 \times 0.49 \rceil + \lceil 0.07 \times 300 \times 0.53 \times 0.47 \rceil = \$3.50 + \$5.24 = \$8.74
all-in=$269.74500=53.95¢ per contract\text{all-in} = \frac{\$269.74}{500} = 53.95\text{¢ per contract}
The screen said 51¢. Your size paid 53.95¢. That is almost three probability points of slippage, none of it visible in the quote. An edge smaller than the slippage on your own order size is just a rounding error with a plan.

This is why the exchange lane stores (bid,ask,depth)(\text{bid}, \text{ask}, \text{depth}) per side rather than a single price. A feed that records only a midpoint has thrown away the ability to answer “at what size?” forever.

Two timestamps, always

A price without a clock is decoration. Every number on the board carries both:

  • When we computed it: the observation timestamp.
  • When the venue last moved it: the venue-update timestamp.

The gap between those two is the whole story. A tight spread on a market nobody has touched in three hours is not a tight market. It is an abandoned one. The sharpest version we have seen live: a postponed game whose contract stayed open and quietly re-tickered, leaving unrefreshed resting orders that manufactured a phantom 4.7% “arbitrage” on our own board. Stale data does not announce itself. It renders exactly like fresh data.

The failure nobody sees: a silently wrong book

Streaming an order book means holding state and applying deltas, and a dropped message leaves a book that is plausible and wrong, the worst possible outcome for a site whose entire promise is “check our math.” The exchange lane is built around that specific fear:

  • Sequence numbers on every delta. A gap in the sequence is a detected fault, not a shrug.
  • Resnapshot on gap. Detect a gap, throw the local book away, refetch the full snapshot, resume.
  • Periodic reconciliation regardless of gaps, because the failure you are guarding against is the one your gap detector missed.
  • Reconnect with exponential backoff, and no quiet fallback to a last-known price that is quietly hours old.

None of that is clever. It is just the difference between a number you can check and a number that happens to look right.

Quality gates, and the refusal

Before a venue’s price is allowed into a pooled fair value it has to clear gates:

  • Spread ceiling. Past some width, the microprice is an estimate of an estimate. Drop it.
  • Depth floor. A 1¢ market with 4 contracts on each side is a coincidence, not a price.
  • Outlier winsorisation. A venue sitting 15¢ away from everyone else is almost always a data error (a stale ticker, a re-mapped event), not a brilliant dissent.
  • Fewer than two qualifying venues → no consensus is published. Not a low-confidence number. No number.

That last one is the same principle as printing the honest $0 when the inputs contain no edge. A confident-looking consensus built on one thin book is a lie with a decimal point in it, and refusing to print it is the only version of this that is honest.

A price is still not an oracle

Even a clean, deep, freshly-updated microprice needs one correction before it is treated as a probability. Exchange prices carry the favorite–longshot bias: a 2026 study of 300,000+ settled Kalshi contracts found prices informative and sharpening toward close, while low-priced contracts won less often than the fee-adjusted break-even required.[2] The correction is the same power transform used to de-vig a sportsbook line, with the exponent fitted against settled markets rather than assumed:

pcal    Pk,k fitted on settled contractsp_{\text{cal}} \;\propto\; P^{\,k}, \qquad k \ \text{fitted on settled contracts}

Then prices from several venues are pooled in log-odds, the way any set of probability estimates should be combined:[3]

zˉ=iwiziiwi,zi=ln ⁣pi1pi    p=ezˉ1+ezˉ\bar{z} = \frac{\sum_i w_i z_i}{\sum_i w_i}, \quad z_i = \ln\!\frac{p_i}{1 - p_i} \;\Rightarrow\; p = \frac{e^{\bar z}}{1 + e^{\bar z}}

The starting weights are a heuristic anyone can reproduce. Tighter spreads, deeper books and fresher quotes count for more:

wi=1si2×ln(1+depthi)×eΔti/τw_i = \frac{1}{s_i^{2}} \times \ln(1 + \text{depth}_i) \times e^{-\Delta t_i / \tau}

One rule underneath all of it: sharpness is a property of a market at a moment, not of a venue. No name on this site is hardcoded as trustworthy.

What we publish, and what we keep

The method above is open on purpose. It is the same technique described in how a sharp-consensus fair line is built, and you can run every step by hand. What the board publishes is result-level: the fair probability, its confidence, the agreement between venues, and the number of venues that qualified.

What stays private is narrow and specific: the fitted per-venue weights learned from settled outcomes, and the measured correlation structure between venues. Those are learned from every market that resolves, and they are the one thing here that cannot be forked off a package index. The technique is free. The ledger is the work.

The correlation point is not a detail, incidentally: two venues that arbitrageurs keep within a cent of each other are not two independent opinions, and pooling them as if they were manufactures false confidence. That arithmetic gets its own page.

Open the free prediction market odds converter →Contract price to American, decimal, fractional and implied probability, plus the fee-adjusted break-even.

Sources

  1. Stoikov, S. (2018). “The Micro-Price: A High-Frequency Estimator of Future Prices.” Quantitative Finance 18(12), 1959–1966. – the depth-weighted estimator and why it beats the midpoint.
  2. Burgi, C., Deng, W. & Whelan, K. (2026). “Makers and Takers: The Economics of the Kalshi Prediction Market.” GWU Working Paper 2026-001. PDF. – 300k+ settled contracts: informative prices, favorite–longshot bias after fees.
  3. Genest, C. & Zidek, J. V. (1986). “Combining Probability Distributions: A Critique and an Annotated Bibliography.” Statistical Science 1(1), 114–135. – the logarithmic opinion pool.
  4. Kalshi. “Fee Schedule” (July 2026 revision). – the taker fee used in the depth example.

Every formula here lives on the Formula Sheet for quick reference.

Check your understanding

Frequently asked questions

How does Kalshi price a contract?

It does not. Kalshi publishes an order book (the best bid, the best ask, and the contracts resting at each price), and the price is whatever two traders agree on. The exchange never takes a position; it matches a YES against a NO and charges a fee.

What is the microprice?

The microprice is a depth-weighted fair value: (bid × Q_ask + ask × Q_bid) / (Q_bid + Q_ask), where Q_bid and Q_ask are the contracts resting at the best bid and best ask. Each side is weighted by the size on the opposite side, so the estimate leans toward whichever side is thinner.

Why not just use the midpoint of the bid and the ask?

Because the midpoint throws away the size. A book of 49¢ × 800 against 51¢ × 200 and a book of 49¢ × 200 against 51¢ × 800 share a 50¢ midpoint, but the microprice reads 50.6¢ and 49.4¢. Queue imbalance is information, and the midpoint discards all of it.

Does the top-of-book price apply to any size?

No. A quote is a price for the contracts resting at that level. Buying 500 when only 200 sit at 51¢ and 300 more at 53¢ fills at an average of 52.2¢, and about 53.95¢ per contract once the taker fee is added: nearly three cents worse than the screen price.

What happens when the order book data is not trustworthy?

The design is to refuse rather than print a confident number: drop venues whose spread is too wide or depth too thin, treat far outliers as data errors, and publish no consensus below two qualifying venues. Today the published board applies the venue and freshness filters but does not yet enforce the depth floor or the two-venue refusal: the methodology page lists exactly what runs.

Is the price on your screen fair? The free board puts each Kalshi price beside a de-vigged consensus of the sportsbook lines, every step of the arithmetic shown, both timestamps on every number. See today’s board. No account, no card; the free tier runs two hours behind.