๐ŸŒด

golden-date โ€” Conviction Ladder

"ํ•ด๊ฒฐ์ด ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๋น„์‹ธ๊ฒŒ, ๋ฉ€์ˆ˜๋ก ์‹ธ๊ฒŒ๋งŒ favorite์„ ์‚ฐ๋‹ค" โ€” ์ž”์—ฌ ์‹œ๊ฐ„์— ๋น„๋ก€ํ•œ 3๋‹จ ํ™•๋ฅ  ๋ฐด๋“œ(์‚ฌ๋‹ค๋ฆฌ)๋กœ ์‚ฌ์ „ ํ•ด๊ฒฐ ์ˆ˜๋ ด(pre-resolution convergence)์„ ์ˆ˜ํ™•ํ•œ๋‹ค.

์œ ํ˜• ์ˆ˜๋ ด ํŽธ์Šน์ƒํƒœ ์‹ ๊ทœ ยท ๊ฒ€์ฆ ๋Œ€๊ธฐํ•ต์‹ฌ ํŽธํ–ฅ ํ™•์ฆ ํŽธํ–ฅ + favorite-longshot bias

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

favorite = YES/NO ์ค‘ ํ™•๋ฅ  ๋†’์€ ์ชฝ,  p = favorite ๊ฐ€๊ฒฉ,  h = ํ•ด๊ฒฐ๊นŒ์ง€ ์ž”์—ฌ ์‹œ๊ฐ„

BUY if (  6 < h โ‰ค  24 AND 0.80 โ‰ค p โ‰ค 0.95)   # ๋ฐด๋“œ1
    or ( 24 < h โ‰ค  72 AND 0.75 โ‰ค p โ‰ค 0.92)   # ๋ฐด๋“œ2
    or ( 72 < h โ‰ค 168 AND 0.70 โ‰ค p โ‰ค 0.88)   # ๋ฐด๋“œ3
   AND ฮ”p(์ตœ๊ทผ 6h) โ‰ฅ -0.01                     # ๋ชจ๋ฉ˜ํ…€ ๊ฒŒ์ดํŠธ: ํ•˜๋ฝ ์ถ”์„ธ ์•„๋‹˜

์™œ ์ด ์ „๋žต์ธ๊ฐ€

Favorite-longshot bias. ์˜ˆ์ธก์‹œ์žฅ ์ฐธ๊ฐ€์ž๋Š” ๋ณต๊ถŒ์„ฑ longshot์„ ๊ณผ๋Œ€ํ‰๊ฐ€ํ•˜๊ณ  favorite์„ ๊ณผ์†Œํ‰๊ฐ€ํ•œ๋‹ค. 70~95% ๊ตฌ๊ฐ„์˜ favorite์€ ์‹คํ˜„ ํ™•๋ฅ  ๋Œ€๋น„ ๊ตฌ์กฐ์ ์œผ๋กœ ์ €ํ‰๊ฐ€๋˜์–ด ์žˆ์–ด favorite ๋งค์ˆ˜๋Š” +EV๋‹ค.

์‚ฌ์ „ ํ•ด๊ฒฐ ์ˆ˜๋ ด. ํ•ด๊ฒฐ์ด ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก ๋ถˆํ™•์‹ค์„ฑ์ด ์‚ฌ๋ผ์ง€๋ฉฐ ๊ฐ€๊ฒฉ์ด 1.0์œผ๋กœ ์ˆ˜๋ ดํ•œ๋‹ค. cherry๊ฐ€ ์ธ์šฉํ•œ Dune Analytics ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅด๋ฉด ํ•ด๊ฒฐ 24h ์ „ ์ •ํ™•๋„ 88.6% โ†’ 4h ์ „ 94.2%. ์ด ๋งˆ์ง€๋ง‰ ์ˆ˜๋ ด ๊ตฌ๊ฐ„์˜ "์‹œ๊ฐ„๊ฐ€์น˜ ์†Œ๋ฉธ"์ด ์ˆ˜์ต ์›์ฒœ์ด๋‹ค.

