๐Ÿ‘

golden-nectarine โ€” Bottom Fisher

์žฅ๊ธฐ(30์ผ+) tail~์ค‘๊ฐ„ ๊ตฌ๊ฐ„ ์‹œ์žฅ์—์„œ YES ๊ฐ€๊ฒฉ์ด 20์ผ ๋กค๋ง ์ตœ์ €๊ฐ€ ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋ฉด ๋งค์ˆ˜ํ•˜๊ณ , ๋ณด์œ  120์‹œ๊ฐ„(5์ผ)์ด ์ง€๋‚˜๋ฉด ์†์ต๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ฌด์กฐ๊ฑด ์ฒญ์‚ฐํ•œ๋‹ค.

์œ ํ˜• ์—ญํ–‰ (ํ‰๊ท  ํšŒ๊ท€)์ƒํƒœ ์‹ ๊ทœ ยท ๊ฒ€์ฆ ๋Œ€๊ธฐํ•ต์‹ฌ ํŽธํ–ฅ ์†์‹ค ํšŒํ”ผ (loss aversion)

ํ•ต์‹ฌ ์ˆ˜์‹

์ง„์ž… โ‡” 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 ๋ณต์ œ)
2P&L <= -30%stop_loss โ€” ์•ˆ์ „ํŒ (๋ฐฑํ…Œ์ŠคํŠธ์— ์—†๋Š” ๋ฐฉ์–ด ์žฅ์น˜)
3P&L >= +30% (๋ชฉํ‘œ๊ฐ€ 0.99 ์บก)take_profit โ€” ์กฐ๊ธฐ ํ–‰์šด ์ต์ ˆ ์•ˆ์ „ํŒ
4ํ•ด๊ฒฐ๊นŒ์ง€ < 24htime_exit โ€” 30์ผ+ ์ง„์ž…์ด๋ผ ๋“œ๋ฌธ ๊ฒฝ๋กœ
โ€”midpoint ์กฐํšŒ ๋ถˆ๊ฐ€ + ํ•ด๊ฒฐ 24h ๊ฒฝ๊ณผresolved_unredeemed (EXPIRED) โ€” ์ˆ˜๋™ redeem ํ•„์š”

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

env๊ธฐ๋ณธ๊ฐ’์˜๋ฏธ
POLYBOT_LOOKBACK_DAYS20๋กค๋ง ์ตœ์ €๊ฐ€ ๋ฃฉ๋ฐฑ (๋ฐฑํ…Œ์ŠคํŠธ X)
POLYBOT_EXCLUDE_RECENT_HOURS24์ตœ์ €๊ฐ€ ์‚ฐ์ถœ ์‹œ ์ œ์™ธํ•  ์ตœ๊ทผ ๊ตฌ๊ฐ„
POLYBOT_HOLD_HOURS120calendar exit ๋ณด์œ  ์‹œ๊ฐ„ (๋ฐฑํ…Œ์ŠคํŠธ Y=5์ผ)
POLYBOT_PROB_MIN0.03์ง„์ž… YES ๊ฐ€๊ฒฉ ํ•˜ํ•œ
POLYBOT_PROB_MAX0.50์ง„์ž… YES ๊ฐ€๊ฒฉ ์ƒํ•œ
POLYBOT_ENTRY_HOURS_MIN720ํ•ด๊ฒฐ๊นŒ์ง€ ์ตœ์†Œ ์‹œ๊ฐ„ (30์ผ)
POLYBOT_EXIT_HOURS24ํ•ด๊ฒฐ ์ž„๋ฐ• ์ฒญ์‚ฐ
POLYBOT_REENTRY_COOLDOWN_HOURS168์žฌ์ง„์ž… ์ฟจ๋‹ค์šด (7์ผ)
POLYBOT_TAKE_PROFIT0.30์ต์ ˆ ์•ˆ์ „ํŒ
POLYBOT_STOP_LOSS-0.30์†์ ˆ ์•ˆ์ „ํŒ
POLYBOT_BUY_AMOUNT5.01ํšŒ ๋งค์ˆ˜ USDC
POLYBOT_MIN_LIQUIDITY10000์ตœ์†Œ ์œ ๋™์„ฑ $
POLYBOT_MIN_VOLUME_24H0์ตœ์†Œ 24h ๊ฑฐ๋ž˜๋Ÿ‰ (0 = ๋น„ํ™œ์„ฑ โ€” ์–‡์€ ์‹œ์žฅ์ด ๋Œ€์ƒ)
POLYBOT_MAX_POSITIONS-1์ตœ๋Œ€ ๋™์‹œ ํฌ์ง€์…˜
POLYBOT_HISTORY_BACKFILLtrueprices-history ๋ฐฑํ•„ (๋„๋ฉด ์‚ฌ์‹ค์ƒ ๋ฌด์ „๋žต)
POLYBOT_EXCLUDED_CATEGORIES""์ œ์™ธ ์นดํ…Œ๊ณ ๋ฆฌ (๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ)
LOG_LEVELINFO๋กœ๊ทธ ๋ ˆ๋ฒจ

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

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

๋ฒ ๋ฆฌ์—์ด์…˜: 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 โ€” ์˜ค๋ฒ„์ŠˆํŠธ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ตฌ๊ฐ„๋งŒ).

์‹คํ–‰ (Jenkins)

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