Skip to content

Instantly share code, notes, and snippets.

@yongkangc
Created January 27, 2026 05:57
Show Gist options
  • Select an option

  • Save yongkangc/c88efb81dc19e7558d9807703ed3d043 to your computer and use it in GitHub Desktop.

Select an option

Save yongkangc/c88efb81dc19e7558d9807703ed3d043 to your computer and use it in GitHub Desktop.
Polymarket 15-Min Binary Market Making Strategy

Polymarket 15-Minute Binary Market Making Strategy

The Market

Polymarket offers 15-minute binary prediction markets:

"Will BTC be higher than $100,000 at 3:15 PM?"

  • YES token: Pays $1 if BTC > strike at expiry, else $0
  • NO token: Pays $1 if BTC ≤ strike at expiry, else $0
  • YES + NO always = $1 (complements)

Strategy: Delta-Neutral Market Making

The Lifecycle

Step Action Purpose
Split $100 USDC → 100 YES + 100 NO Mint inventory without directional risk
Quote Post bids/asks on both tokens Provide liquidity, earn spread
Merge Paired tokens → USDC Lock in profits, free capital

Profit Mechanism

Sell YES at $0.55
Sell NO  at $0.52
─────────────────
Collected: $1.07
Payout:    $1.00
Profit:    $0.07 (7%)

We profit from the spread, not from predicting the outcome.


Fair Value Model: Black-Scholes Binary Call

Formula

FV = Φ(z)

where z = ln(S/K) / (σ√τ)
Variable Meaning
S Current CEX price (Binance)
K Strike price (price at market start)
σ Volatility (per √second)
τ Seconds remaining to expiry
Φ Standard normal CDF

Intuition

  • ln(S/K): How far price moved from strike (+ = up, - = down)
  • σ√τ: How much price could move in remaining time
  • z: Realized movement ÷ Expected future movement

When z is large positive → high probability of YES When z is large negative → high probability of NO When z ≈ 0 → coin flip (50/50)

Optional: Drift Term

Full Black-Scholes includes risk-free rate:

z = (ln(S/K) + (r - σ²/2)τ) / (σ√τ)

For 15-minute markets, r ≈ 0, so drift is typically disabled.


Quoting Logic

Spread Calculation

half_spread = fees + slippage + operational_risk + min_edge
Component Purpose
Fees Polymarket's convex taker fee
Slippage Expected execution slippage
Operational risk Gas, failed txs, timing
Min edge Our profit margin

Quote Prices

YES_bid = fair_prob - half_spread - inventory_skew
YES_ask = fair_prob + half_spread - inventory_skew

NO_bid = (1 - fair_prob) - half_spread + inventory_skew
NO_ask = (1 - fair_prob) + half_spread + inventory_skew

Inventory Skew

If we accumulate too much YES, we lower YES quotes to:

  • Sell YES faster (lower ask)
  • Buy YES slower (lower bid)

This keeps us delta-neutral.

No-Arbitrage Constraints

YES_ask + NO_ask ≥ $1.00  (can't sell both for < $1)
YES_bid + NO_bid ≤ $1.00  (can't buy both for > $1)

Risk Controls

1. Expiry Guard

Problem: As τ→0, delta explodes near strike. Tiny price moves cause huge fair value swings.

Solution: Stop quoting in last 60 seconds.

2. Staleness Gates

Problem: Stale CEX prices = stale quotes = getting picked off.

Solution: Cancel all quotes if:

  • CEX price > 2 seconds old
  • PM orderbook > 3 seconds old

3. Adverse Selection Detection

Problem: Fast traders see CEX moves before us.

Solution: If CEX moves > 0.5% in 500ms, pause quoting briefly.

4. Position Limits

  • Max $500 per market
  • Max $5,000 gross exposure
  • 5% daily drawdown halt

Volatility Estimation

EWMA (Exponential Weighted Moving Average)

σ²_t = α × r²_t + (1-α) × σ²_{t-1}
  • α = 0.1 (reactivity to recent moves)
  • r_t = log return over tick interval
  • Updates every 100ms from Binance

Volatility-Adjusted Spread

adjusted_spread = base_spread × (1 + σ × multiplier)

Higher volatility → wider spreads → more protection.


Edge vs. Competition

Advantage How
Speed 100ms quote refresh from Binance feed
Math Black-Scholes fair value vs. retail intuition
Neutrality Split/Merge keeps us delta-neutral
Discipline Automated risk controls, no emotion

Summary

  1. Split USDC into YES + NO tokens
  2. Calculate fair probability using Black-Scholes
  3. Quote both sides with spread around fair value
  4. Skew quotes to manage inventory
  5. Merge paired tokens to realize profits
  6. Repeat every 100ms until 60 seconds before expiry
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment