๐ŸŽ

golden-apple โ€” 80/90 Threshold

ํ™•๋ฅ  80~90% ๊ตฌ๊ฐ„์˜ favorite์„ ๋งค์ˆ˜ํ•˜๊ณ  90% ๋„๋‹ฌ ์‹œ ๋งค๋„ โ€” ๊ฑฐ๋ž˜๋‹น ์•ฝ 10% ํ™•์ • ์ˆ˜์ต์„ ๋…ธ๋ฆฌ๋Š” ๋‹จ์ˆœ threshold ์ „๋žต.

์œ ํ˜• ๊ณ ํ™•๋ฅ  ์ˆ˜๋ ด ํŽธ์Šน์ƒํƒœ ์šด์˜ ์ค‘ (2๊ณ„์ •)ํ•ต์‹ฌ ํŽธํ–ฅ favorite-longshot bias

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

BUY : 0.80 โ‰ค p < 0.90            # p = Yes/No ์ค‘ ๋†’์€ ์ชฝ(favorite) ํ™•๋ฅ 
      AND liquidity โ‰ฅ 50,000  AND volume โ‰ฅ 100,000  AND NOT sports
      AND condition_id๋‹น ํ‰์ƒ 1ํšŒ (์žฌ๊ฑฐ๋ž˜ ๊ธˆ์ง€)
SELL: p โ‰ฅ 0.90 โ†’ ๋ณด์œ  ์ „๋Ÿ‰ ๋งค๋„    # ์œ ์ผํ•œ ์ฒญ์‚ฐ ์กฐ๊ฑด โ€” ์†์ ˆยท์‹œ๊ฐ„ ์ฒญ์‚ฐยท๋งŒ๊ธฐ ์ฒ˜๋ฆฌ ์—†์Œ
SKIP: ๋งค์ˆ˜ ์ง์ „ p โ‰ฅ 0.90 โ†’ rapid_jump, ์˜๊ตฌ ์ œ์™ธ

์ „๋žต ๊ฐœ์š”

Golden Apple์€ Polymarket ๋ฐ”์ด๋„ˆ๋ฆฌ ์˜ˆ์ธก์‹œ์žฅ์—์„œ ํ™•๋ฅ (๊ฐ€๊ฒฉ)์ด 80% ์ด์ƒ 90% ๋ฏธ๋งŒ์ธ outcome(Yes/No ์ค‘ ๋†’์€ ์ชฝ)์„ ๋งค์ˆ˜ํ•˜๊ณ , 90% ๋„๋‹ฌ ์‹œ ๋งค๋„ํ•ด ๊ฑฐ๋ž˜๋‹น ์•ฝ 10%์˜ ํ™•์ • ์ˆ˜์ต์„ ๋…ธ๋ฆฌ๋Š” ๋‹จ์ˆœ threshold ์ „๋žต ๋ด‡์ด๋‹ค. ํ•ต์‹ฌ ๊ฐ€์ •์€ ๋‘ ๊ฐ€์ง€ โ€” "์ •๋ณด์˜ ํ™•์‚ฐ ์†๋„๋กœ ์ธํ•ด 80%๋ฅผ ๋ŒํŒŒํ•œ ์˜ˆ์ธก์€ ์–ธ์  ๊ฐ€ 90%์— ๋„๋‹ฌํ•œ๋‹ค", "์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์‹œ์žฅ ํ™•๋ฅ ์ด ์‹ค์ œ ์‚ฌ๊ฑด ํ™•๋ฅ ๋กœ ์ˆ˜๋ ดํ•œ๋‹ค".

