πΊπΈ English
Dec 22, 2025
If you can code and you trade Polymarket, you've likely had this exact thought:
"In a multi-outcome market (like the US Election), one candidate must win. If I sum up the prices of all the candidates and they only add up to $0.98, that is free money. I just need to buy every outcome and wait for the $1 payout."
That instinct is right in spirit: this is the classic NegRisk (Negative Risk) arbitrage.
But it fails in practice more often than it succeeds.
The first thing you learn when you try to automate is that Polymarket is not a continuous probability calculator. It is a trading venue with hard constraints.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THEORETICAL "PAPER" IDEAS β
β (Sum(Prices) < $1.00 looks like free money) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FILTER 1: AUTO-ARB MECHANICS β
β (Simple YES/NO arb is instantly crushed by the engine) β
β Only Multi-Outcome NegRisk passes this layer. β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FILTER 2: THE TICK GRID β
β (Quantizing to valid ticks rounds prices β
β AGAINST you) β
β Many thin margins disappear here. β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β FILTER 3: MINIMUM SIZES β
β ("Dust" legs force you to buy larger β
β sizes, hitting deeper into the book) β
βββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββ
β FILTER 4: EXECUTION RISK β
β (FOK fails often. GTC gets β
β legged and requires UNWIND) β
ββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββ
β EXECUTABLE β
β ARB β
ββββββββββββββββ
The idea is simple: "Sum(prices) < $1.00 looks like free money"
But the real world forces this path through multiple filters, each one killing potential profits.
Polymarket is not an AMM like Uniswap. It operates as a Hybrid Central Limit Order Book (CLOB).
For a bot builder, that implies three things:
There are bids, asks, and discrete price levels for every single outcome.
In a market with 10 outcomes, liquidity is split across 10 distinct order books (one per outcome).
YES/NO for a single outcome is mirrored in one unified book (buying YES is functionally selling NO), but liquidity does not automatically flow between Outcome A and Outcome B.
The probability math doesn't matter until you can reliably navigate the venue's rules.
Before building a NegRisk bot, you must understand why the simpler version (single outcome YES vs NO) is usually a trap.
You might think:
"I'll find a market where YES is 0.40 and NO is 0.58, buy both instantly, and profit 0.02."
This rarely exists because the system kills it automatically.
Polymarket's matching engine and settlement system are designed to auto-arb this case. If you place a YES buy that crosses the implied NO, the system can effectively "mint" new complete sets to fill you.
Atomic arb is dead.
The exchange (and sophisticated market makers) enforces the anchor YES + NO = $1 extremely quickly. You almost never find a static "free gap" sitting on the book.
Legging is trading, not arb. You can buy YES at 0.40, then wait and buy NO later at 0.50. But that's not arbitrageβit's directional scalping. You're exposed while you wait.
The real atomic opportunity lives where the system can't easily auto-arb:
Multi-outcome NegRisk (e.g., buying A, B, C, D, E because they sum to $0.95).
The #1 reason "profitable" NegRisk bots lose money: they assume prices exist on a continuum.
They do not.
Prices live on a tick grid, exposed as tick_size.
If the tick size is 0.01, and your model sees an edge at 0.053, the exchange effectively says:
"That price does not exist."
NegRisk means you're buying N different legs (N outcomes).
Cumulative error: you must quantize every single leg to a valid tick (often rounding up to the ask).
Impact: if you have 10 candidates and lose even half a tick each, a 2% theoretical edge can become a 5% realized loss.
Rule: Quantize all N legs before deciding whether
Sum(prices) < 1.
This is the constraint that surprises most first-time buildersβespecially in NegRisk strategies with long shots.
The exchange enforces minimum order sizes, exposed as min_order_size.
Even if it looks like a simple "dust filter," it creates major friction for low-probability outcomes.
Dollar floor: $1 minimum notional.
Share floor: 5 shares minimum, regardless of price.
You can't just "buy $1 of everything."
If the cheapest leg forces 100 shares (cost $1), you're also forced to buy 100 shares of the favorite (cost $99).
So your minimum viable trade size is dictated by the cheapest leg.
On thin books, that minimum size can wipe available liquidity on the dust candidate, destroying the edge before you even begin.
Once you've found a valid price and size, your next decision is crucial:
How do you submit the orders?
Your spreadsheet assumes you "buy." The exchange forces you to choose between aggressive atomicity and passive liquidity.
"Execute the entire size at this price (or better), or do nothing."
| Pros | Cons | |------|------| | Guarantees your math holds | High failure rate | | You never get half a hedge | If liquidity shifts by one share while you're in flight, the entire trade fails |
"Post this order. Fill what you can now, keep the rest open."
| Pros | Cons | |------|------| | Captures whatever liquidity exists | Legging risk | | Better fill rates on larger sizes | Non-atomic execution |
If you choose GTC (often necessary for larger sizes), you face the bot builder's nightmare:
Non-atomic execution.
To lock NegRisk arb, you must buy all N outcomes.
If you buy N-1 and the Nth moves before filling, you're no longer hedgedβyou're naked long the market.
Because you can't execute all legs as one atomic on-chain transaction (you're on an off-chain CLOB), eventually a leg will fail.
So your bot must include an unwind strategy (rollback):
If
legs_filled < total_legsafter a short timeout (e.g., 500ms), immediately unwind filled legs by selling back to the bid.
You'll lose the spread on each unwound leg.
If you're lucky, you scratch (near break-even). Usually it's a small controlled loss.
That loss is the "insurance premium" you pay to avoid catastrophic directional exposure.
By now, the distinction should be clear: Probability math is the easy part; microstructure is the hard part.
The most common mistake new bot builders make is treating Polymarket like a spreadsheet. In reality, you are fighting a friction war.
Your bot's primary job is not to find edge, but to validate execution.
Before committing capital, it must prove the profit survives the friction:
If the math still holds after that stress test, you trade. If not, you pass.
Everything else builds on this foundation.
Part 2: Selection is Performance Engineering covers Market Selection: how to efficiently filter thousands of markets to find NegRisk candidates that are actually liquid enough to tradeβincluding the Scanner vs Executor architecture and the 4-Gate filtering framework.
After that:
This article is Part 1 of the ZEIT Finance series on building Polymarket trading bots. ZEIT Finance turns prediction markets into perpetual assets.