Managing Inventory Risk When Market-Making Event Contracts
When you quote both sides of an event contract, you are not betting on the outcome. You are renting out liquidity and collecting the spread. The problem is that the spread is small and the inventory you pick up along the way is not. On a binary contract the tail is brutal: hold the wrong side into resolution and the position does not drift, it goes to zero.
This post is about the middle of that trade. How inventory builds up when your quotes get hit, why it becomes especially dangerous as the market approaches settlement, and how to skew your quotes so your position mean-reverts toward flat instead of wandering off.
Why inventory accumulates at all
A market maker posts a bid and an ask, earns the spread when both get filled, and in the process accumulates inventory that is usually unwanted, then has to manage the risk that price moves against that position before it can be unwound. That is the whole job description, and it is the same on Kalshi as it is in equities.
On a prediction market the mechanics are concrete. Kalshi runs a quote-driven order book where makers post offers and takers accept them, and every contract has two sides: someone can buy Yes and someone can buy No. Prices sit between one cent and 99 cents, and a contract settles at one dollar if the event happens and zero if it does not. So a Yes contract at 40 cents is a claim the market prices at roughly 40 percent.
The reason inventory piles up is adverse selection. If you quote a symmetric spread around the mid, your bid gets hit when the market is falling and your ask gets lifted when it is rising. You systematically end up long into weakness and short into strength. Under symmetric quoting, inventory follows a random walk and can drift arbitrarily far from zero, exposing you to unbounded risk. The fills you want most are the ones you do not get.
Why it gets dangerous near resolution
Two things happen as an event contract approaches its close, and they compound.
- The payoff is binary. A stock you are stuck long in can be worked out of over days. A Yes contract that resolves against you pays zero, full stop. There is no marking-to-something, there is only 0 or 1.
- Liquidity thins exactly when you need it. One-sided flow is the killer: when news breaks and everyone wants Yes, you can find yourself accumulating No with no one to sell it to. The book you were relying on to unwind evaporates in the same move that made you want to unwind.
Empirically, prices on these markets become more accurate as they approach closing, and they show a favorite-longshot bias, with low-priced contracts winning less often than their price implies and high-priced contracts winning slightly more. For a maker that means the cheap-tail contract you are quietly long is more likely to expire worthless than its price implied. Residual inventory near resolution is not a rounding error. It is the position most likely to define your day.
The fix: skew quotes around a reservation price
The standard answer is not a fixed spread around the mid. It is a spread around a private fair value that drifts away from your inventory. This is the Avellaneda-Stoikov framework, published in Quantitative Finance in 2008, which treats quoting as a stochastic-control problem and produces closed-form expressions for the optimal bid and ask as functions of price, inventory, volatility, and time to close.
Two outputs matter. The reservation price is your inventory-adjusted fair value: when you are long it sits below the mid, when you are short it sits above. You then post your bid and ask around that reservation price rather than the mid. The effect is that when inventory is positive the skew makes ask fills more likely than bid fills, pushing inventory back toward zero, and the reverse when you are short. Asymmetric quoting turns the random walk into mean reversion.
The reservation price skews away from inventory by an amount that scales with your risk aversion, the variance of the price, and the time remaining. In the version adapted for prediction markets, the model is written in logit units and the inventory adjustment is proportional to inventory times a risk-aversion term times belief variance times time-to-horizon. The practical consequence is the important part: as time-to-close shrinks, the inventory penalty shrinks too, so the model pulls your reservation price back toward the mid and stops you defending a position you can no longer unwind. It quotes you out of inventory before resolution rather than into it.
A minimal version of the reservation-price and spread logic looks like this:
# inventory-aware quoting, one contract
# mid in probability terms (0..1), q = signed inventory in contracts
# gamma = risk aversion, var = short-horizon price variance, tau = time to close
reservation = mid - q * gamma * var * tau # skews below mid when long
half_spread = 0.5 * gamma * var * tau + base_edge
bid = reservation - half_spread
ask = reservation + half_spread
# as tau -> 0 the inventory term vanishes: quotes collapse back toward mid,
# so you stop accumulating and lean on getting flat before settlementSkew is your primary lever, but it is not the only one. Widen the spread when volatility rises, because the model widens the gap between reservation and mid as volatility increases. Cancel stale quotes fast when the book moves, since the maker with faster cancels avoids getting run over on one-sided news. And cap inventory with a hard position limit so a single bad regime cannot blow past your skew, which only nudges, it does not force.
Where automation fits
None of this is discretionary. Recomputing a reservation price on every book update, re-quoting, cancelling stale orders, and enforcing a hard flat-by-resolution rule is a loop that has to run continuously and identically every time. That is exactly the kind of thing you want to write once, test, and let run.
This is the shape of a Banger strategy. You express the quoting logic as a banger.Strategy in Python, paper-trade it against the live order book with banger run strategy.py --paper to see how your skew actually behaves against real one-sided flow, and wrap it in a declarative risk envelope: a per-trade cap, a daily loss stop, a max-open-positions limit, and a kill switch. Banger never custodies funds; you bring your own venue keys. The point is not that automation makes market-making safe. It is that inventory risk is a control problem, and you cannot control a loop by hand.
The takeaway
Quoting both sides does not make you neutral. Adverse selection makes you long into weakness and short into strength, and on a binary contract that inventory resolves to zero or one. Skewing quotes around an inventory-adjusted reservation price gives your position a pull back toward flat, and letting the time term decay that skew near close is what keeps you from defending a position you can no longer exit. Settlement pays 0 or 1, and the inventory you are holding when it does is the only number that matters.
Sources
- High-frequency trading in a limit order book (Avellaneda & Stoikov, 2008) — Semantic Scholar
- High-frequency trading in a limit order book — Quantitative Finance (Taylor & Francis)
- Optimal Market Making (Avellaneda-Stoikov) | Udit Samani
- Avellaneda-Stoikov and Cartea-Jaimungal as One Framework
- Toward Black Scholes for Prediction Markets: A Unified Kernel and Market Maker's Handbook
- Guide to the Avellaneda & Stoikov Strategy - Hummingbot
- Kalshi | Prediction Market Exchange, History, & Regulation | Britannica Money
- Who are you trading with? | Kalshi Help Center
- Makers or Takers: The Economics of the Kalshi Prediction Market
- Explaining the Favorite-Longshot Bias: Is it Risk-Love or Misperceptions? — NBER
- Kalshi Event Contracts Explained