ํ์ ํ๋ฅ 15% ์ดํ์ tail ์์ฅ์ด ๋ฌด์์ด ํค๋๋ผ์ธ์ +10%p ์ด์ ๊ธ๋ฑํ ๋ค ์คํ์ดํฌ๊ฐ ๋ฉ์ถ๋ฉด NO๋ฅผ ๋งค์ํด, ๊ณตํฌ๊ฐ ๋ง๋ ํ๋ฆฌ๋ฏธ์์ด ๊ฐ์ (YES ๋๋๋ฆผ)ํ๋ ๊ฒ์ ์ํํ๋ค.
base = median( YES, [now-7d, now-6h] ) # ํ์ ํ๋ฅ (์ต๊ทผ 6h ์ ์ธ) spike โ base <= 0.15 AND yes_now - base >= 0.10 AND yes_now <= 0.30 stall โ ์ฒซ threshold(base+0.10) ๋ํ ํ >= 90๋ถ AND ์ต๊ทผ 45๋ถ YES ์ ๊ณ ๊ฐ ์์ ์ง์ โ spike AND stall AND volume24h >= 2.0 ร ์๋์ฐ ํ๊ท โ NO ํ ํฐ ๋งค์
๋์ค์ ํ๋ฅ ์ด ์๋๋ผ '๋์ฐํจ'์ ๋ฐ์ํ๋ค. Probability neglect โ Cass Sunstein, "Probability Neglect: Emotions, Worst Cases, and Law" (Yale Law Journal, 2002) ๋ฐ "Terrorism and Probability Neglect" (Journal of Risk and Uncertainty, 2003). ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ์ ์ผ๋ก ๊ฐ๋ ฌํ ์๋ก(ํต, ํ ๋ฌ, ์ ์) ์ฌ๋์ ๋ฐ์ ํ๋ฅ ์ ํฌ๊ธฐ๋ฅผ ํ๋จ์์ ์ฌ์ค์ ์ ๊ฑฐํ๊ณ ๊ฒฐ๊ณผ์ ๋์ฐํจ ๊ทธ ์์ฒด์ ๋ฐ์ํ๋ค โ 1%์ 0.1%๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํ๊ณ ๊ฐ์ ๊ณตํฌ ๊ฐ๊ฒฉ์ ์ง๋ถํ๋ค. Availability cascade โ Kuran & Sunstein์ด ์ ๋ฆฌํ ๋ฉ์ปค๋์ฆ. ๋ฌด์์ด ๋ด์ค๊ฐ ๋ฐ๋ณต ๋ ธ์ถ๋ ์๋ก ๊ทธ ์ฌ๊ฑด์ด "์ผ์ด๋ ๊ฒ ๊ฐ๋ค"๋ ์ฒด๊ฐ์ด ์๊ธฐ๊ฐํ์ ์ผ๋ก ์ฆํญ๋๊ณ , ์์ธก์์ฅ์์๋ ์ด๊ฒ์ด tail ์์ฅ YES์ ๋ํ '๋ณดํ/๋ณต๊ถ' ๋งค์์ธ๋ก ๋ํ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ณตํฌ ์ด๋ฒคํธ ์งํ tail ์์ฅ YES๋ ์ ๋ณด๊ฐ ์ ๋นํํ๋ ์์ค ์ด์์ผ๋ก ์ค๋ฒ์ํ ํ๊ณ , ํค๋๋ผ์ธ์ ๊ฐ์ ์ ๊ฐ๋๊ฐ ์์ผ๋ฉด ๋๋์์จ๋ค.
์ค์ธก ์ฌ๋ก (๊ณต๊ฐ ๋ฌธํ). Polymarket ํตํญ๋ฐ ์์ฅ: CoinDesk (2026-03) ๋ณด๋ โ ์ง์ ํ ๊ธด์ฅ ํค๋๋ผ์ธ ๊ตฌ๊ฐ์์ "2026๋ ๋ด ํต๋ฌด๊ธฐ ์ฌ์ฉ" ์์ฅ์ ๋ด์ฌํ๋ฅ ์ด 19%๊น์ง ๊ธ๋ฑํ๋ค. ์ ๋ฌธ๊ฐ ์ถ์ ๊ธฐ์ ์จ(<1%)๊ณผ์ ๊ดด๋ฆฌ๋ ํ๋ฅ ์ด ์๋๋ผ ๊ณตํฌ๊ฐ ๊ฐ๊ฒฉ์ ๋ง๋ค์์์ ๋ณด์ฌ์ค๋ค. ์ด๋ ํด์ ์์ฅ: polymarkets.co.il ์ ๋ต ๊ฐ์ด๋์ ๊ธฐ๋ก๋ ์ฌ๋ก โ ๋ฃจ๋จธ ํค๋๋ผ์ธ์ 8๋ถ ๋ง์ 35% โ 68%๋ก ๊ธ๋ฑํ๋ค๊ฐ 2์๊ฐ ๋ด 58%์ ์์ฐฉ. ๊ฐ์ ๊ฐ์ด๋์ ๊ด์ฐฐ "๋๋๋ฆผ์ 60%๊ฐ 90~120๋ถ ๋ด์ ๋ฐ์"์์ ๋ณธ ์ ๋ต์ 90๋ถ ๋๊ธฐ + 45๋ถ ์คํจ ํ์ธ ํ๋ผ๋ฏธํฐ๊ฐ ์ง์ ๋์ถ๋์๋ค. ๊ตฐ์ค ํธํฅ์ ๊ตฌ์กฐ์ ์ค์ฆ: arXiv 2602.19520 "Decomposing Crowd Wisdom" (Kalshi+Polymarket 2.92์ต ๊ฑฐ๋ ๋ถ์) โ ์ ํ๋ฅ ๊ตฌ๊ฐ์ ์ฒด๊ณ์ ๊ณผ๋๊ฐ๊ฒฉ(favorite-longshot bias์ tail ์ชฝ)์ ๊ฐ๋ณ ์ฌ๊ฑด์ด ์๋๋ผ ์์ฅ ๊ตฌ์กฐ ์์ค์์ ๋ฐ๋ณต ํ์ธ๋๋ค.
์ด ์ ๋ต์ ๊ธฐ์กด ๊ณจ๋ ์๋ฆฌ์ฆ(apple/banana/cherry ๋ฐ date~lime)์ ๋ด๋ถ ๋ฐ์ดํฐ๋ ์ ๋ต ๋ฌธ์์์ ํ์๋ ๊ฒ์ด ์๋๋ผ, ์์ ๊ณต๊ฐ ๋ฌธํ(ํ๋๊ฒฝ์ ํ ๋ ผ๋ฌธ + ์์ฅ ์ค์ธก ๊ธฐ์ฌ)์์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ถ๋์๋ค. ๊ธฐ์กด ๋ด๊ณผ์ ๊ด๊ณ๋ ํฌ์ง์ ๋ ๊ตฌ๋ถ๋ฟ์ด๋ค: fig(Hope Crusher)๋ ์ ์ ์ธ theta ์ํ โ ์๋ฌด ์ผ๋ ์๋ ๋กฑ์ท์ ์๊ฐ ๊ฐ์น ์๋ฉธ์ ๋จน๊ณ , lime(Shock Follow)๋ ๊ฑฐ๋๋์ด ํญ์ฆํ๊ณ ๊ณ ์ ์ ์ ์งํ๋ '์ง์ง ์ ๋ณด' ๊ธ๋ฑ์ ํธ์นํ๋ค. orange(Fear Spike Fade)๋ ์ด๋ฒคํธ ์งํ์ ๊ฐ์ ๊ณผ์๋ง ๋ ธ๋ฆฐ๋ค โ ์คํ์ดํฌ๊ฐ ๋ฉ์ถ ๊ฒ์ ํ์ธํ ๋ค ๋ฐ๋ํธ(NO)์ ์ฐ๋ค. lime์ด ํธ์นํ๋ ์์ฅ๊ณผ orange๊ฐ ํ์ด๋ํ๋ ์์ฅ์ "๊ณ ์ ์ ์ง ์ฌ๋ถ"๋ก ์์ฐ ๋ถ๋ฆฌ๋๋ A/B ์์ด๋ค.
๋ชจ๋ ์ถฉ์กฑ ์ NO ํ ํฐ ๋งค์.
| ์กฐ๊ฑด | ๊ฐ (๊ธฐ๋ณธ) | ๊ทผ๊ฑฐ |
|---|---|---|
| ์ ๋์ฑ | liquidity >= $15,000 | ์ฌ๋ฆฌํผ์ง/์ฒด๊ฒฐ ๊ฐ๋ฅ์ฑ |
| ํด๊ฒฐ๊น์ง ๋จ์ ์๊ฐ | hours_left >= 72h | ๋ง๊ฐ ์๋ฐ ์คํ์ดํฌ = ์ง์ง ์ ๋ณด์ผ ๊ฐ๋ฅ์ฑ ๋ฐฐ์ |
| ์๋์ฐ ์ ํจ์ฑ | 7d ์๋์ฐ, >= 5ํฌ์ธํธ, ์ปค๋ฒ๋ฆฌ์ง >= 50% (๋ฐฑํ ํฌํจ) | invalid๋ฉด ์ง์ ๊ธ์ง (cold-start ํด๋ฐฑ ๊ธ์ง) |
| ํ์ ํ๋ฅ (base) | base = median(YES, [now-7d, now-6h]) <= 0.15 | ์๋ tail ์์ฅ๋ง (์ต๊ทผ 6h ์ ์ธ๋ก ์คํ์ดํฌ ์ค์ผ ๋ฐฉ์ง) |
| ์คํ์ดํฌ | yes_now - base >= 0.10 AND yes_now <= 0.30 | +10%p ๊ธ๋ฑ, ๋จ 0.30 ์ด๊ณผ๋ ์ฌํ๊ฐ๋ ์์ค์ผ ์ ์์ |
| ์คํ์ดํฌ ๊ฒฝ๊ณผ | ์ฒซ threshold(base+0.10) ๋ํ ํ >= 90๋ถ | ๋๋๋ฆผ์ 60%๊ฐ 90~120๋ถ ๋ด ๋ฐ์ โ ์ด๊ธฐ ๊ณผ์ด ํํผ |
| ์คํ์ดํฌ ์คํจ | ์ต๊ทผ 45๋ถ YES ์ ๊ณ ๊ฐ ์์ | ์์ง ์ค๋ฅด๋ ์ค์ด๋ฉด ํ์ด๋ ๊ธ์ง (๋จ์ด์ง๋ ์นผ๋ ์ ๋ฐ๋ํธ) |
| ๊ฑฐ๋๋ ํ์ธ | volume24h >= 2.0 ร ์๋์ฐ ํ๊ท | ๊ณตํฌ๊ฐ ์ค์ ๊ฑฐ๋๋ก ์ด์ด์ก๋์ง (์กฐ์ฉํ ๋ ธ์ด์ฆ ๋ฐฐ์ ) |
๋งค์ ๋์: NO ํ ํฐ โ NO ๊ฐ๊ฒฉ โ [0.70, 0.95] ์ฌ๊ฒ์ฆ ํ GTC limit @ midpoint.
์ฐ์ ์์ ์, trailing stop ์์.
| ์ฐ์ ์์ | ์กฐ๊ฑด | exit_reason |
|---|---|---|
| 1 | ์์ โ NO P&L <= -10% (= YES๊ฐ ๊ณ์ ์ค๋ฆ = ์ง์ง ์ ๋ณด) | stop_loss |
| 2 | retrace ์ต์ (์ฃผ ์ฒญ์ฐ) โ ์ค๋ ์ท ์ต์ YES <= base + 0.5 ร (peak - base) | retrace_target |
| 3 | ์ต์ (๋ณด์กฐ) โ NO >= buy ร 1.08 (๋ชฉํ๊ฐ 0.99 ์บก) | take_profit |
| 4 | ์ต๋ ๋ณด์ โ ๋ณด์ 72h ์ด๊ณผ (๋๋๋ฆผ ์คํจ โ ์๋ณธ ํ์) | max_holding |
| 5 | ์๊ฐ ์ฒญ์ฐ โ ํด๊ฒฐ๊น์ง 24h ๋ฏธ๋ง | time_exit |
| โ | ํด๊ฒฐ ํ ๋งค๋ ๋ถ๊ฐ โ end_date + 24h ๊ฒฝ๊ณผ + midpoint ์กฐํ ๋ถ๊ฐ | resolved_unredeemed (EXPIRED) |
retrace ํ์ ์ trade์ ์ ์ฅ๋ base_price_at_buy/spike_peak_at_buy์ ์ค๋
์ท ์ต์ YES๋ฅผ ๋น๊ตํ๋ค (1 - NO midpoint ๊ทผ์ฌ๊ฐ ์๋๋ผ Phase 0 ์ค๋
์ท์ YES๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ โ ์ง์
์๊ทธ๋๊ณผ ๊ฐ์ ๋จ์).
| env | ๊ธฐ๋ณธ๊ฐ | ์๋ฏธ |
|---|---|---|
POLYBOT_BASE_WINDOW_DAYS | 7 | base ๊ณ์ฐ ์๋์ฐ (์ผ) |
POLYBOT_BASE_EXCLUDE_RECENT_HOURS | 6 | base ๊ณ์ฐ์์ ์ ์ธํ ์ต๊ทผ ์๊ฐ |
POLYBOT_BASE_MAX | 0.15 | base ์ํ (ํ์ tail ์์ฅ๋ง) |
POLYBOT_JUMP_MIN | 0.10 | ์คํ์ดํฌ ์ต์ ์์นํญ (yes_now - base) |
POLYBOT_YES_MAX | 0.30 | ์คํ์ดํฌ ํ YES ์ํ |
POLYBOT_SPIKE_WAIT_MINUTES | 90 | ์คํ์ดํฌ ์์ ํ ๋๊ธฐ (๋ถ) |
POLYBOT_STALL_WINDOW_MINUTES | 45 | ์ ๊ณ ๊ฐ ๋ถ์ฌ ํ์ธ ์๋์ฐ (๋ถ) |
POLYBOT_VOL_MULT_MIN | 2.0 | ๊ฑฐ๋๋ ํ์ธ ๋ฐฐ์ |
POLYBOT_RETRACE_RATIO | 0.5 | retrace ์ต์ ๋น์จ |
POLYBOT_ENTRY_HOURS_MIN | 72 | ์ง์ ์ต์ ์์ฌ ์๊ฐ |
POLYBOT_MAX_HOLDING_HOURS | 72 | ์ต๋ ๋ณด์ ์๊ฐ |
POLYBOT_EXIT_HOURS | 24 | ํด๊ฒฐ ์ ์ฒญ์ฐ ์๊ฐ |
POLYBOT_TAKE_PROFIT | 0.08 | ๋ณด์กฐ ์ต์ % |
POLYBOT_STOP_LOSS | -0.10 | ์์ % |
POLYBOT_MIN_LIQUIDITY | 15000 | ์ต์ ์ ๋์ฑ $ |
| ๊ณตํต | โ | POLYBOT_BUY_AMOUNT(5.0), POLYBOT_MIN_VOLUME_24H(0), POLYBOT_MAX_POSITIONS(-1), POLYBOT_REENTRY_COOLDOWN_HOURS(24), POLYBOT_HISTORY_BACKFILL(true), POLYBOT_EXCLUDED_CATEGORIES(""), LOG_LEVEL(INFO) |
uv run python main.py run --simulate --job orange-sim์ Jenkins 3~5๋ถ ๊ฐ๊ฒฉ์ผ๋ก. ์ง์
์๊ทธ๋ ๋ฐ์ ๋น๋์ reason ๋ถํฌ ํ์ธ (๊ฑฐ์ ์์ผ๋ฉด POLYBOT_JUMP_MIN ์ํ ๊ฒํ ).POLYBOT_BUY_AMOUNT๋ฅผ ์์ก(์: $10~50)์ผ๋ก ์คํ.retrace_target์ด ์ฃผ ์์ต์์ด์ด์ผ ์ ์ โ stop_loss ๋น์ค > 40%๋ฉด ๊ฒ์ดํธ(๋๊ธฐ/์คํจ/๊ฑฐ๋๋)๊ฐ ์ง์ง ์ ๋ณด๋ฅผ ๋ชป ๊ฑฐ๋ฅด๋ ๊ฒ โ ์ ๋ต ์ฌ๊ฒํ . max_holding ๋น์ค์ด ๋์ผ๋ฉด ๋๋๋ฆผ ๊ฐ์ค ์์ฒด๊ฐ ์ฝํ ๊ฒ.base_price_at_buy/spike_peak_at_buy/vol_mult_at_buy/yes_price_at_exit ์ปฌ๋ผ์ผ๋ก ํ๊ณ ๊ฐ๋ฅ (strategy_name='orange'๋ก ๊ต์ฐจ ๋ด UNION ์ฟผ๋ฆฌ).๋ฒ ๋ฆฌ์์ด์
: A-1 ๋ณด์(POLYBOT_SPIKE_WAIT_MINUTES=120, POLYBOT_VOL_MULT_MIN=3.0 โ ๋ ํ์คํ ์คํจ๋ง, ๋น๋ ๊ฐ์ยท์น๋ฅ ์์น ๊ธฐ๋), A-2 ๊ณต๊ฒฉ(POLYBOT_JUMP_MIN=0.07, POLYBOT_BASE_MAX=0.20 โ ์์ ๊ณตํฌ๋ ํ์ด๋, ๋น๋ยท๋
ธ์ด์ฆ ์ฆ๊ฐ), A-3 ๊น์ ๋๋๋ฆผ(POLYBOT_RETRACE_RATIO=0.3 โ base ๊ทผ์ฒ๊น์ง ๊ธฐ๋ค๋ ค ๋ ํฌ๊ฒ ๋จน๊ธฐ, max_holding ์ฒญ์ฐ ๋น์ค ์ฆ๊ฐ ๋ฆฌ์คํฌ).
#!/bin/bash export POLYBOT_BUY_AMOUNT=1000 export POLYMARKET_PRIVATE_KEY=<Jenkins credential> export POLYMARKET_FUNDER_ADDRESS=<Jenkins credential> export LOG_LEVEL=INFO # ์ ๋ต ์ฃผ์ ํ๋ผ๋ฏธํฐ (๊ธฐ๋ณธ๊ฐ๊ณผ ๋ค๋ฅด๊ฒ ์ด์ํ ๋๋ง) # export POLYBOT_JUMP_MIN=0.10 # export POLYBOT_SPIKE_WAIT_MINUTES=90 # export POLYBOT_RETRACE_RATIO=0.5 cd ./golden-orange uv sync uv run python ./main.py run