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)
| 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 |
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.
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 |
- 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)
Full Black-Scholes includes risk-free rate:
z = (ln(S/K) + (r - σ²/2)τ) / (σ√τ)
For 15-minute markets, r ≈ 0, so drift is typically disabled.
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 |
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
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.
YES_ask + NO_ask ≥ $1.00 (can't sell both for < $1)
YES_bid + NO_bid ≤ $1.00 (can't buy both for > $1)
Problem: As τ→0, delta explodes near strike. Tiny price moves cause huge fair value swings.
Solution: Stop quoting in last 60 seconds.
Problem: Stale CEX prices = stale quotes = getting picked off.
Solution: Cancel all quotes if:
- CEX price > 2 seconds old
- PM orderbook > 3 seconds old
Problem: Fast traders see CEX moves before us.
Solution: If CEX moves > 0.5% in 500ms, pause quoting briefly.
- Max $500 per market
- Max $5,000 gross exposure
- 5% daily drawdown halt
σ²_t = α × r²_t + (1-α) × σ²_{t-1}
- α = 0.1 (reactivity to recent moves)
- r_t = log return over tick interval
- Updates every 100ms from Binance
adjusted_spread = base_spread × (1 + σ × multiplier)
Higher volatility → wider spreads → more protection.
| 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 |
- Split USDC into YES + NO tokens
- Calculate fair probability using Black-Scholes
- Quote both sides with spread around fair value
- Skew quotes to manage inventory
- Merge paired tokens to realize profits
- Repeat every 100ms until 60 seconds before expiry