๐Ÿฅญ

golden-mango โ€” Patience Premium

๊ฑฐ์˜ ํ™•์‹คํ•ด์ง„ ๊ณ„์•ฝ์ด ๋งŒ๊ธฐ๊นŒ์ง€ ๋‚จ์€ ๊ธฐ๊ฐ„๋งŒํผ ํ• ์ธ๋˜์–ด ๊ฑฐ๋ž˜๋˜๋Š” 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
1P&L <= -6%stop_loss โ€” ์ˆ˜๋ ด ์‹คํŒจ ์‹ ํ˜ธ, ์ฆ‰์‹œ ์ดํƒˆ
2ํ˜„์žฌ๊ฐ€ >= 0.99take_profit โ€” ์ˆ˜๋ ด ์™„๋ฃŒ (๋ชฉํ‘œ๊ฐ€ 0.99 ์บก ๊ณ ์ •)
3ํ•ด๊ฒฐ๊นŒ์ง€ < 2htime_exit โ€” ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์บ๋ฆฌ ์ˆ˜ํ™• ํ›„ ์ดํƒˆ
โ€”trailing stop์—†์Œ โ€” ์ˆ˜๋ ด ๋ณด์œ ๊ฐ€ ๋ณธ์งˆ, ์กฐ๊ธฐ ์ต์ ˆ ์—†์Œ

take_profit_percent๋Š” env๋กœ ๋‚จ๊ฒจ๋‘๋˜ ๊ธฐ๋ณธ 9.99๋กœ ๋‘์–ด ๋ชฉํ‘œ๊ฐ€ ์บก(0.99)๋งŒ ์ž‘๋™ํ•œ๋‹ค. ์ฆ‰ ์ฝ”๋“œ์ƒ ์ต์ ˆ ์กฐ๊ฑด์€ "0.99 ๋„๋‹ฌ" ํ•˜๋‚˜๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ (ํ™˜๊ฒฝ๋ณ€์ˆ˜)

์šฐ์„ ์ˆœ์œ„: env > config.yaml > ์ฝ”๋“œ ๊ธฐ๋ณธ๊ฐ’

env๊ธฐ๋ณธ์˜๋ฏธ
POLYBOT_YIELD_MIN2.0์—ฐํ™˜์‚ฐ ์บ๋ฆฌ ํ—ˆ๋“ค (2.0 = ์—ฐ 200%)
POLYBOT_PROB_MIN0.85favorite ๊ฐ€๊ฒฉ ํ•˜ํ•œ
POLYBOT_PROB_MAX0.985favorite ๊ฐ€๊ฒฉ ์ƒํ•œ (์Šคํ”„๋ ˆ๋“œ/์ˆ˜์ˆ˜๋ฃŒ ์—ฌ์œ )
POLYBOT_ENTRY_HOURS_MIN6์ž”์—ฌ ์‹œ๊ฐ„ ํ•˜ํ•œ (์ดํ•˜์ด๋ฉด ์ง„์ž… ๊ธˆ์ง€)
POLYBOT_ENTRY_HOURS_MAX336์ž”์—ฌ ์‹œ๊ฐ„ ์ƒํ•œ (14์ผ ์ดˆ๊ณผ ์ง„์ž… ๊ธˆ์ง€)
POLYBOT_MOMENTUM_LOOKBACK_HOURS6๋ชจ๋ฉ˜ํ…€ ๊ฐ€๋“œ ์œˆ๋„์šฐ
POLYBOT_MOMENTUM_MIN_CHANGE-0.02favorite ๋ณ€ํ™” ํ•˜ํ•œ (๋ฏธ๋งŒ์ด๋ฉด ์ง„์ž… ๋ฐฐ์ œ)
POLYBOT_TAKE_PROFIT9.99์‚ฌ์‹ค์ƒ ๋ฏธ์‚ฌ์šฉ โ€” ๋ชฉํ‘œ๊ฐ€ 0.99 ์บก ๊ณ ์ •
POLYBOT_STOP_LOSS-0.06์†์ ˆ %
POLYBOT_EXIT_HOURS2ํ•ด๊ฒฐ N์‹œ๊ฐ„ ์ „ ์ฒญ์‚ฐ
POLYBOT_BUY_AMOUNT5.01ํšŒ ๋งค์ˆ˜ USDC
POLYBOT_MIN_LIQUIDITY20000์ตœ์†Œ ์œ ๋™์„ฑ $
POLYBOT_MIN_VOLUME_24H0์ตœ์†Œ 24h ๊ฑฐ๋ž˜๋Ÿ‰ $ (0 = ๋น„ํ™œ์„ฑ)
POLYBOT_MAX_POSITIONS-1์ตœ๋Œ€ ๋™์‹œ ํฌ์ง€์…˜ (์‹ค์ „์€ ์ œํ•œ ๊ถŒ์žฅ)
POLYBOT_REENTRY_COOLDOWN_HOURS24์žฌ์ง„์ž… ์ฟจ๋‹ค์šด
POLYBOT_HISTORY_BACKFILLtrueprices-history ๋ฐฑํ•„
POLYBOT_EXCLUDED_CATEGORIES""์ œ์™ธ ์นดํ…Œ๊ณ ๋ฆฌ (๋นˆ ๊ฐ’ = ๋น„ํ™œ์„ฑ)
POLYBOT_YES_ONLYfalseYes(index 0) ํ† ํฐ๋งŒ ๋งค์ˆ˜
LOG_LEVELINFO๋กœ๊ทธ ๋ ˆ๋ฒจ

์ด ์ „๋žต์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ

A/B ๊ฒ€์ฆ ๊ณ„ํš

๋ฒ ๋ฆฌ์—์ด์…˜: 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 ํ•ด๊ฒฐ ๊ธฐ์ค€ ๋ชจํ˜ธ์„ฑ ํšŒํ”ผ, ๋ชจ์ˆ˜ ์ ˆ๋ฐ˜ ํฌ๊ธฐ).

์‹คํ–‰ (Jenkins)

#!/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 ์ œํ•œ๊ณผ ์†Œ์•ก ์‚ฌ์ด์ง•์„ ๊ถŒ์žฅํ•œ๋‹ค.