Kalshi is the first regulated exchange where you can buy and sell contracts on the outcome of events. Kalshi, and prediction markets, have a unique market structure that is worth taking a look at if you plan on trading.
I plan to write more about trading Prediction markets algorithmically moving forward, if you’d like to stay up to date, consider subscribing.
Tickers
At Kalshi, you trade “event contracts”. These contracts are specified via ticker names that rely on a hierarchy like
Series
Event(s)
Market(s)
For example, if we look at `PRES2024-KH` we can break it down into:
Series: `PRES`
Event: `2024`
Market: `KH`
Abstractly, this follows the pattern {Series}{Event}-{Market}
. Recently, Kalshi introduced its own clearinghouse, Klear, which prefixes all tickers with KX
. Example: `KXRTWICKED-85`.
These tickers can always be found via the web UI here:
Or via the API under GetMarkets.
Prices
Prices on Kalshi fall between 0 and 100 U.S. cents with a minimum tick size of 1 cent (no subdivisions). Each price represents the market’s collective view on the likelihood of an event’s outcome.
In the above example the “forecast” is that the Rotten Tomatoes score for Wicked will be ~87.6% but in the individual markets:
Above 80: 74% chance
Above 85: 53% chance
Above 90: 47% chance
But you’ll notice that the % chance differs from the current “Yes” bid. This is because the % chance is determined by the last trade price. This can be obtained from the API endpoint GetTrades.
Yes or No
In prediction markets, you buy “Yes” or “No” contracts. When looking at the screenshot above, we see only the “best bid” for each. It might seem weird, but the “best ask” for the “Yes” or “No” contracts are synthetic. This will be important when we start building our orderbook model.
To calculate the best ask for “Yes” contracts
To calculate the best ask for “No” contracts.
For example, from the above Wicked market screenshot for “Above 80” we assume the following
Which created implied asks of
And thus the spreads for “Yes” and “No”
Which is a fair 7 cent spread in each market.
It’s worth noting that no endpoints from the API will return the asks for a market, only the bids for “Yes” and “No”. This means any client-side logic will need to calculate the asks. An example JSON message from the Kalshi “orderbook_delta” endpoint showcases this:
Buying, or Selling
As explained above, there are “Yes” and “No” markets. A key point of holding a contract is understanding that:
In practice this means we can easily offset positions by purchasing the opposite side of the trade.
The Kalshi help page explains this concept fairly well.
Payouts
In short, the holders of the “wrong” side of the trade pay the “correct” side of the trade once a market settles. Your positions come to a close in two situations:
By holding the position until settlement
By selling your position early
So in our Wicked example, let’s say the “Above 80” market settles to “Yes”. This means “No” contract expire worthless and the value of them are used to pay holders of “Yes” contracts to resolve them to 100 cents per contract.
Right now, Kalshi only supports “winner takes all” payouts, but they have plans for scalar markets (scalar markets have payouts between 0 and 100 cents based on outcomes).
There is a special case to consider when looking at mutually exclusive markets that have collateral return.
Next Steps
Collecting data on prediction markets via API, starting with Kalshi, in an upcoming post.