์‹œ๊ฐ„-ํ™•์‹  ๋น„๋ก€. ์ž”์—ฌ ์‹œ๊ฐ„์ด ๊ธธ์ˆ˜๋ก ๋ฐ˜์ „ ๋ฆฌ์Šคํฌ๊ฐ€ ํฌ๋‹ค. ๊ฐ™์€ 0.93์งœ๋ฆฌ favorite์ด๋ผ๋„ ํ•˜๋ฃจ ๋’ค ํ•ด๊ฒฐ๊ณผ ์ผ์ฃผ์ผ ๋’ค ํ•ด๊ฒฐ์€ ๊ธฐ๋Œ€๊ฐ’์ด ๋‹ค๋ฅด๋‹ค โ€” ๊ทธ๋Ÿฐ๋ฐ cherry๋Š” ๊ฐ™์€ ๋ฐด๋“œ๋กœ ๊ฐ™์€ ๊ฐ€๊ฒฉ์„ ์ง€๋ถˆํ–ˆ๋‹ค. date๋Š” ์ด๋ฅผ ์‹œ๊ฐ„ ์‚ฌ๋‹ค๋ฆฌ๋กœ ๊ต์ •ํ•œ cherry ๊ณ ๋„ํ™” ์ „๋žต์ด๋‹ค.

cherry์—์„œ ๋ฐฐ์šด ๊ฒƒ โ€” ์ˆ˜์ •ํ•œ 5๊ฐ€์ง€ ํ—ˆ์ :

#cherry ํ—ˆ์ date์˜ ์ˆ˜์ •
โ‘ ์ž”์—ฌ ์‹œ๊ฐ„๊ณผ ๋ฌด๊ด€ํ•œ ๊ณ ์ • ํ™•๋ฅ  ๋ฐด๋“œ (30์ผ ๋‚จ์€ 0.92๋„ ๋งค์ˆ˜)์‹œ๊ฐ„ ์‚ฌ๋‹ค๋ฆฌ: ๋ฉ€์ˆ˜๋ก ๋‚ฎ์€ ๋ฐด๋“œ๋งŒ ํ—ˆ์šฉ
โ‘ก--yes-only ์šด์˜์œผ๋กœ NO-favorite ์‹œ์žฅ ์ ˆ๋ฐ˜์„ ๋ฒ„๋ฆผ๊ธฐ๋ณธ์€ favorite side ์ž๋™ ์„ ํƒ (YES/NO ์ค‘ ๋†’์€ ์ชฝ). --yes-only๋Š” A/B์šฉ ์˜ต์…˜์œผ๋กœ ์œ ์ง€
โ‘ขํ•˜๋ฝ ์ค‘์ธ favorite๋„ ๋งค์ˆ˜ (๋–จ์–ด์ง€๋Š” ์นผ๋‚ )๋ชจ๋ฉ˜ํ…€ ๊ฒŒ์ดํŠธ: ์ตœ๊ทผ 6h favorite ๋ณ€ํ™” โ‰ฅ -0.01 ์ด์–ด์•ผ ์ง„์ž…
โ‘ฃrapid_jump ์˜๊ตฌ skip (๊ธฐํšŒ ์˜๊ตฌ ์ƒ์‹ค)skip ๊ธฐ๋ก์— timestamp๋ฅผ ๋‘๊ณ  24h ์ฟจ๋‹ค์šด ํ›„ ์žฌํ‰๊ฐ€
โ‘คํ•ด๊ฒฐ 12h ์ „ ์ฒญ์‚ฐ โ†’ ์ •ํ™•๋„๊ฐ€ ๊ฐ€์žฅ ์˜ฌ๋ผ๊ฐ€๋Š” ๋งˆ์ง€๋ง‰ ์ˆ˜๋ ด ๊ตฌ๊ฐ„ ํฌ๊ธฐtime exit์„ ํ•ด๊ฒฐ 2h ์ „์œผ๋กœ ์—ฐ์žฅ

banana์—์„œ ๋ฐฐ์šด ๊ฒƒ. ๊ฐœ์ˆ˜ ๊ธฐ๋ฐ˜ ์Šค๋ƒ…์ƒท ์œˆ๋„์šฐ๋Š” Jenkins ์ค‘๋‹จ ์‹œ "15๋ถ„ ์œˆ๋„์šฐ"๊ฐ€ ๋ช‡ ์‹œ๊ฐ„์„ ์ปค๋ฒ„ํ•˜๋Š” ๋ฒ„๊ทธ โ†’ timestamp ๊ธฐ๋ฐ˜ ์œˆ๋„์šฐ + ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒ€์ฆ์œผ๋กœ ์ˆ˜์ •. cold-start ์‹œ ๊ด€๋Œ€ํ•œ ํด๋ฐฑ์ด ์‚ฌ์‹ค์ƒ ๋ฌด์ „๋žต ํ‡ดํ™”๋กœ ์ด์–ด์ง€๋˜ ๋ฌธ์ œ๋Š” ์œˆ๋„์šฐ invalid๋ฉด ์ง„์ž…ํ•˜์ง€ ์•Š๋Š” ์›์น™์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , ๋Œ€์‹  CLOB prices-history ๋ฐฑํ•„๋กœ cold start ์ž์ฒด๋ฅผ ์ค„์ธ๋‹ค.

