Sports market making

$5M/month in liquidity rewards.
Almost nobody is collecting.

Polymarket pays market makers to quote both sides of sports markets. You don't need to pick winners — you need tight quotes, two-sided depth, and uptime.

pip install sfmmGitHub →
Today's marketsReward pools
EPLLiverpool vs Arsenal
0.55$10,000
NBAThunder vs Celtics
0.42$7,700
UCLBarcelona vs PSG
0.48$24,000
CS2NaVi vs FaZe
0.53$5,500
IPLMI vs CSK
0.51$4,500

Total daily: $51,700 across 5 games. 20% share = $10,340.

The math

Quadratic scoring: 2x tighter = 4x the score

Every minute, Polymarket samples your resting orders.
Score = ((max_spread - distance) / max_spread)²

S(v, s) = ((v - s) / v)²

v = 3 cents (max qualifying spread)
s = your distance from midpoint

At s=1 cent: score = 0.444 per contract
At s=2 cents: score = 0.111 per contract
                       ↑ 4x worse

Score by distance (v = 3 cents)

0 cents (at mid)
1.000
0.5 cents
0.694
1 cent
0.444
1.5 cents
0.250
2 cents
0.111
3 cents (at max)
0.000

Two-sided quoting (bid + ask) scores 3x vs single-sided.

Two modes

Pre-game and live are different systems

PRE-GAME28% of pool
$ sfmm run --mode pre

PRE Liverpool vs Arsenal (3 markets)

  Match Result YES: bid 0.54×100 ask 0.56×100
  Over 2.5 Goals:   bid 0.61×100 ask 0.63×100
  Both Teams Score: bid 0.58×100 ask 0.60×100

  Score: 44.4/min | Est. reward: $560/game
  Polling: 5s | Status: quoting
  • Prices move slowly (hours between events)
  • Poll every 5 seconds
  • Low adverse selection risk
  • Risk window: lineup announcement (~5 min)
LIVE72% of pool
LIVE Liverpool vs Arsenal — 67'

  Match Result: bid 0.71×100 ask 0.73×100
  Score: 44.4/min | Est. reward: $1,440

  ⚠ GOAL 72' — Liverpool 2-1
  CIRCUIT BREAK — quotes pulled
  ... cooldown 10s ...
  ✓ Requoted at new mid 0.78
  • Poll every 1 second
  • Circuit breaker on midpoint jumps
  • 2.5-3x more reward than pre-game
  • Adverse selection: ~$50/game (vs $1,440 reward)

Sports Desk

Reward pools • April 2026
LeaguePer GamePreLive
Champions League QFs$24,000$6,750$17,250
English Premier League$10,000$2,800$7,200
NBA$7,700$2,150$5,550
CS2 A-tier$5,500$1,550$3,950
IPL Cricket$4,500$1,250$3,250
La Liga / Serie A$3,300$900$2,400
MLB$1,650$465$1,185
NHL$1,500$400$1,100

Best for live MM

Soccer — 96% safe time. 2.5 goals/game. Long periods of stable quoting between rare high-impact events.

Underrated

CS2 esports — discrete rounds, stable between rounds, $5,500/match pools. Digital-native traders underserved.

Hardest

Basketball — 200 scoring events per game. Constant small price moves. Profitable but operationally demanding.

Revenue estimate (20% share, soccer only)

EPL:  10 games/wk × $2,000 = $20,000
UCL:   2 games/wk × $4,800 = $ 9,600
LaLiga: 10 games/wk × $660 = $ 6,600
SerieA: 10 games/wk × $660 = $ 6,600
──────────────────────────────────────
Monthly estimate:         ~$171,200
Capital required:       $3,000-5,000

Adverse selection math (EPL)

Per game:
  Goals: 2.5 avg
  Impact per goal: ~20¢
  Exposure: 100 contracts
  Cost per goal: $20
  Total cost: $50/game

Reward (20% share): $2,000/game
Net profit: $1,950/game
Adverse selection = 2.5% of revenue

Data from Polymarket liquidity rewards docs. Revenue estimates assume 20% market share.

How the bot quotes

Prices for score. Sizes for view.

$ sfmm run --dry-run

DRY RUN — no orders will be placed

Discovering sports events...
Found 376 games. Starting engines...

  PRE 2026 FIFA World Cup Winner (58 markets)
  PRE 2026 NBA Champion (20 markets)
  PRE UEFA Champions League Winner (30 markets)

  Will Spain win the 2026 FIFA W:
    mid=0.157  fair=0.157
    bid 0.15×100  ask 0.17×100  (symmetric — no view)
    score: 44.4 per side

  Will the Oklahoma City Thunder:
    mid=0.375  fair=0.375
    bid 0.36×100  ask 0.39×100
    score: 44.4 per side

  Quoting 5 events, 166 markets total
  Est. reward: $342/hour at current share

The bot always places bid and ask at midpoint ± 1 tick (maximizing quadratic score). When SF detects an edge, it skews sizes — more bid if underpriced, more ask if overpriced. Score stays near-maximum. Inventory leans toward the edge.

QuoteEngine v2

Or use the built-in CLI engine

The SimpleFunctions CLI includes QuoteEngine v2 — a WebSocket event-driven market making engine with sub-100ms requoting. No Python needed. Works for any market, not just sports.

Thesis-aware bias

sf quote create TICKER --thesis-id UUID

Auto-skew from edge data. Updates every 60s. Accumulate the side your thesis favors.

Fade after fills

sf quote create TICKER --fade 2 --fade-decay 30

Widen spread by 2¢ after each fill, decay back over 30s. Reduces adverse selection on goals/events.

Paper trading

sf quote create TICKER --paper

Simulated fills from live book data. Test strategies risk-free before going live.

Layered depth

--layers 3 --layer-spacing 1

3 price levels per side, 1¢ apart. Shows deeper book presence for better scoring.

Dynamic spread

--min-spread 2 --max-spread 6

Floor and ceiling on spread width. Prevents quoting too tight in volatile moments.

Requote debounce

--requote-delay 200

Wait 200ms after book update before requoting. Reduces API calls in fast markets.

Get started

Install the botpip install sfmm
Discover sports markets (no credentials needed)sfmm discover
Dry run — see computed quotes, no real orderssfmm run --dry-run
Real quoting with SF execution trackingexport SF_API_KEY=sf_live_... && sfmm run --mode pre

Need market intelligence?

SimpleFunctions provides edges, world context, and execution tracking. The bot works standalone, but SF makes it smarter.

Get SF API Key