์ฅ๊ธฐ(30์ผ+) tail~์ค๊ฐ ๊ตฌ๊ฐ ์์ฅ์์ YES ๊ฐ๊ฒฉ์ด 20์ผ ๋กค๋ง ์ต์ ๊ฐ ์ดํ๋ก ๋จ์ด์ง๋ฉด ๋งค์ํ๊ณ , ๋ณด์ 120์๊ฐ(5์ผ)์ด ์ง๋๋ฉด ์์ต๊ณผ ๋ฌด๊ดํ๊ฒ ๋ฌด์กฐ๊ฑด ์ฒญ์ฐํ๋ค.
์ง์
โ p <= min( YES ๊ฐ๊ฒฉ, ์ง๋ 20์ผ ์ค ์ต๊ทผ 24h ์ ์ธ ๊ตฌ๊ฐ ) # ๋กค๋ง ์ต์ ๊ฐ, ๋๋ฅ ํ์ฉ
AND p โ [0.03, 0.50] AND hours_left >= 720h (30์ผ)
์ฒญ์ฐ โ ๋ณด์ 120h(5์ผ) ๊ฒฝ๊ณผ โ ์์ต ๋ฌด๊ด ๋ฌด์กฐ๊ฑด ์ฒญ์ฐ (calendar exit)์ด ์ ๋ต์ ๊ฐ์ด ์๋๋ผ ๊ณต๊ฐ๋ ๊ณ๋ ๋ฐฑํ ์คํธ์ ์ง์ ๋ณต์ ๋ค. QuantPedia (2026-04), "Exploiting Mean-Reversion in Decentralized Prediction Markets": Polymarket ๋ฐ์ด๋๋ฆฌ ๊ณ์ฝ ์ ์ ๋ฐ์ดํฐ์์ "X์ผ ๋กค๋ง ์ต์ ๊ฐ์์ ๋งค์ โ Y์ผ ํ ์ฒญ์ฐ" ๊ท์น์ ๊ทธ๋ฆฌ๋ ์์นํ ๊ฒฐ๊ณผ, X=20 / Y=5 ์กฐํฉ์ด ๊ฑฐ๋๋น์ฉ 10bps ๋ฐ์ ํ์๋ CAR +18.9~22.1%๋ก ์์กดํ๋ค. ์ง๊ธ๊น์ง ๊ฒํ ํ ๊ณต๊ฐ ๋ฌธํ ์ค Polymarket์์ ๊ฑฐ๋๋น์ฉ ๋ฐ์ ํ ์์กดํ ์ ์ผํ ๊ท์น ๊ธฐ๋ฐ ๋ฐฑํ ์คํธ๋ค. ๊ณจ๋ ์๋ฆฌ์ฆ์ ๋ค๋ฅธ ๋ด๋ค(cherry์ ๋ง๊ฐ ์๋ ด, elderberry์ ํจ๋ ํ์ด๋ ๋ฑ)์ด ์ฌ๋ฆฌ ๊ฐ์ค์์ ์ถ๋ฐํด ํ๋ผ๋ฏธํฐ๋ฅผ ์ค๊ณํ๋ค๋ฉด, nectarine์ ๋ฐ๋๋ก ๋ฐ์ดํฐ์์ ์์กดํ ๊ท์น์ ๊ฐ์ ธ์ ์ฌ๋ฆฌ์ ํด์์ ๋ถ์ธ๋ค. ๊ธฐ์กด ๊ณจ๋ ์๋ฆฌ์ฆ ์ ๋ต๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก, ๊ณต๊ฐ ๋ฌธํยท๋ฐฑํ ์คํธ ๊ทผ๊ฑฐ์์ ๋์ถ๋์๋ค.
์ฌ๋ฆฌ์ ๋ฉ์ปค๋์ฆ โ ์ ์ ์ ๊ฐ๊ฐ ์ฌ๋ ์๋ฆฌ์ธ๊ฐ. ์์ค ํํผ: Kahneman & Tversky์ ์ ๋ง์ด๋ก (Prospect Theory)์ด ๋ณด์ฌ์ฃผ๋ฏ ์์ค์ ์ฌ๋ฆฌ ๊ฐ์ค์น๋ ์ด๋์ ์ฝ 2๋ฐฐ๋ค. ๋ณด์ ์๋ ํ๋ฝํ๋ tail ํฌ์ง์ ์ "๋ ๋จ์ด์ง๊ธฐ ์ ์" ๋์ง๊ณ , ์์ ํธ๊ฐ์์ ์ด ํฌ๋งค๋ ๊ฐ๊ฒฉ์ ์ค์ ํ๋ฅ ์ดํ๋ก ์ค๋ฒ์ํธ์ํจ๋ค. ์์ ์ฅ๊ธฐ ์์ฅ์ ๊ตฌ์กฐ: ๋ง๊ฐ์ด ๋จผ ์์ฅ์ ๊ด์ฌ(attention)๊ณผ ์ ๋์ฑ์ด ์ ๋ค. ์์์ ๋งค๋๋ง์ผ๋ก ์ ์ ๊ฐ๊ฐ ๋ง๋ค์ด์ง๊ณ , ์ ์ ํ ์ฐจ์ต๊ฑฐ๋๊พผ๋ ์๋ณธ ์ ๊น(์ฅ๊ธฐ ๋ฝ์ ) ๋๋ฌธ์ ๋๋ฆฌ๊ฒ ๋ค์ด์จ๋ค โ Scott Alexander์ "Prediction Market FAQ"๊ฐ ์ง์ ํ๋ ์ฅ๊ธฐ ์์ฅ์ ๋ง์ฑ์ ๊ฐ๊ฒฉ ์์ถยท์๊ณก๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ค. ํ๊ท ํ๊ท์ ์๊ฐ ์ค์ผ์ผ: ์ค์ธก("10%+ ๊ธ๋ณ์ mean-revert")๊ณผ QuantPedia์ Y=5์ผ ์ต์ ๊ฐ์ด ์ผ์นํ๋ค. ์ค๋ฒ์ํธ๋ ๋ฉฐ์น ๋จ์๋ก ๋ณต์๋๋ฏ๋ก ์ฒญ์ฐ์ ๊ฐ๊ฒฉ ๋ชฉํ๊ฐ ์๋๋ผ ๋ฌ๋ ฅ(5์ผ)์ด๋ค. ์์ธก์์ฅ ๊ฐ๊ฒฉ ์ค์ฐจ๊ฐ ๋ฌด์์๊ฐ ์๋๋ผ ์ฒด๊ณ์ ์ด๋ผ๋ ๋ฐฐ๊ฒฝ ๊ทผ๊ฑฐ๋ก๋ arXiv 2602.19520 "Decomposing Crowd Wisdom" (Kalshi+Polymarket 2.92์ต ๊ฑฐ๋ ๋ถ์)์ด ์๋ค.
์ ์ฅ๊ธฐ(30์ผ+) ์์ฅ๋ง์ธ๊ฐ โ ์ด๋ก ๊ทผ๊ฑฐ๊ฐ ์๋๋ผ ์ค์ผ ์ฐจ๋จ ์ฅ์น๋ค. ๋ง๊ฐ์ด ๊ฐ๊น์ด ์์ฅ์ ์๊ฐ ๊ฐ์น(theta) ์๋ฉธ๋ง์ผ๋ก๋ YES tail ๊ฐ๊ฒฉ์ด ๋จ์กฐ ํ๋ฝํด "๋งค์ผ์ด ์ ์ ๊ฐ"๊ฐ ๋๋ค โ ์ด๊ฑด ํ๊ท ํ๊ท๊ฐ ์๋๋ผ ์ ๋นํ ๊ฐ์ ๋ค. hours_left >= 720(30์ผ)์ ๋ฃฉ๋ฐฑ 20์ผ ๋์ theta ๊ฐ์ ๊ฐ ์ ์ ๊ฐ๋ฅผ ๊ณ์ ๋ง๋๋ ์์ฅ์ ํ๋ณด์์ ์ ๊ฑฐํ๋ค.
๋ชจ๋ ์ถฉ์กฑ ์ ์ง์ . YES ํ ํฐ ๊ธฐ์ค ๊ฐ๊ฒฉ p โ YES ๋งค์ ๊ณ ์ (๋ฐฑํ ์คํธ์ ๋์ผ).
| ์กฐ๊ฑด | ๊ฐ (๊ธฐ๋ณธ) | ์ด์ |
|---|---|---|
| ์ ๋์ฑ | liquidity >= $10,000 | ์ต์ ์ฒด๊ฒฐ ๊ฐ๋ฅ์ฑ (๋ฐฑํ ์คํธ ๋์๋ ์ ์ ๋ ํฌํจ์ด๋ผ ๋ฎ๊ฒ) |
| ๋จ์ ์๊ฐ | hours_left >= 720h (30์ผ) | theta ๊ฐ์ ็ผ ๊ฐ์ง ์ ์ ๊ฐ ์ฐจ๋จ |
| ๊ฐ๊ฒฉ ๋ฐด๋ | p โ [0.03, 0.50] | tail~์ค๊ฐ ๊ตฌ๊ฐ. 0.03 ๋ฏธ๋ง์ ๋ถ๊ดด/ํด๊ฒฐ ์๋ฐ ๋ ธ์ด์ฆ |
| ์ ์ ๊ฐ | p <= min(์ง๋ 20์ผ, ์ต๊ทผ 24h ์ ์ธ ๊ตฌ๊ฐ์ ์ต์ ๊ฐ), ๋๋ฅ ํ์ฉ | ๋ฐฑํ ์คํธ์ X=20 ๊ท์น. ์ต๊ทผ 24h ์ ์ธ๋ ์งํ ์ค ํ๋ฝ ์์ฒด๋ฅผ ๊ธฐ์ค์ ์์ ๋ฐฐ์ |
| ์๋์ฐ ์ ํจ์ฑ | ํฌ์ธํธ >= 5 AND ์ปค๋ฒ๋ฆฌ์ง >= 10์ผ(50%) โ ๋ฐฑํ ํฌํจ | invalid๋ฉด ์ง์ ๊ธ์ง |
| ์ฌ์ง์ ์ฟจ๋ค์ด | 168h (HOLDING/์ฒญ์ฐ/skip ์ดํ) | ์ต์ ๊ฐ ๋ถ๊ทผ ์ฐ์ ์ฌ์ง์ ๋ฐฉ์ง |
์ฐ์ ์์ ์, trailing stop ์์.
| ์ฐ์ ์์ | ์กฐ๊ฑด | exit_reason |
|---|---|---|
| 1 | ๋ณด์ 120h ๊ฒฝ๊ณผ โ ์์ต ๋ฌด๊ด ๋ฌด์กฐ๊ฑด ์ฒญ์ฐ | max_holding โ ์ฃผ ์ฒญ์ฐ ๊ฒฝ๋ก (๋ฐฑํ
์คํธ Y=5 ๋ณต์ ) |
| 2 | P&L <= -30% | stop_loss โ ์์ ํ (๋ฐฑํ
์คํธ์ ์๋ ๋ฐฉ์ด ์ฅ์น) |
| 3 | P&L >= +30% (๋ชฉํ๊ฐ 0.99 ์บก) | take_profit โ ์กฐ๊ธฐ ํ์ด ์ต์ ์์ ํ |
| 4 | ํด๊ฒฐ๊น์ง < 24h | time_exit โ 30์ผ+ ์ง์
์ด๋ผ ๋๋ฌธ ๊ฒฝ๋ก |
| โ | midpoint ์กฐํ ๋ถ๊ฐ + ํด๊ฒฐ 24h ๊ฒฝ๊ณผ | resolved_unredeemed (EXPIRED) โ ์๋ redeem ํ์ |
| env | ๊ธฐ๋ณธ๊ฐ | ์๋ฏธ |
|---|---|---|
POLYBOT_LOOKBACK_DAYS | 20 | ๋กค๋ง ์ต์ ๊ฐ ๋ฃฉ๋ฐฑ (๋ฐฑํ ์คํธ X) |
POLYBOT_EXCLUDE_RECENT_HOURS | 24 | ์ต์ ๊ฐ ์ฐ์ถ ์ ์ ์ธํ ์ต๊ทผ ๊ตฌ๊ฐ |
POLYBOT_HOLD_HOURS | 120 | calendar exit ๋ณด์ ์๊ฐ (๋ฐฑํ ์คํธ Y=5์ผ) |
POLYBOT_PROB_MIN | 0.03 | ์ง์ YES ๊ฐ๊ฒฉ ํํ |
POLYBOT_PROB_MAX | 0.50 | ์ง์ YES ๊ฐ๊ฒฉ ์ํ |
POLYBOT_ENTRY_HOURS_MIN | 720 | ํด๊ฒฐ๊น์ง ์ต์ ์๊ฐ (30์ผ) |
POLYBOT_EXIT_HOURS | 24 | ํด๊ฒฐ ์๋ฐ ์ฒญ์ฐ |
POLYBOT_REENTRY_COOLDOWN_HOURS | 168 | ์ฌ์ง์ ์ฟจ๋ค์ด (7์ผ) |
POLYBOT_TAKE_PROFIT | 0.30 | ์ต์ ์์ ํ |
POLYBOT_STOP_LOSS | -0.30 | ์์ ์์ ํ |
POLYBOT_BUY_AMOUNT | 5.0 | 1ํ ๋งค์ USDC |
POLYBOT_MIN_LIQUIDITY | 10000 | ์ต์ ์ ๋์ฑ $ |
POLYBOT_MIN_VOLUME_24H | 0 | ์ต์ 24h ๊ฑฐ๋๋ (0 = ๋นํ์ฑ โ ์์ ์์ฅ์ด ๋์) |
POLYBOT_MAX_POSITIONS | -1 | ์ต๋ ๋์ ํฌ์ง์ |
POLYBOT_HISTORY_BACKFILL | true | prices-history ๋ฐฑํ (๋๋ฉด ์ฌ์ค์ ๋ฌด์ ๋ต) |
POLYBOT_EXCLUDED_CATEGORIES | "" | ์ ์ธ ์นดํ ๊ณ ๋ฆฌ (๊ธฐ๋ณธ ๋นํ์ฑ) |
LOG_LEVEL | INFO | ๋ก๊ทธ ๋ ๋ฒจ |
POLYBOT_MAX_POSITIONS๋ก ์ํ์ ๋๋ ๊ฒ์ ๊ถ์ฅํ๋ค.uv run python main.py run --simulate --job sim-test๋ฅผ Jenkins 3~5๋ถ ๊ฐ๊ฒฉ์ผ๋ก. ์ง์
๋น๋์ rolling_min_at_buy/lookback_days_at_buy ๋ถํฌ ํ์ธ (๋ฐฑํ์ด ์ค์ ๋ก 20์ผ์ ์ฑ์ฐ๋์ง lookback_days_at_buy >= 10 ๋น์จ๋ก ๊ฒ์ฆ).POLYBOT_BUY_AMOUNT๋ฅผ ์ต์๋ก. 5์ผ ๋ณด์ ์ ๋ต์ด๋ผ ํ์ ์ด ๋๋ฆฌ๋ค โ ์ต์ 4์ฃผ, 30+ ๊ฑฐ๋ ํ๋ณด ํ ํ๋จ.exit_reason=max_holding ๊ฑฐ๋์ ํ๊ท P&L์ด ์์์ธ๊ฐ (์ด ์ ๋ต์ ๋ณธ์ง ์งํ). ์น๋ฅ ๋ณด๋ค ํ๊ท ์์ต ์ฐ์ (tail ๋งค์๋ ์น๋ฅ ์ด ๋ฎ๊ณ payoff๊ฐ ๋น๋์นญ). CSV์ hold_hours_at_exit, rolling_min_at_buy ์ปฌ๋ผ์ผ๋ก ํ๊ณ .stop_loss ๋น์ค > 40%๋ฉด ๊ฐ์ค ๊ธฐ๊ฐ.๋ฒ ๋ฆฌ์์ด์
: A-1 ๋ฐฑํ
์คํธ ์ํ์ ๋ ๊ฐ๊น๊ฒ(POLYBOT_STOP_LOSS=-0.99, POLYBOT_TAKE_PROFIT=9.9 โ ์์ ํ์ ์ฌ์ค์ ๋๊ณ ์์ calendar exit๋ง), A-2 ์งง์ ๋ฃฉ๋ฐฑ/๋ณด์ (POLYBOT_LOOKBACK_DAYS=10, POLYBOT_HOLD_HOURS=72 โ ํ์ ์จ์ ๋์ฌ ํ๋ณธ์ ๋นจ๋ฆฌ ๋ชจ์), A-3 ์ข์ tail ์ง์ค(POLYBOT_PROB_MIN=0.05, POLYBOT_PROB_MAX=0.25 โ ์ค๋ฒ์ํธ๊ฐ ๊ฐ์ฅ ํฐ ๊ตฌ๊ฐ๋ง).
3~5๋ถ ๊ฐ๊ฒฉ ์ฃผ๊ธฐ ์คํ์ ์ ์ ๋ก ํ๋ค (์ค๋ ์ท ์ถ์ + ์ฒญ์ฐ ์ฒดํฌ).
#!/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_MAX_POSITIONS=10 # ๊ตฐ์ง ์์ค ๋ฐฉ์ง ๊ถ์ฅ # export POLYBOT_HOLD_HOURS=120 # calendar exit (๋ฐฑํ ์คํธ Y=5์ผ) # export POLYBOT_LOOKBACK_DAYS=20 # ๋กค๋ง ์ต์ ๊ฐ ๋ฃฉ๋ฐฑ cd ./golden-nectarine uv sync uv run python ./main.py run