๊ฑฐ์ ํ์คํด์ง ๊ณ์ฝ์ด ๋ง๊ธฐ๊น์ง ๋จ์ ๊ธฐ๊ฐ๋งํผ ํ ์ธ๋์ด ๊ฑฐ๋๋๋ settlement discount๋ฅผ, ์ฐํ์ฐ ์บ๋ฆฌ ์์ต๋ฅ ๋จ์ผ ์์์ผ๋ก ๊ฑธ๋ฌ ์ํํ๋ค.
์ฐํ์ฐ ์บ๋ฆฌ ์์ต๋ฅ y = ((1 - p) / p) ร (8760 / hours_left) ์ง์ โ y >= y_min (๊ธฐ๋ณธ y_min = 2.0 = ์ฐ 200%) # p์ ์ฌ์ ๋ง๊ธฐ์ 1.00์ ๋ฐ์ผ๋ฉด ์์ต๋ฅ = (1-p)/p โ ์ด๋ฅผ ์์ฌ ์๊ฐ์ผ๋ก ์ฐํ์ฐํ ๊ฐ์ด y
์ด ์ ๋ต์ ๊ธฐ์กด ๊ณจ๋ ์๋ฆฌ์ฆ(apple/banana/cherry ๋ฐ date~lime)์ ๋ด๋ถ ์์ด๋์ด์ ๋ ๋ฆฝ์ ์ผ๋ก, ๊ณต๊ฐ ํ์ ๋ฌธํ๊ณผ ์ค์ฆ ์ฐ๊ตฌ์์ ๋์ถ๋์๋ค. ํต์ฌ ๊ทผ๊ฑฐ๋ arXiv 2605.31431 "When Certainty Is Not Worth It: Capital Lock-Up and Settlement Discounting in Prediction Markets"๋ค. ์ด ์ฐ๊ตฌ๋ ์์ธก์์ฅ ๊ฐ๊ฒฉ์ ๊ธฐ๊ฐ๊ตฌ์กฐ๋ฅผ ์ค์ธกํด, ๋ง๊ธฐ๊น์ง ์๋ณธ์ด ์ ๊ธฐ๋ ๊ธฐ๊ฐ์ ๋น๋กํ๋ settlement discount๊ฐ ์ฒด๊ณ์ ์ผ๋ก ์กด์ฌํจ์ ๋ณด์๋ค. ASW(๊ธฐ๊ฐ๊ตฌ์กฐ) ํ ์ธ์ ๋ณด์ ํ๋ฉด ๊ทผํ์ค(near-certain) ๊ตฌ๊ฐ์ ๊ฐ๊ฒฉ ์๊ณก์ด 48~88% ์๊ฑฐ๋๋ค. ์ฆ 0.95์ง๋ฆฌ "๊ฑฐ์ ํ์ค" ๊ณ์ฝ์ด 0.95์ธ ์ด์ ์ ์ ๋ฐ ์ด์์ด "ํ๋ฅ ์ด 95%๋ผ์"๊ฐ ์๋๋ผ "๋์ด ๋ฌถ์ฌ์"๋ค. ๊ทธ ํ ์ธ์ด ๊ณง ์ด ์ ๋ต์ด ์ฌ๋ ๋ฌผ๊ฑด์ด๋ค.
์ด ์๊ณก์ ๊ตฌ์กฐ์ ์ผ๋ก ์ง์๋๋ค. arXiv 2602.21091 "Can Interest-Bearing Positions Solve the Long-Horizon Problem in Prediction Markets?"๋ ๋ด๋ณด์ ์ด์๊ฐ ๋ถ์ง ์๋ ์์ธก์์ฅ ๊ตฌ์กฐ๊ฐ ์ฅ๊ธฐ ๊ณ์ฝ ๊ฐ๊ฒฉ์ ๊ตฌ์กฐ์ ์ผ๋ก ์๊ณกํจ์ ์ด๋ก ํํ๋ค. Polymarket์ USDC ๋ด๋ณด๋ ๋ฌด์ด์์ด๋ฏ๋ก ์ด ์๊ณก์ด ๊ทธ๋๋ก ์กด์ฌํ๊ณ , ์์ฅ์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ ๊น์ง ์บ๋ฆฌ๋ ๊ตฌ์กฐ์ ์ผ๋ก ์ง์๋๋ค. ๊ณ ์ ์ ๊ทผ๊ฑฐ๋ก๋ "The cost of capital in a prediction market" (International Journal of Forecasting)์ด ์์ธก์์ฅ ๊ฐ๊ฒฉ์ ์๋ณธ๋น์ฉ์ด ๋ฐ์๋์ด ์์์ ์ด๋ฏธ ๋ณด์๋ค.
๋ฐฉํฅ์ ์ค์ฆ๋ ์๋ค. CEPR VoxEU "The economics of the Kalshi prediction market"๋ Kalshi ์ค์ฆ์์ ๊ณ ๊ฐ(๊ณ ํ๋ฅ ) ๊ณ์ฝ์ด ์(+)์ ์ด๊ณผ์์ต์ ๋ณด์์์ ํ์ธํ๋ค โ favorite-longshot bias์ favorite ์ชฝ์ด๋ค. ๋์ค์ ๋กฑ์ท์ ๋ณต๊ถ ์ฌ๋ฆฌ๋ก ๊ณผ์ง๋ถํ๊ณ favorite์ ๊ณผ์ํ๊ฐํ๋ฉฐ, ์บ๋ฆฌ ๋งค์๋ ์ด ํธํฅ์ ์ํ ๋ฐฉํฅ๊ณผ ์ ํํ ์ผ์นํ๋ค. arXiv 2602.19520 "Decomposing Crowd Wisdom" (Kalshi+Polymarket 2.92์ต ๊ฑฐ๋ ๋ถ์)์ ๊ฐ๊ฒฉ ๊ตฌ๊ฐ๋ณ ์์ต ๊ตฌ์กฐ๊ฐ ์ฒด๊ณ์ ์ผ๋ก ๋ค๋ฆ์ ํ์ธํ ๋ณด์กฐ ๊ทผ๊ฑฐ๋ค.
์์ฝํ๋ฉด "ํ๋ฅ ์ด ํ๋ ธ๋ค"์ ๋ฒ ํ
ํ๋ ๊ฒ์ด ์๋๋ผ, "๋์ค์ ์กฐ๊ธํจ์ด ๋ง๋ ํ ์ธ"์ ๋ด์ ๋ฌดํํ ์ธ๋ด๋ก ์ฌ๋ค์ด๋ ์ ๋ต์ด๋ค โ ๋ด์ ์๋ณธ ์ ๊น์ ์ฌ๋ฆฌ์ ์ผ๋ก ๊ดด๋ก์ํ์ง ์๋๋ค. cherry(Resolution Momentum)ยทdate(Conviction Ladder)๋ ๊ณ ํ๋ฅ favorite์ ์ฌ์ง๋ง ์ฌ๋ฆฌ์ ํ์ด๋ฐ์ด ์ง์
๋
ผ๋ฆฌ์ธ ๋ฐ๋ฉด, mango์ ์ง์
ํ๋จ์ ์์ต๋ฅ ํ๋ค ๋จ์ผ ์์์ด๋ค. ์๊ฐ๊ณผ ํ๋ฅ ์ ๊ฐ๊ฐ ์กฐ๊ฑด์ผ๋ก ๋์ง ์๊ณ y = ((1-p)/p) ร (8760/h) ํ๋๋ก ํ์ฐํด ๋น๊ตํ๋ฏ๋ก, ์์ฅ์ด ์ค์ค๋ก ์ง์
frontier๋ฅผ ํ์ฑํ๋ค: ๊ฐ์ 0.98์ด๋ผ๋ 24h ๋จ์ผ๋ฉด y=7.45๋ก ์ง์
ํ๊ณ , 336h ๋จ์ผ๋ฉด y=0.53์ผ๋ก ๊ฑธ๋ฌ์ง๋ค. ์์์ด ํญ์ ๊ณ์ฐ ๊ฐ๋ฅํด banana์ ๊ณจ๋ ํฌ๋ก์ค์ฒ๋ผ ๋๋ฌ ๋ถ๊ฐ๋ฅํ threshold๋ก ํดํํ ์ฌ์ง๊ฐ ์๋ค. ์ฒญ์ฐ๋ ๋ค๋ฅด๋ค โ ์กฐ๊ธฐ ์ต์ (trailing/์์ TP) ์์ด 0.99 ์๋ ด๊น์ง ๋ณด์ ํ๋ค. ์บ๋ฆฌ๋ ๋ง๊ธฐ ์๋ ด์ด ์์ต์ ์์ฒ์ด๋ฏ๋ก ์ค๊ฐ์ ํ๋ ๊ฒ์ ์ ๋ต ๋ถ์ ์ด๋ค.
| ์กฐ๊ฑด | ๊ฐ (๊ธฐ๋ณธ) | ์ด์ |
|---|---|---|
| ์ ๋์ฑ | liquidity >= $20,000 | ์ฌ๋ฆฌํผ์งยท์ฒด๊ฒฐ ๊ฐ๋ฅ์ฑ ํ๋ณด |
| ๋ฐฉํฅ | favorite ํ ํฐ (YES/NO ์ค ๋์ ์ชฝ, --yes-only ์ง์) | favorite-longshot bias์ favorite ์ชฝ ์ํ |
| ํ๋ฅ ๋ฐด๋ | p โ [0.85, 0.985] | ๊ทผํ์ค ๊ตฌ๊ฐ๋ง. ์ํ์ ์คํ๋ ๋/์์๋ฃ ์ฌ์ |
| ์๊ฐ ์ฐฝ | 6h < hours_left <= 336h (14์ผ) | ์บ๋ฆฌ๋ฅผ ๊ณ์ฐยท์ํํ ์ ์๋ ์์ฌ ์๊ฐ ๋ฒ์ |
| ์์ต๋ฅ ํ๋ค | y >= 2.0 | ์ฐ 200% ์ด์ ์บ๋ฆฌ๋ง โ ๊ฐ๊ฒฉ ๋๋น ๋จ์ ์๊ฐ์ด ์์ง ๋ง๋ ์์ฅ๋ง ์๋ ์ ๋ณ |
| ๋ชจ๋ฉํ ๊ฐ๋ | ์ต๊ทผ 6h favorite ๋ณํ >= -0.02 | ๊ธ๋ฝ์ ์ ์ ๋ณด(์ค๋ผํด ๋ถ์, ๋ฐ์ ๋ด์ค)์ ์ ํธ์ผ ์ ์์ โ ๋จ์ด์ง๋ favorite์ ์ฌ์ง ์๋๋ค |
| ๋ฐ์ดํฐ ์ ํจ์ฑ | 6h ์๋์ฐ invalid โ ๋ฐฑํ ์๋ โ ๊ทธ๋๋ invalid๋ฉด ์ง์ ๊ธ์ง | ๊ด๋ํ ํด๋ฐฑ ๊ธ์ง (banana์ ์๋์ฐ ๋ฒ๊ทธ ๊ตํ) |
| ์ฌ์ง์ | HOLDING ์์ + ๋ง์ง๋ง ๋งค๋/skip ํ 24h ๊ฒฝ๊ณผ | ์๊ตฌ one-shot ๊ธ์ง, ์ฟจ๋ค์ด ๊ธฐ๋ฐ ์ฌ์ง์ |
์บ๋ฆฌ ์ํ์ "๊ฐ๊ฒฉ์ด ๊ทธ๋๋ก ๋ง๊ธฐ์ ์๋ ดํ๋ค"๊ฐ ์ ์ ์ด๋ฏ๋ก, ๋ชจ๋ฉํ ๊ฐ๋๊ฐ ๊ธ๋ฝ ์ค ์ง์ ์ ์ฐจ๋จํ๋ค.
| ์ฐ์ ์์ | ์กฐ๊ฑด | exit_reason |
|---|---|---|
| 1 | P&L <= -6% | stop_loss โ ์๋ ด ์คํจ ์ ํธ, ์ฆ์ ์ดํ |
| 2 | ํ์ฌ๊ฐ >= 0.99 | take_profit โ ์๋ ด ์๋ฃ (๋ชฉํ๊ฐ 0.99 ์บก ๊ณ ์ ) |
| 3 | ํด๊ฒฐ๊น์ง < 2h | time_exit โ ๋ง์ง๋ง๊น์ง ์บ๋ฆฌ ์ํ ํ ์ดํ |
| โ | trailing stop | ์์ โ ์๋ ด ๋ณด์ ๊ฐ ๋ณธ์ง, ์กฐ๊ธฐ ์ต์ ์์ |
take_profit_percent๋ env๋ก ๋จ๊ฒจ๋๋ ๊ธฐ๋ณธ 9.99๋ก ๋์ด ๋ชฉํ๊ฐ ์บก(0.99)๋ง ์๋ํ๋ค. ์ฆ ์ฝ๋์ ์ต์ ์กฐ๊ฑด์ "0.99 ๋๋ฌ" ํ๋๋ค.
์ฐ์ ์์: env > config.yaml > ์ฝ๋ ๊ธฐ๋ณธ๊ฐ
| env | ๊ธฐ๋ณธ | ์๋ฏธ |
|---|---|---|
POLYBOT_YIELD_MIN | 2.0 | ์ฐํ์ฐ ์บ๋ฆฌ ํ๋ค (2.0 = ์ฐ 200%) |
POLYBOT_PROB_MIN | 0.85 | favorite ๊ฐ๊ฒฉ ํํ |
POLYBOT_PROB_MAX | 0.985 | favorite ๊ฐ๊ฒฉ ์ํ (์คํ๋ ๋/์์๋ฃ ์ฌ์ ) |
POLYBOT_ENTRY_HOURS_MIN | 6 | ์์ฌ ์๊ฐ ํํ (์ดํ์ด๋ฉด ์ง์ ๊ธ์ง) |
POLYBOT_ENTRY_HOURS_MAX | 336 | ์์ฌ ์๊ฐ ์ํ (14์ผ ์ด๊ณผ ์ง์ ๊ธ์ง) |
POLYBOT_MOMENTUM_LOOKBACK_HOURS | 6 | ๋ชจ๋ฉํ ๊ฐ๋ ์๋์ฐ |
POLYBOT_MOMENTUM_MIN_CHANGE | -0.02 | favorite ๋ณํ ํํ (๋ฏธ๋ง์ด๋ฉด ์ง์ ๋ฐฐ์ ) |
POLYBOT_TAKE_PROFIT | 9.99 | ์ฌ์ค์ ๋ฏธ์ฌ์ฉ โ ๋ชฉํ๊ฐ 0.99 ์บก ๊ณ ์ |
POLYBOT_STOP_LOSS | -0.06 | ์์ % |
POLYBOT_EXIT_HOURS | 2 | ํด๊ฒฐ N์๊ฐ ์ ์ฒญ์ฐ |
POLYBOT_BUY_AMOUNT | 5.0 | 1ํ ๋งค์ USDC |
POLYBOT_MIN_LIQUIDITY | 20000 | ์ต์ ์ ๋์ฑ $ |
POLYBOT_MIN_VOLUME_24H | 0 | ์ต์ 24h ๊ฑฐ๋๋ $ (0 = ๋นํ์ฑ) |
POLYBOT_MAX_POSITIONS | -1 | ์ต๋ ๋์ ํฌ์ง์ (์ค์ ์ ์ ํ ๊ถ์ฅ) |
POLYBOT_REENTRY_COOLDOWN_HOURS | 24 | ์ฌ์ง์ ์ฟจ๋ค์ด |
POLYBOT_HISTORY_BACKFILL | true | prices-history ๋ฐฑํ |
POLYBOT_EXCLUDED_CATEGORIES | "" | ์ ์ธ ์นดํ ๊ณ ๋ฆฌ (๋น ๊ฐ = ๋นํ์ฑ) |
POLYBOT_YES_ONLY | false | Yes(index 0) ํ ํฐ๋ง ๋งค์ |
LOG_LEVEL | INFO | ๋ก๊ทธ ๋ ๋ฒจ |
POLYBOT_MAX_POSITIONS๋ฅผ ์ ํํ๊ฒ ์ค์ ํ๊ณ ํฌํธํด๋ฆฌ์ค ๋๋น ๊ฑด๋น ์์ก ์ฌ์ด์ง์ ์ ์งํ๋ ๊ฒ โ ๋ฌด์ ํ ํฌ์ง์
+ ํฐ ์ฌ์ด์ง์ ์ด ์ ๋ต์์ ์๋ฉธ์ด๋ค. SL -6%๋ ๋ถ์์ด ๊ฐ๊ฒฉ์ ๋ฐ์๋๊ธฐ ์์ํ๋ฉด ์ดํํ๊ฒ ํด์ฃผ์ง๋ง, ๊ฐญ ํ๋ฝ(ํ ๋ฒ์ 0.9โ0.1)์ ๋ง์ง ๋ชปํ๋ค.uv run python main.py run --simulate --job sim์ Jenkins 3~5๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์คํ. data/sim/trades_sim.db + ์๋ณ CSV๋ก ๊ฒํ .POLYBOT_BUY_AMOUNT=5(๊ธฐ๋ณธ), POLYBOT_MAX_POSITIONS=10 ๊ถ์ฅ.stop_loss ๋น์ค <= 15%, resolved_unredeemed(EXPIRED) 0๊ฑด ์ ์ง ยท ๊ฑด๋น ํ๊ท ์์ต > 0 ์ด๊ณ ์ต์
๊ฑฐ๋ ์์ค์ด ํ๊ท ์์ต์ 20๋ฐฐ ์ด๋ด ยท carry_yield_at_buy ๊ตฌ๊ฐ๋ณ(2~4 / 4~8 / 8+) ์ฑ๊ณผ ๋น๊ต โ y_min ์กฐ์ ๊ทผ๊ฑฐ.strategy_name/mode๊ฐ ๊ธฐ๋ก๋๋ฏ๋ก cherry/date์ UNION ์ฟผ๋ฆฌ๋ก ๊ฐ์ ๊ธฐ๊ฐ ๊ณ ํ๋ฅ ๊ตฌ๊ฐ ์ฑ๊ณผ๋ฅผ ์ง์ ๋น๊ตํ ์ ์๋ค.๋ฒ ๋ฆฌ์์ด์
: A-1 ๋ณด์(POLYBOT_YIELD_MIN=4.0, POLYBOT_PROB_MIN=0.90, POLYBOT_MAX_POSITIONS=5 โ ์ง์ง ์ผ ์บ๋ฆฌ๋ง), A-2 ๋จ๊ธฐ ์ง์ค(POLYBOT_ENTRY_HOURS_MAX=72 โ ์ค๋ผํด ๋ถ์ ๋
ธ์ถ ์๊ฐ ์ถ์), A-3 YES ํ์ (--yes-only โ NO-favorite ํด๊ฒฐ ๊ธฐ์ค ๋ชจํธ์ฑ ํํผ, ๋ชจ์ ์ ๋ฐ ํฌ๊ธฐ).
#!/bin/bash export POLYBOT_BUY_AMOUNT=1000 export POLYMARKET_PRIVATE_KEY=<Jenkins credential> export POLYMARKET_FUNDER_ADDRESS=<Jenkins credential> export LOG_LEVEL=INFO # ์ ๋ต ์ฃผ์ env ์์ export POLYBOT_YIELD_MIN=2.0 export POLYBOT_MAX_POSITIONS=10 export POLYBOT_REENTRY_COOLDOWN_HOURS=24 cd ./golden-mango uv sync uv run python ./main.py run
job๋ณ DB/๋ก๊ทธ ๋ถ๋ฆฌ๋ --job <์ด๋ฆ>, YES ํ ํฐ๋ง ๋งค์๋ --yes-only. UMA ์ค๋ผํด ๋ฆฌ์คํฌ ๋๋ฌธ์ ์ค์ ์์๋ POLYBOT_MAX_POSITIONS ์ ํ๊ณผ ์์ก ์ฌ์ด์ง์ ๊ถ์ฅํ๋ค.