์†์ ˆ(stop loss)์€ ์˜๋„์ ์œผ๋กœ ์—†๊ณ , ํ•œ ๋ฒˆ ๊ฑฐ๋ž˜(๋˜๋Š” ๊ธ‰๋“ฑ์œผ๋กœ skip)ํ•œ ์‹œ์žฅ์€ ์˜๊ตฌํžˆ ์žฌ๊ฑฐ๋ž˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋žœ๋ค์„ฑ์ด ํฐ ์Šคํฌ์ธ  ์‹œ์žฅ์€ ์ „๋ฉด ์ œ์™ธํ•œ๋‹ค. Jenkins๊ฐ€ 5๋ถ„ ์ฃผ๊ธฐ๋กœ polybot run์„ ์‹คํ–‰ํ•˜๋Š” stateless one-shot ๊ตฌ์กฐ์ด๊ณ , ์ƒํƒœ๋Š” job๋ณ„ ๋กœ์ปฌ SQLite(data/{job}/trades.db)์—๋งŒ ์ €์žฅ๋œ๋‹ค. ๋™์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ƒ์ˆ˜๋งŒ ๋‹ฌ๋ฆฌํ•œ 2๊ฐœ Jenkins job์œผ๋กœ ๋Œ๋ ค ๋Œ€์‹œ๋ณด๋“œ์˜ GOLDEN-APPLE (1), (2) ๊ณ„์ •์„ ์šด์˜ํ•œ๋‹ค.

๋งค์ˆ˜ยท๋งค๋„ ์กฐ๊ฑด

๋งค์ˆ˜ ํŒŒ์ดํ”„๋ผ์ธ โ€” Gamma API ์ „์ฒด ์‹œ์žฅ ํŽ˜์ด์ง€๋„ค์ด์…˜(100๊ฐœ์”ฉ, offset ์ตœ๋Œ€ 5,000) ํ›„ ์•„๋ž˜ ์กฐ๊ฑด์„ ๋ชจ๋‘ ํ†ต๊ณผํ•ด์•ผ ๋งค์ˆ˜ํ•œ๋‹ค.

์กฐ๊ฑด๊ฐ’ (yaml ํ˜„์žฌ๊ฐ’)๋น„๊ณ 
ํ™•๋ฅ  ๊ตฌ๊ฐ„0.80 โ‰ค p < 0.90outcomePrices ์ค‘ ํฐ ์ชฝ(favorite) ์„ ํƒ. 90% ์ด์ƒ์€ ํ›„๋ณด ์ œ์™ธ(๊ธ‰๋“ฑ์žฅ ์ง„์ž… ๋ฐฉ์ง€)
์œ ๋™์„ฑliquidity โ‰ฅ 50,000Gamma liquidity ํ•„๋“œ. ์ฝ”๋“œ ๊ธฐ๋ณธ๊ฐ’ 100,000
๊ฑฐ๋ž˜๋Ÿ‰volume โ‰ฅ 100,000Gamma volume(๋ˆ„์ ). ์ฝ”๋“œ ๊ธฐ๋ณธ๊ฐ’ 0(๋น„ํ™œ์„ฑ)
์นดํ…Œ๊ณ ๋ฆฌ์Šคํฌ์ธ  ์ œ์™ธtags(slug/label) + question/slug ํ…์ŠคํŠธ์— SPORTS_KEYWORDS(์•ฝ 60๊ฐœ) ๋งค์นญ ์‹œ ์ œ์™ธ
์ค‘๋ณต ์ฒดํฌcondition_id๋‹น ํ‰์ƒ 1ํšŒtrades ๋˜๋Š” skipped_markets์— ์žˆ์œผ๋ฉด skip
๋งค์ˆ˜ ์ง์ „ ์žฌ๊ฒ€์ฆCLOB midpoint ์žฌ์กฐํšŒp โ‰ฅ 0.90 โ†’ rapid_jump ์˜๊ตฌ ์ œ์™ธ / p < 0.80 โ†’ ์ด๋ฒˆ ์‚ฌ์ดํด๋งŒ skip
์ตœ์†Œ ์ˆ˜๋Ÿ‰shares = 5 USDC รท midpoint โ‰ฅ 5์ฃผPolymarket ์ตœ์†Œ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ MIN_ORDER_SIZE=5
์ฃผ๋ฌธGTC limit BUY @ midpoint0.01 tick ๋ฐ˜์˜ฌ๋ฆผ, [0.01, 0.99] clamp. ์‘๋‹ต์— orderID๊ฐ€ ์žˆ์œผ๋ฉด ์ฆ‰์‹œ HOLDING ๊ธฐ๋ก(์ฒด๊ฒฐ ํ™•์ธ ์—†์Œ)

