Strategy · Low risk · Intermediate
Spread farming
Passive market making on prediction markets. Post limit orders on both sides of the book and earn the bid-ask spread.
Published Apr 10, 2026
The idea
Every trade has a maker and a taker. Takers pay the spread; makers earn it. Over many trades, if you can keep inventory balanced, you harvest the spread as profit — even with zero directional view.
Polymarket’s CLOB doesn’t pay maker rebates, but the spread itself is 2–5 cents on most markets — far wider than equity spreads. That’s the edge.
How polybot implements it
spread_farm posts two-sided limit orders on a universe of markets. The core loop:
- Subscribe to the top-of-book for each target market.
- Compute a fair-value estimate (last trade, volume-weighted, or from an AI plugin).
- Post bid at
fair - half_spread, ask atfair + half_spread. - On fill, re-quote immediately with updated inventory.
- Every
refresh_seconds, reprice to stay current even without fills.
Inventory is the key risk. polybot tracks net delta per market and skews quotes to encourage unwinding: if you’re long 100 shares of YES, bid lower and ask more aggressively.
# from src/polybot/strategies/spread_farm.py — simplified
fair = fair_value_estimator(market)
inventory_skew = -self.alpha * self.inventory[market.id] / self.max_inventory
half = self.config.half_spread + inventory_skew
self.quote(market.id, bid=fair - half, ask=fair + half, size=self.config.quote_size)
Where this works
- High-volume, mid-lived markets. Markets that trade for days or weeks, with at least a few dozen daily fills.
- Tight books. Where the existing spread is narrow, you’ll compete on price; you need to be willing to quote the inside or skip the market.
- Capital-rich operators. Spread farming wants a lot of markets, small size each — the edge is volume × spread, and volume needs breadth.
Where it fails
- Toxic flow. A whale with private information runs through your quotes; you pick up the wrong side. Mitigation: quote-pull on sudden volume spikes; polybot’s
toxicity_monitordisables markets with adverse-selection metrics above threshold. - One-sided markets. Near resolution, all trades go one way. Your YES asks get lifted; NO asks don’t. Inventory skew should un-balance but may not be enough — polybot’s late-market shutdown disables quoting in the last
Thours. - Gas costs on cancels. Polymarket is on-chain. Every re-quote costs gas. polybot batches re-quotes and prefers modify-in-place where the venue supports it.
Configuration
polybot strategy enable spread_farm
polybot strategy config spread_farm \
--half-spread 0.02 \
--quote-size 50 \
--max-inventory 300 \
--refresh-seconds 30 \
--cutoff-hours-before-resolution 6 \
--markets-include "crypto,politics"
Risk profile
| Dimension | Assessment |
|---|---|
| Directional exposure | Low when balanced; high if inventory runs |
| Execution risk | Low |
| Capital efficiency | Low (capital parked in quotes) |
| Monitoring burden | Medium — you need toxicity alerts |
FAQ
Do I need an AI model for this? No, but it helps. A better fair-value estimate (e.g. Perplexity checking for just-breaking news) means your spread gets lifted less often by informed flow.
How much capital is this worth on? Scales sublinearly. $5k → $50k is roughly 5× revenue; $50k → $500k is maybe 2×, because you start running out of markets with room to quote inside the book.
Does polybot compete with itself if I run spread_farm and ai_model? Yes, if they target the same market. Use --markets-exclude to partition, or run them in different categories.
Source: src/polybot/strategies/spread_farm.py.
Want this strategy tuned for your book?
Cryptuon can adapt polybot strategies to your capital, risk budget, and markets. Shadow-deployed before you go live.