๐ŸŠ

golden-orange โ€” Fear Spike Fade

ํ‰์‹œ ํ™•๋ฅ  15% ์ดํ•˜์˜ tail ์‹œ์žฅ์ด ๋ฌด์„œ์šด ํ—ค๋“œ๋ผ์ธ์— +10%p ์ด์ƒ ๊ธ‰๋“ฑํ•œ ๋’ค ์ŠคํŒŒ์ดํฌ๊ฐ€ ๋ฉˆ์ถ”๋ฉด NO๋ฅผ ๋งค์ˆ˜ํ•ด, ๊ณตํฌ๊ฐ€ ๋งŒ๋“  ํ”„๋ฆฌ๋ฏธ์—„์ด ๊ฐ์‡ (YES ๋˜๋Œ๋ฆผ)ํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜ํ™•ํ•œ๋‹ค.

์œ ํ˜• ํŽ˜์ด๋“œ (์—ญํ–‰)์ƒํƒœ ์‹ ๊ทœ ยท ๊ฒ€์ฆ ๋Œ€๊ธฐํ•ต์‹ฌ ํŽธํ–ฅ probability neglect

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

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
2retrace ์ต์ ˆ (์ฃผ ์ฒญ์‚ฐ) โ€” ์Šค๋ƒ…์ƒท ์ตœ์‹  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_DAYS7base ๊ณ„์‚ฐ ์œˆ๋„์šฐ (์ผ)
POLYBOT_BASE_EXCLUDE_RECENT_HOURS6base ๊ณ„์‚ฐ์—์„œ ์ œ์™ธํ•  ์ตœ๊ทผ ์‹œ๊ฐ„
POLYBOT_BASE_MAX0.15base ์ƒํ•œ (ํ‰์‹œ tail ์‹œ์žฅ๋งŒ)
POLYBOT_JUMP_MIN0.10์ŠคํŒŒ์ดํฌ ์ตœ์†Œ ์ƒ์Šนํญ (yes_now - base)
POLYBOT_YES_MAX0.30์ŠคํŒŒ์ดํฌ ํ›„ YES ์ƒํ•œ
POLYBOT_SPIKE_WAIT_MINUTES90์ŠคํŒŒ์ดํฌ ์‹œ์ž‘ ํ›„ ๋Œ€๊ธฐ (๋ถ„)
POLYBOT_STALL_WINDOW_MINUTES45์‹ ๊ณ ๊ฐ€ ๋ถ€์žฌ ํ™•์ธ ์œˆ๋„์šฐ (๋ถ„)
POLYBOT_VOL_MULT_MIN2.0๊ฑฐ๋ž˜๋Ÿ‰ ํ™•์ธ ๋ฐฐ์ˆ˜
POLYBOT_RETRACE_RATIO0.5retrace ์ต์ ˆ ๋น„์œจ
POLYBOT_ENTRY_HOURS_MIN72์ง„์ž… ์ตœ์†Œ ์ž”์—ฌ ์‹œ๊ฐ„
POLYBOT_MAX_HOLDING_HOURS72์ตœ๋Œ€ ๋ณด์œ  ์‹œ๊ฐ„
POLYBOT_EXIT_HOURS24ํ•ด๊ฒฐ ์ „ ์ฒญ์‚ฐ ์‹œ๊ฐ„
POLYBOT_TAKE_PROFIT0.08๋ณด์กฐ ์ต์ ˆ %
POLYBOT_STOP_LOSS-0.10์†์ ˆ %
POLYBOT_MIN_LIQUIDITY15000์ตœ์†Œ ์œ ๋™์„ฑ $
๊ณตํ†ตโ€”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)

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

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

๋ฒ ๋ฆฌ์—์ด์…˜: 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 ์ฒญ์‚ฐ ๋น„์ค‘ ์ฆ๊ฐ€ ๋ฆฌ์Šคํฌ).

์‹คํ–‰ (Jenkins)

#!/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