Polymarket Bot Tutorial · 32개 중 23장
Polymarket 5분 BTC/ETH up-down market bot 패턴: 하루 288번의 expiration, latency가 중요한 실행, edge source, 대부분의 retail bot이 왜 지는지, 그리고 전략용 code skeleton.
이 장에서 다루는 내용
Polymarket의 5분 BTC up/down series는 하루에 288번 resolve되므로, 작은 edge도 여러 번 반복되면 누적 효과가 커집니다. 하지만 latency와 edge 기준이 professional firm 수준이라 대부분의 retail bot은 여기서 손해를 봅니다. 이 장은 그중에서도 살아남는 것들만 다룹니다.
- 5-min crypto market이 무엇인지
- 하루 288번의 expiration = 누적 반복
- 왜 retail bot이 여기서 지는지
- 살아남는 edge source
- Latency budget
- Risk: 거래당 작게, 하루 전체는 크게
- Code: 5-min strategy skeleton
5-min crypto market이란
Polymarket의 5분 crypto market은 BTC(그리고 ETH) 가격에 대한 binary up/down 질문입니다. 새 market은 5분마다 열리며, 각 market은 open 후 5분 시점의 closing price를 기준으로 published oracle에서 가져온 값으로 resolve됩니다.
이로 인해 자산당 하루 288개의 market이 생깁니다. 어떤 edge든 누적 기회가 매우 큽니다. 거래당 edge가 작더라도 하루에 100회 이상 활용할 수 있으면 의미 있는 수준이 됩니다.
반대로, 기준선은 professional firm이 정합니다. mid는 underlying price feed와 매우 촘촘하게 움직이며, book은 보통 반대 방향 leg에서 얇습니다.
하루 288번의 expiration = 누적 반복
만약 거래당 edge가 0.5c이고 win rate가 55%이며 하루 60번 거래할 수 있다면, 기대 일일 PnL은 60 × 0.5c = 10-share position 기준 $0.30, 즉 하루 $3입니다. 작아 보이지만 누적되면 의미가 있습니다. 252 trading day × $3 = 연 $750이며, 거의 0에 가까운 capital exposure로 가능한 수익입니다(포지션은 5분 내에 resolve됩니다).
같은 edge가 분기마다 한 번만 resolve되는 binary에서 연 $750를 만들려면, 훨씬 더 큰 거래 규모와 더 넓은 손실 tail이 필요합니다.
5-min market은 Polymarket에서 작지만 빈번한 edge가 연간 의미 있는 수익으로 이어질 수 있는 거의 유일한 영역입니다.
왜 retail bot이 여기서 지는가
retail 진입자를 꾸준히 무너뜨리는 세 가지 failure mode가 있습니다.
- Latency: professional firm은 50-100ms 안에 주문을 넣지만, retail bot은 1-3초가 걸립니다. 실행할 때쯤이면 price는 이미 새로운 mid에 도달해 있습니다.
- Information asymmetry: underlying CEX(Binance, Coinbase)는 Polymarket의 price feed보다 trade tape를 더 빨리 찍습니다. 직접 CEX subscription이 없는 bot은 stale data로 거래하고 있는 셈입니다.
- Spread tax: 5분 cadence에서는 0.5c spread × 60 trades = 피할 수 없는 비용이 하루 30c입니다. 수익을 내려면 먼저 이 비용을 넘어야 합니다.
retail bot이 손익분기점에 머물거나 손해를 보는 이유는 보통 pros보다 빠를 수 없고, spread tax도 피할 수 없기 때문입니다. retail에 맞는 전략은 pros보다 더 빠른 전략이 아니라, 특정 정보 우위를 가진 느린 의사결정 전략입니다.
살아남는 edge source
5-min market에서 retail이 활용할 수 있는 것들입니다.
- Funding-rate-driven directional bias: perp futures의 극단적인 positive funding은 mean reversion을 예고하므로 funding rate에 반대 방향으로 거래합니다.
- Open-interest-clearing windows: 매시 정각에는 perp futures liquidation 가능성이 높아집니다. 그 구간의 극단적 움직임을 fade합니다.
- Late-window resolution arbitrage: 5분 window의 마지막 30초에는 resolution price를 점점 더 알 수 있게 됩니다. 그런데 book은 live tape와 맞지 않는 확률에 얇은 liquidity를 내놓는 경우가 많습니다.
작동하지 않는 것: 순수 technical signal(RSI, moving averages), 단순 momentum copy, bot이 pros보다 빨라야만 하는 모든 전략.
Latency budget
실행 가능한 5-min strategy의 budget은 대략 다음과 같습니다.
- Read signal source (CEX trade tape, funding rate): 100-300ms
- Compute decision: 50ms
- Place FOK order: 200-500ms
- Receive fill confirmation: 200ms
총합: 550-1050ms. paid RPC와 direct CEX WebSocket subscription이 있는 VPS에서는 가능합니다. 집에서 쓰는 laptop이나 free-tier API로는 어렵습니다.
총 500ms 미만이 필요한 전략은 professional 영역입니다. retail은 거기에 경쟁해서는 안 됩니다.
Risk: 거래당 작게, 하루 전체는 크게
5-min market sizing: 거래당 작게, 일일 한도는 제한합니다.
- Per-trade: market당 5-15 shares($1-6). 5 미만이면 GTC sell이 사실상 어렵고, 15를 넘으면 entry에서 book을 밀게 됩니다.
- Daily total: 50-100 trades. 그 이상은 하나의 oracle quirk에 대한 상관 exposure를 키웁니다.
- Daily PnL kill switch: 누적 PnL이 $10 이상 하락했거나(또는 배정 자본의 5%) 즉시 중단합니다. 5-min market의 나쁜 날은 보통 strategy assumption이 깨졌다는 뜻입니다. 하루를 버티고, debug하고, redeploy하세요.
거래당 규모와 일일 횟수 사이의 비대칭은 의도된 것입니다. 깊이보다 breadth로 승부하는 구조입니다.
Code: 5-min strategy skeleton
Reference: funding-rate-driven 5-min bot의 trading loop입니다.
def five_min_loop():
while True:
wait_for_next_window_open() # blocks until xx:x0:00 or xx:x5:00
markets = find_open_5min_markets("btc")
if not markets: continue
funding = fetch_perp_funding_rate("BTCUSDT")
bias = "DOWN" if funding > 0.001 else "UP" if funding < -0.001 else None
if bias is None: continue
market = markets[0]
token = market["clobTokenIds"][0 if bias == "UP" else 1]
book = fetch_book(token)
if not book.best_ask or book.best_ask > 0.55: continue
place_fok(token, "BUY", book.best_ask + 0.01, 10)
production 버전에서 추가할 것들: 5분 window 전반에 걸쳐 position을 추적해 정확한 exit timing을 잡기, live 전 30개 window 동안 paper-trade 하기, 연속 손실 시 중단하기.