์ง„์ž… ๊ทœ์น™

์กฐ๊ฑด๊ฐ’ (๊ธฐ๋ณธ)์ด์œ 
์œ ๋™์„ฑ / 24h ๊ฑฐ๋ž˜๋Ÿ‰liquidity โ‰ฅ $15,000 AND volume24hr โ‰ฅ $5,000์ฒด๊ฒฐ ๊ฐ€๋Šฅ์„ฑ ํ™•๋ณด, ์ €์œ ๋™์„ฑ์˜ ๊ฐ€์งœ ๊ฐ€๊ฒฉ ๋ฐฐ์ œ
favorite side ์„ ํƒYES/NO ์ค‘ ํ™•๋ฅ  ๋†’์€ ์ชฝ (--yes-only ์‹œ index 0๋งŒ)NO-favorite ์‹œ์žฅ ์ ˆ๋ฐ˜์„ ๋ฒ„๋ฆฌ์ง€ ์•Š๋Š”๋‹ค (cherry ํ—ˆ์  โ‘ก)
์‹œ๊ฐ„ ์‚ฌ๋‹ค๋ฆฌ (์ž”์—ฌ h, favorite ๊ฐ€๊ฒฉ p)6 < h โ‰ค 24: p โˆˆ [0.80, 0.95] / 24 < h โ‰ค 72: p โˆˆ [0.75, 0.92] / 72 < h โ‰ค 168: p โˆˆ [0.70, 0.88] (์–‘๋ ํฌํ•จ)์ž”์—ฌ ์‹œ๊ฐ„์ด ๊ธธ์ˆ˜๋ก ๋ฐ˜์ „ ๋ฆฌ์Šคํฌ๊ฐ€ ํฌ๋ฏ€๋กœ ๋ฉ€์ˆ˜๋ก ๋‚ฎ์€ ๋ฐด๋“œ๋งŒ ํ—ˆ์šฉ (cherry ํ—ˆ์  โ‘ )
๋ชจ๋ฉ˜ํ…€ ๊ฒŒ์ดํŠธ์ตœ๊ทผ 6h ์œˆ๋„์šฐ favorite ๊ฐ€๊ฒฉ ๋ณ€ํ™” โ‰ฅ -0.01. ์œˆ๋„์šฐ invalid(ํฌ์ธํŠธ < 5 ๋˜๋Š” ์ปค๋ฒ„๋ฆฌ์ง€ < 3h)๋ฉด ๋ฐฑํ•„ ์‹œ๋„, ๊ทธ๋ž˜๋„ invalid๋ฉด ์ง„์ž… ๊ธˆ์ง€๋–จ์–ด์ง€๋Š” ์นผ๋‚  ํšŒํ”ผ (cherry ํ—ˆ์  โ‘ข), ๋ฌด์ „๋žต ํ‡ดํ™” ๋ฐฉ์ง€ (banana ๊ตํ›ˆ)
์žฌ์ง„์ž… ์ฟจ๋‹ค์šดHOLDING ์—†์Œ AND ๋งˆ์ง€๋ง‰ ๋งค๋„/skip์ด 24h ์ด์ „์†์ ˆ ์งํ›„ ๋ฐ˜๋ณต ์ง„์ž… ๋ฐฉ์ง€, ์˜๊ตฌ skip ๋Œ€์‹  ์žฌํ‰๊ฐ€ ํ—ˆ์šฉ (cherry ํ—ˆ์  โ‘ฃ)
์ฃผ๋ฌธ ์žฌ๊ฒ€์ฆ์ฃผ๋ฌธ ์ง์ „ midpoint ์žฌ์กฐํšŒ, ๋ฐด๋“œ ์ƒํ•œ ์ดˆ๊ณผ ์‹œ rapid_jump skip (์ฟจ๋‹ค์šด TTL), ํ•˜ํ•œ ๋ฏธ๋‹ฌ ์‹œ ๋‹จ์ˆœ skip, 5์ฃผ ์ตœ์†Œ ์ฃผ๋ฌธ ์ถฉ์กฑ์Šค์บ”๊ณผ ์ฃผ๋ฌธ ์‚ฌ์ด์˜ ๊ฐ€๊ฒฉ ๋ณ€๋™ ๋Œ€์‘

์ฒญ์‚ฐ ๊ทœ์น™