๋งค๋„ ํŒŒ์ดํ”„๋ผ์ธ โ€” ๋งค์ˆ˜๋ณด๋‹ค ๋จผ์ €(Phase 1) ์‹คํ–‰๋˜๋ฉฐ, ์ฒญ์‚ฐ ์กฐ๊ฑด์€ ๋‹จ ํ•˜๋‚˜๋‹ค.

์šฐ์„ ์ˆœ์œ„์กฐ๊ฑด์ฒ˜๋ฆฌ
1 (์œ ์ผ)CLOB midpoint โ‰ฅ 0.90 (sell_threshold)์ „๋Ÿ‰ midpoint limit SELL GTC โ†’ realized_pnl = (sell - buy) ร— shares ๊ธฐ๋ก ํ›„ COMPLETED
-midpoint < 0.90๋ฌด์กฐ๊ฑด ๋ณด์œ  ์œ ์ง€. ์†์ ˆยท์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ฒญ์‚ฐยท๋งŒ๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง ์—†์Œ
(์Šค์บ”) --[0.80โ‰คp<0.90 & ํ•„ํ„ฐ ํ†ต๊ณผ]--> HOLDING --[pโ‰ฅ0.90]--> COMPLETED
(์Šค์บ”) --[๋งค์ˆ˜ ์ง์ „ pโ‰ฅ0.90]--> SKIPPED(rapid_jump, ์˜๊ตฌ ์ œ์™ธ)
HOLDING --[p ํ•˜๋ฝ/๋งŒ๊ธฐ]--> HOLDING (์˜์›ํžˆ; redeem ๋กœ์ง ์—†์Œ)

ํŒŒ๋ผ๋ฏธํ„ฐ (์šฐ์„ ์ˆœ์œ„: env var > config.yaml > ์ฝ”๋“œ ๊ธฐ๋ณธ๊ฐ’)

ํŒŒ๋ผ๋ฏธํ„ฐenv varyaml ํ˜„์žฌ๊ฐ’์ฝ”๋“œ ๊ธฐ๋ณธ๊ฐ’์˜๋ฏธ
buy_thresholdPOLYBOT_BUY_THRESHOLD0.800.80๋งค์ˆ˜ ์ตœ์†Œ ํ™•๋ฅ 
sell_thresholdPOLYBOT_SELL_THRESHOLD0.900.90๋งค๋„ ํŠธ๋ฆฌ๊ฑฐ ํ™•๋ฅ  = ๋งค์ˆ˜ ์ƒํ•œ(๋ฏธ๋งŒ)
buy_amount_usdcPOLYBOT_BUY_AMOUNT5.010.01ํšŒ ๋งค์ˆ˜ ๊ธˆ์•ก(USDC)
min_liquidityPOLYBOT_MIN_LIQUIDITY50,000100,000Gamma liquidity ํ•„๋“œ ์ตœ์†Œ๊ฐ’($)
min_volumePOLYBOT_MIN_VOLUME100,0000 (๋น„ํ™œ์„ฑ)Gamma volume(๋ˆ„์ ) ์ตœ์†Œ๊ฐ’($)
max_positionsPOLYBOT_MAX_POSITIONS-1 (๋ฌด์ œํ•œ)-1๋™์‹œ HOLDING ์ˆ˜ ์ƒํ•œ
excluded_categories(env ์—†์Œ, yaml๋งŒ)Sports/NFL/NBA ๋“ฑ 10์ข…๋™์ผ์ œ์™ธ ์นดํ…Œ๊ณ ๋ฆฌ(ํƒœ๊ทธ+ํ‚ค์›Œ๋“œ)
simulation_mode(CLI --simulate๊ฐ€ override)falsefalsetrue๋ฉด ์ฃผ๋ฌธ ๋ฏธ์ „์†ก, trades_sim.db ์‚ฌ์šฉ
MIN_ORDER_SIZEํ•˜๋“œ์ฝ”๋”ฉ (trader)-5.0 (์ฃผ)Polymarket ์ตœ์†Œ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰
tick sizeํ•˜๋“œ์ฝ”๋”ฉ (clob client)-0.01๊ฐ€๊ฒฉ ๋ฐ˜์˜ฌ๋ฆผ ๋‹จ์œ„, [0.01, 0.99]๋กœ clamp

