Market Making on Polymarket: Spread Strategy for CLOB Markets
Building a profitable market-making bot on Polymarket requires balancing inventory risk against the bid-ask spread on binary outcomes. This post details quote sizing, skew logic, and how to hedge directional exposure using correlated prediction markets.
Market making on Polymarket is a different problem from making markets on a perp exchange or a spot DEX. Prices are probabilities bounded between 0 and 1, positions settle at binary values at resolution, and the CLOB is thin enough that a naive quoting strategy leaks badly to adverse selection. Get the mechanics right, though, and the spread-over-time returns are genuinely attractive — especially on high-activity markets where the book turns over many times per day.
How Polymarket's CLOB Actually Works
Every Polymarket market issues two ERC-1155 tokens — YES and NO — on Polygon. The CLOB matches orders off-chain through Polymarket's operator layer and settles net balances on-chain. Maker orders rest in the book; taker orders fill against them. The key structural fact for a market maker: maker rebates are roughly +0.05% of notional filled, while taker fees are −0.07%. That 12-basis-point spread between maker and taker is your baseline edge if you post passively and get filled without adverse information.
The order book is denominated in USDC cents: a YES price of 0.63 means $0.63 per YES token, implying a 63% probability. Your bot interacts via the CLOB REST API, placing orders with side, price, size, and token_id. Cancels are synchronous; use them aggressively.
Quote Sizing for Binary Outcomes
The sizing question is harder than on a continuous asset because your downside is always bounded — a YES token cannot trade below $0 or above $1 — but so is the carry value. Position sizing should be a function of the distance to the extremes, not a flat notional.
A practical formula for max order size S on each side:
S_yes = base_size × min(mid, 1 - mid) / 0.5
At mid = 0.50, this equals base_size. At mid = 0.10, you size down to 0.20 × base_size — reflecting that a YES fill at 10 cents carries more adverse-selection risk (someone thinks the event is actually likely) than a fill at 50 cents. Set base_size to no more than 1–2% of your total allocated capital per market.
Half-spread selection depends on market activity. For liquid markets averaging 50,000+ USDC daily volume, a 1.0–1.5 cent half-spread (100–150 bps on a near-50 market) earns the rebate while staying inside the top-of-book. For illiquid markets, push to 2–3 cents; adverse-selection costs dominate when fills are rare and informative.
Inventory Skew Logic
After a series of YES fills, you carry directional exposure. The position will resolve at $1 (if YES wins) or $0 (if NO wins) — there is no mean-reversion guarantee. Skewing the mid to shed inventory is not optional; it is the core risk control.
Define net inventory in signed USDC notional:
net = yes_pos_usdc - no_pos_usdc
Apply a linear skew to the quoted mid:
skewed_mid = raw_mid - k × (net / max_net)
With k = 0.015 and max_net = 300 USDC, a fully long YES inventory of $300 shifts your quoted mid down by 1.5 cents. Your YES bid moves lower (making you a less attractive buyer) and your YES ask moves lower (making you cheaper to sell into). This is the same inventory-management logic described in the Polymarket market-making bot tutorial, but the constant k needs to be calibrated per market based on observed adverse-selection rate.
Hard stops matter. When net inventory on either side exceeds max_net, cancel all resting orders on that side immediately and stop quoting it. You are now a holder, not a market maker, and you need a separate liquidation strategy — either a marketable order at a controlled slippage cap or a passive unwind over multiple minutes.
Hedging Directional Exposure with Correlated Markets
The most powerful lever for a Polymarket market maker that other venues do not offer is cross-market hedging. Many markets are structurally correlated: a YES fill on "Fed cuts rates in September" is partially hedged by a NO fill on "Fed holds in September," for instance, if both markets cover the same underlying event.
The relationship to exploit is the complementary outcome hedge: YES and NO on the same event must jointly resolve to $1. If you carry 200 USDC of YES inventory on Market A, you can offset a portion of that binary risk by building NO inventory on Market A through the other side — effectively delta-flattening within the market. This only works if your fill prices net favorably after fees, but on a market you are actively quoting both sides of, you often find yourself naturally balanced.
For non-complementary correlation — two separate markets with shared resolution drivers — cross-market correlation analysis gives you the cointegration coefficients needed to size the hedge. A 0.80 correlation between two political outcome markets means $100 of unhedged YES on Market A can be partially offset by approximately $80 of the inverse position on Market B. This is imprecise, but it converts a binary risk into a basis risk, which is far easier to manage under inventory limits. The Polymarket arbitrage bot service we build for clients handles this cross-market netting automatically.
Resolution Risk and the Flatten Gate
The single largest mistake new market makers make on Polymarket is holding inventory into resolution. A YES token at 0.60 mid is worth $0 if the event resolves NO — that is a 60-cent loss per token on a position you were collecting 1-2 cents of spread on. The math does not work.
Implement a flatten gate tied to time-to-resolution:
- T − 24 hours: Widen half-spread to 2× normal. Still quote both sides but reduce exposure.
- T − 4 hours: Cancel all resting orders. No new quotes. Begin liquidating open inventory at any available bid/ask.
- T − 30 minutes: Hard exit. Accept taker fees if needed to flatten. The cost is known; the resolution risk is unbounded relative to your spread P&L.
Time-to-resolution is available from Polymarket's API via the end_date_iso field on each market. Build this as a background check that fires every 60 seconds, not something triggered manually. Operators who run these systems in production enforce the flatten gate at the order-submission layer so an operator distraction cannot accidentally leave inventory live into resolution.
Monitoring What Matters
Three metrics determine whether your strategy is working in production:
- Realized spread per fill (should exceed maker rebate + operational costs). If fills consistently happen at adverse prices, your mid estimate is stale or you are quoting too tight.
- Inventory turnover (how quickly net inventory mean-reverts to zero). Slow turnover means your skew is too weak or fills are one-sided.
- Flatten P&L vs. spread P&L (cost of unwinding inventory before resolution vs. spread earned). If flattening costs exceed spread earned, you are holding too long or sizing too large per fill.
Log every order, fill, and cancel with microsecond timestamps. The signal for tuning is in the distribution of fill-to-cancel ratios by market liquidity tier — liquid markets should show symmetric fill rates; illiquid markets will fill one-sidedly and need tighter position limits to compensate.
If you want a production-grade Polymarket market-making system — inventory controls, cross-market hedging, and resolution-aware flatten logic built in — reach out via the contact page and we will scope the build.
Need a bot like this built?
We design, build and run trading bots on Solana, Hyperliquid and Polymarket.
Start a projectMore from the blog
Public vs Paid RPC: How to Run a Fair Benchmark
A fair comparison of public and paid RPC endpoints must account for quotas, workload, freshness and support guarantees.
Read articleRPC Benchmark Percentiles Explained: p50, p95 and p99
Why averages hide the latency spikes that break trading bots, wallets and production blockchain applications.
Read articleHyperliquid REST vs WebSocket Benchmark: What to Measure
A benchmark plan for Hyperliquid market data that separates request latency from streaming freshness and recovery.
Read article