์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ๋งค ์‚ฌ์ดํด ๊ฒ€์‚ฌํ•œ๋‹ค.

์šฐ์„ ์ˆœ์œ„์กฐ๊ฑด๊ฐ’exit_reason
1์†์ ˆP&L โ‰ค -8%stop_loss
2์ต์ ˆํ˜„์žฌ๊ฐ€ โ‰ฅ min(๋งค์ˆ˜๊ฐ€ ร— 1.12, 0.99)take_profit
3ํŠธ๋ ˆ์ผ๋ง ์Šคํƒ‘ํ˜„์žฌ๊ฐ€ < ์ตœ๊ณ ๊ฐ€ ร— 0.95trailing_stop
4์‹œ๊ฐ„ ์ฒญ์‚ฐํ•ด๊ฒฐ๊นŒ์ง€ < 2htime_exit
-ํ•ด๊ฒฐ๋œ ์‹œ์žฅ leakmidpoint ์กฐํšŒ ์‹คํŒจ + endDate 24h ์ด์ƒ ๊ฒฝ๊ณผ โ†’ EXPIRED ๋งˆ๊ฐ (P&L ๋ฏธํ™•์ •, ์ˆ˜๋™ redeem)resolved_unredeemed

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

env๊ธฐ๋ณธ์˜๋ฏธ
POLYBOT_BUY_AMOUNT5.01ํšŒ ๋งค์ˆ˜ USDC
POLYBOT_MIN_LIQUIDITY15000์ตœ์†Œ ์œ ๋™์„ฑ $
POLYBOT_MIN_VOLUME_24H5000์ตœ์†Œ 24h ๊ฑฐ๋ž˜๋Ÿ‰ $
POLYBOT_ENTRY_HOURS_MIN6์ง„์ž… ์ตœ์†Œ ์ž”์—ฌ ์‹œ๊ฐ„ (์ดํ•˜ ๊ธˆ์ง€)
POLYBOT_LADDER_H1 / H2 / H324 / 72 / 168์‚ฌ๋‹ค๋ฆฌ ๊ตฌ๊ฐ„ ์ƒํ•œ ์‹œ๊ฐ„
POLYBOT_BAND1_MIN / BAND1_MAX0.80 / 0.95๋ฐด๋“œ1 (6~24h)
POLYBOT_BAND2_MIN / BAND2_MAX0.75 / 0.92๋ฐด๋“œ2 (24~72h)
POLYBOT_BAND3_MIN / BAND3_MAX0.70 / 0.88๋ฐด๋“œ3 (72~168h)
POLYBOT_MOMENTUM_LOOKBACK_HOURS6๋ชจ๋ฉ˜ํ…€ ์œˆ๋„์šฐ
POLYBOT_MOMENTUM_MIN_CHANGE-0.01favorite ๋ณ€ํ™” ํ•˜ํ•œ
POLYBOT_TAKE_PROFIT0.12์ต์ ˆ % (๋ชฉํ‘œ๊ฐ€ 0.99 ์บก)
POLYBOT_STOP_LOSS-0.08์†์ ˆ %
POLYBOT_TRAILING_STOP_ENABLEDtrueํŠธ๋ ˆ์ผ๋ง on/off
POLYBOT_TRAILING_STOP_PERCENT0.05์ตœ๊ณ ์  ๋Œ€๋น„ ํ•˜๋ฝ๋ฅ 
POLYBOT_EXIT_HOURS2์‹œ๊ฐ„ ์ฒญ์‚ฐ ๊ธฐ์ค€
POLYBOT_REENTRY_COOLDOWN_HOURS24์žฌ์ง„์ž… ์ฟจ๋‹ค์šด
POLYBOT_HISTORY_BACKFILLtrueprices-history ๋ฐฑํ•„
POLYBOT_MAX_POSITIONS-1์ตœ๋Œ€ ๋™์‹œ ํฌ์ง€์…˜
POLYBOT_EXCLUDED_CATEGORIES""์ œ์™ธ ์นดํ…Œ๊ณ ๋ฆฌ (๋นˆ ๊ฐ’ = ๋น„ํ™œ์„ฑ)
POLYBOT_YES_ONLYfalseYes(index 0) ํ† ํฐ๋งŒ ๋งค์ˆ˜ (CLI --yes-only๊ฐ€ ์šฐ์„ )
LOG_LEVELINFO๋กœ๊ทธ ๋ ˆ๋ฒจ

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

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