ํ•„์ˆ˜ credential์€ POLYMARKET_PRIVATE_KEYยทPOLYMARKET_FUNDER_ADDRESS(์—†์œผ๋ฉด ์ฆ‰์‹œ ์ข…๋ฃŒ, private key์˜ hex prefix๋Š” ์ž๋™ ์ œ๊ฑฐ). SLACK_WEBHOOK_URL์€ ํ˜„์žฌ ๋งค๋งค ํ”Œ๋กœ์šฐ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. Jenkins์—์„œ job๋งˆ๋‹ค env var๋งŒ ๋‹ฌ๋ฆฌ ์ฃผ๋ฉด ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ƒ์ดํ•œ ์ „๋žต ์ธ์Šคํ„ด์Šค๋ฅผ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋‹ค โ€” GOLDEN-APPLE (1)/(2)์˜ ๊ตฌํ˜„ ๋ฐฉ์‹.

์ด์šฉํ•˜๋Š” ์‹ฌ๋ฆฌ

๊ฐ•์ 

์•ฝ์  (ํ—ˆ์ )

๊ฐœ์„  ๋ฐ˜์˜์ฒ˜

์œ„ ํ—ˆ์ ๋“ค์€ ์‹ ๊ทœ ๋ด‡ ์„ค๊ณ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜์˜๋๋‹ค.

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

โ‘  ์‹œ๋ฎฌ๋ ˆ์ด์…˜: --simulate๋กœ ์ฃผ๋ฌธ ์ „์†ก๋งŒ mock, ์Šค์บ”~DB ๊ธฐ๋ก์€ ์‹ค๊ฑฐ๋ž˜์™€ ๋™์ผ ๊ฒฝ๋กœ(trades_sim.db ๋ถ„๋ฆฌ). ๋‹จ, midpoint ์ฆ‰์‹œ ์ฒด๊ฒฐ ๊ฐ€์ •์ด๋ผ ์‹œ๋ฎฌ P&L์€ ๊ณผ๋Œ€ํ‰๊ฐ€ ๊ฒฝํ–ฅ(์•ฝ์  7)์„ ๊ฐ์•ˆํ•œ๋‹ค. โ‘ก ์†Œ์•ก ์‹ค๊ฑฐ๋ž˜: yaml buy_amount_usdc: 5.0(USDC)์œผ๋กœ ๊ฑด๋‹น ์†์‹ค์„ ์ œํ•œ. โ‘ข ๋ณ‘ํ–‰ ๋น„๊ต ํ›„ ์ฆ์•ก: ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ env๋งŒ ๋‹ฌ๋ฆฌํ•œ 2๊ฐœ Jenkins job(GOLDEN-APPLE (1)/(2))์œผ๋กœ ๋ณ‘ํ–‰ ์šด์˜ํ•˜๊ณ  ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ž”๊ณ ยท์ˆ˜์ต๋ฅ ์„ ๋น„๊ตํ•œ๋‹ค. ํŒ๋‹จ ์‹œ DB realized P&L์€ ์ฒด๊ฒฐ ํ™•์ธ ๋ถ€์žฌ(์•ฝ์  1)๋กœ ์‹ค์ž”๊ณ ์™€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง€๊ฐ‘ ์ž”๊ณ  ๊ธฐ์ค€์œผ๋กœ ๊ต์ฐจ ํ™•์ธํ•œ๋‹ค.

์‹คํ–‰ (Jenkins)

# Jenkins job ร— 2 (5๋ถ„ cron, one-shot) โ€” ๊ฐ™์€ ์ฝ”๋“œ, env๋งŒ ์ƒ์ด โ†’ GOLDEN-APPLE (1)/(2)
cd ./golden-apple
export POLYMARKET_PRIVATE_KEY=<Jenkins credential>
export POLYMARKET_FUNDER_ADDRESS=<Jenkins credential>
export POLYBOT_BUY_THRESHOLD=0.80    # job๋ณ„๋กœ ์ž„๊ณ„๊ฐ’ยท๊ธˆ์•ก๋งŒ ๋‹ฌ๋ฆฌ ์ง€์ •
export POLYBOT_SELL_THRESHOLD=0.90
uv sync --frozen
uv run polybot run --job apple-1     # ์ƒํƒœ๋Š” data/{job}/trades.db ์— ๊ฒฉ๋ฆฌ