Polymarket Bot Tutorial · 32개 중 27장
Polymarket의 날씨 및 기후 예측 bot: hurricane 상륙 시장, daily max temperature, El Nino/La Nina(ENSO), NOAA 및 NWS data source, 그리고 weather data를 trading signal로 변환하는 방법.
이 장에서 다루는 내용
Polymarket의 weather market은 과소평가된 카테고리입니다. 공공 data source가 깔끔하고, price discovery가 느리며, 적극적인 trader도 드뭅니다. bot에게는 분명한 edge가 있지만, 시장은 대체로 얇습니다. 이 장에서는 hurricane, temperature, ENSO 시장을 다룹니다.
- tradeable signal로서의 weather
- hurricane 시장: NHC data
- daily max temperature: NWS data
- ENSO(El Nino/La Nina) cycle
- Latency: weather update는 느림(소매 trader에게 유리)
- Risk: forecast model error tail
- Code: NOAA hurricane data를 가져와 position 조정하기
tradeable signal로서의 weather
Weather market은 무료이면서 권위 있는 data source(NOAA, NWS, NHC)의 지원을 잘 받고, 판단이 아니라 객관적 측정치에 따라 resolve됩니다. 그래서 체계적인 전략에 이상적입니다-edge는 news를 사람보다 빨리 읽는 데 있는 것이 아니라 data interpretation에 있습니다.
단점은 volume이 modest하다는 점입니다. hurricane market은 생애 거래량이 $500k-2M 정도일 수 있고, city temperature market은 $50-200k 수준일 수 있습니다. politics나 sports에서 대규모로 잘 작동하는 전략은 weather로 그대로 옮겨지지 않습니다-edge의 dollar 규모는 시장의 total liquidity에 의해 제한됩니다.
여기에 맞는 bot pattern은: 여러 weather market에 걸쳐 작고 분산된 position을 잡고, resolution까지 보유하는 것입니다. weather는 day-trading market이 아닙니다. 속도는 느린 편입니다.
hurricane 시장: NHC data
hurricane season(Atlantic: 6월-11월)에는 landfall location, intensity, named-storm count에 대한 Polymarket market이 생깁니다. data source는 National Hurricane Center(NHC)의 공개 advisory로, active storm 중에는 6시간마다, hurricane이 landfall까지 <72시간 남았을 때는 3시간마다 업데이트됩니다.
전략: NHC의 forecast cone이 시장과 다른 특정 landfall probability를 시사할 때, NHC의 공식 forecast에 더 가까운 쪽에 베팅합니다. NHC는 시장이 결국 수렴하게 될 source-of-truth입니다.
주의사항: long-tail risk입니다. hurricane은 때때로 forecast가 예상하지 못한 행동을 합니다. NHC가 100%가 아니라 80% 맞는다고 가정하고 position size를 잡으세요.
daily max temperature: NWS data
Polymarket은 일부 US 도시를 대상으로 daily-temperature-threshold market을 제공합니다. "Will NYC reach 95°F on Aug 15?" 같은 형태입니다. data source는 하루 2-3회 업데이트되는 National Weather Service forecast와 사후 observation입니다.
market은 보통 NWS forecast probability를 어느 정도 noise와 함께 가격에 반영합니다. edge는 NWS forecast에 bias가 있다는 점입니다(보통 극단적 폭염 사건에 대해 보수적). 특정 도시/시즌의 bias 방향을 아는 bot은 NWS가 체계적으로 과소평가하는 쪽에 베팅합니다.
제약: 낮은 volume($50-100k가 일반적), 작은 position size, hold-to-resolution. Cycle: 당일 아침 진입, 저녁에 resolve.
ENSO(El Nino/La Nina) cycle
El Niño / La Niña forecast market은 수개월 horizon과 깔끔한 data(NOAA의 월간 ENSO 업데이트)를 가집니다. Polymarket의 implied probability는 각 월간 업데이트 이후 NOAA forecast confidence를 종종 1-2주 뒤에야 따라갑니다.
bot pattern: release day에 NOAA 업데이트를 읽고, NOAA의 forecast 조정과 일치하는 쪽에 베팅한 뒤, 시장이 따라잡을 때까지 1-2주 보유합니다. 시즌당 여러 번의 업데이트가 여러 entry point를 제공합니다.
volume은 modest하지만($100-500k per cycle), 이 전략은 매우 느려서 순수한 quant retail도 이 niche에서 제한적인 bot 경쟁과 겨룰 수 있습니다.
Latency: weather update는 느림(소매 trader에게 유리)
weather data update는 sub-second이 아니라 분~시간 단위입니다. 이것은 의미 있는 소매 trader의 장점입니다. sports와 crypto market을 지배하는 latency arb는 여기에는 적용되지 않습니다.
아침 8시 NOAA 업데이트를 8시 15분에 읽는 retail bot은, 시장의 느린 trader들이 아직 업데이트를 보기도 전에 새로운 fair value에서 FOK를 넣을 수 있습니다. 15분 latency budget은 news arb에서의 2초 budget에 비해 충분히 넉넉합니다.
trade-off는 다음과 같습니다: 얇은 volume 때문에 빠른 bot이라도 각 market에 배치할 수 있는 position은 작습니다. breadth-not-depth pattern(21장)이 weather에서는 훨씬 더 강하게 적용됩니다.
Risk: forecast model error tail
weather forecast에는 알려진 error bar가 있습니다. NHC는 매년 hurricane forecast error를 공개하는데, landfall location은 72시간 lead time에서 평균 100-200마일 정도의 error를 보입니다. NWS temperature forecast는 7일 lead time에서 평균 2-4°F의 error를 보입니다.
position size에 대한 시사점: "forecast가 맞다"고 높은 확신으로 베팅하지 마세요. forecast가 70-80%의 시간에 맞는다고 가정하고 position을 잡으세요. forecast를 절대적인 진리처럼 받아들이는 bot은 model이 빗나간 20-30%의 거래에서 손실을 봅니다.
hurricane 카테고리는 특히 tail이 큽니다. forecast-low-probability location에 Cat 5가 landfall하면, 확신에 찬 short position은 사실상 무한 손실이 됩니다. 단일 hurricane에 대한 exposure는 weather allocation의 10%로 제한하세요.
Code: NOAA hurricane data를 가져와 position 조정하기
Reference: hurricane season 동안 NHC advisory feed를 polling하고 forecast cone 변경 시 alert합니다.
import requests, feedparser
NHC_RSS = "https://www.nhc.noaa.gov/index-at.xml"
def poll_nhc():
while True:
feed = feedparser.parse(NHC_RSS)
for entry in feed.entries:
storm_id = entry.id
advisory = parse_advisory(entry.summary)
prev = load_last_advisory(storm_id)
if advisory["track"] != prev.get("track"):
alert(f"track update for {storm_id}: {advisory['track']}")
save_advisory(storm_id, advisory)
time.sleep(900) # 15 min
Polymarket landfall market은 시즌 시작 시 NHC storm ID와 수동으로 매칭하는 것이 가장 좋습니다. Polymarket의 market title이 NHC의 naming을 일관되게 따르지 않기 때문에 자동 매칭은 취약합니다.