1) ์‹œ๋ฎฌ๋ ˆ์ด์…˜ โ€” uv run python main.py run --simulate --job sim์„ Jenkins 3~5๋ถ„ ์ฃผ๊ธฐ๋กœ 1~2์ฃผ ์ถ•์ . data/sim/trades_sim.db + ์›”๋ณ„ CSV์—์„œ ์ง„์ž… ์‚ฌ์œ ๋ณ„ ์„ฑ๊ณผ๋ฅผ ๋ถ„๋ฆฌ ์ง‘๊ณ„ํ•œ๋‹ค. ํšŒ๊ณ  ์ „์šฉ ์ปฌ๋Ÿผ(strategy_name="date", mode="live"/"sim", volume_24h_at_buy, ladder_band_at_buy 1/2/3, momentum_at_buy)์ด tradesยทCSV์— ํ•จ๊ป˜ ๊ธฐ๋ก๋˜๋ฏ€๋กœ entry_reason ๋ฌธ์ž์—ด ํŒŒ์‹ฑ ์—†์ด ์‚ฌ๋‹ค๋ฆฌ ๋‹จ๋ณ„ยท๋ชจ๋ฉ˜ํ…€ ๊ตฌ๊ฐ„๋ณ„ ์ง‘๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

2) ์†Œ์•ก ์‹ค์ „ โ€” POLYBOT_BUY_AMOUNT=5๋กœ ์‹ค์ฃผ๋ฌธ 2์ฃผ. ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ์˜ ์ฒด๊ฒฐ ํŽธ์ฐจ(midpoint ๊ฐ€์ • vs ์‹ค์ œ)๋ฅผ ํ™•์ธํ•œ๋‹ค.

3) ํŒ๋‹จ ๊ธฐ์ค€ โ€” 4์ฃผ, 30+ ๊ฑฐ๋ž˜ ๊ธฐ์ค€:

4) cherry์™€์˜ A/B โ€” ๊ฐ™์€ ๊ธฐ๊ฐ„ cherry ๊ณ„์ • ์„ฑ๊ณผ์™€ ๋น„๊ต. ๋™์ผ GTC midpoint ์ฒด๊ฒฐ ๊ฐ€์ •์„ ์œ ์ง€ํ–ˆ์œผ๋ฏ€๋กœ ํšŒ๊ณ„ ๊ธฐ์ค€์ด ๊ฐ™๋‹ค.

๋ฒ ๋ฆฌ์—์ด์…˜ ํ›„๋ณด (job ๋ถ„๋ฆฌ๋กœ ๋™์‹œ ์šด์˜ ๊ฐ€๋Šฅ):

์•ˆ์ด๋ฆ„๋ณ€๊ฒฝ env
A-1date-1: ์‚ฌ๋‹ค๋ฆฌ ์ข๊ฒŒ (๋‹จ๊ธฐ ์ง‘์ค‘)POLYBOT_LADDER_H3=24 (๋ฐด๋“œ1๋งŒ ์‚ฌ์šฉ, h โ‰ค 24๋งŒ ์ง„์ž…)
A-2date-2: YES-onlyCLI --yes-only ๋˜๋Š” POLYBOT_YES_ONLY=true (cherry ์šด์˜ ๋ชจ๋“œ์™€ ์ง์ ‘ ๋น„๊ต)
A-3date-3: trailing off + ํ™€๋“œPOLYBOT_TRAILING_STOP_ENABLED=false (์ˆ˜๋ ด์„ 2h ์ „๊นŒ์ง€ ๋๊นŒ์ง€ ํƒœ์šฐ๊ณ  -8% ์†์ ˆ๋งŒ ์‚ฌ์šฉ)

์‹คํ–‰ (Jenkins)

#!/bin/bash
export POLYBOT_BUY_AMOUNT=20
export POLYMARKET_PRIVATE_KEY=<Jenkins credential>
export POLYMARKET_FUNDER_ADDRESS=<Jenkins credential>
export LOG_LEVEL=INFO
# ์ „๋žต ์ฃผ์š” env ์˜ˆ์‹œ
export POLYBOT_MOMENTUM_MIN_CHANGE=-0.01
export POLYBOT_REENTRY_COOLDOWN_HOURS=24
export POLYBOT_TRAILING_STOP_PERCENT=0.05

cd ./golden-date
uv sync
uv run python ./main.py run

Jenkins job๋ณ„๋กœ DB/๋กœ๊ทธ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ ค๋ฉด --job <์ด๋ฆ„>์„ ๋ถ™์ธ๋‹ค. YES ํ† ํฐ๋งŒ ๋งค์ˆ˜ํ•˜๋ ค๋ฉด --yes-only๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.