"D์ผ๊น์ง X๊ฐ ์ผ์ด๋ ๊น" ๋กฑ์ท(YES 5~25%) ์์ฅ์์ NO ํ ํฐ(75~95%)์ ๋งค์ํด, ํฌ๋ง ๋ณด์ ์๋ค์ด ๋ฆ๊ฒ ๋๋ ์๊ฐ ๊ฐ์น ์๋ฉธ(theta)์ ์ํํ๋ค.
์์ฅ ํํ: "D์ผ๊น์ง X๊ฐ ์ผ์ด๋ ๊น"
BUY NO(clobTokenIds[1]) if
0.05 โค YES โค 0.25 # ๋กฑ์ท ๋ฐด๋ (NO = 0.75~0.95)
AND 24h โค ํด๊ฒฐ๊น์ง โค 240h
AND YES 24h ๋ณํ โค +0.02 # ์ฌ๊ฑด ์งํ ๋ฐฐ์ โ
AND ์ต๊ทผ 6h YES ๊ธ๋ฑ < 0.05 # ์ฌ๊ฑด ์งํ ๋ฐฐ์ โกFavorite-longshot bias. ์์ธก์์ฅ/๋ฒ ํ ๋ฌธํ์์ ๊ฐ์ฅ ์ ๋ฌธ์ํ๋ ํธํฅ์ด๋ค. ๋ณต๊ถ ์ฌ๋ฆฌ(์์ ๋์ผ๋ก ํฐ ๋ณด์ ๊ธฐ๋)๋ ๋ฎ์ ํ๋ฅ ๊ตฌ๊ฐ์์ YES๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ณผ๋ํ๊ฐํ๊ฒ ๋ง๋ ๋ค โ 1%๋ก ํ์๋ ์ฌ๊ฑด์ ์ค์ ํ๋ฅ ์ 0.3% ์์ค์ด๋ค. ๋ฐ๋๋ก favorite์ ๊ณผ์ํ๊ฐ๋๋ค.
Theta decay + ์ต์ปค๋ง. "D์ผ๊น์ง X๊ฐ ์ผ์ด๋ ๊น" ํํ์ ์์ฅ์ ์๊ฐ์ด ์ง๋ ์๋ก X๊ฐ ์ผ์ด๋ ์๊ฐ ์์ฒด๊ฐ ์์ง๋์ด YES์ ์ ๋น ๊ฐ์น๊ฐ ๊ธฐ๊ณ์ ์ผ๋ก ํ๋ฝํ๋ค(theta decay). ๊ทธ๋ฌ๋ YES ๋ณด์ ์๋ ์ต์ปค๋ง(๋งค์๊ฐ ๊ธฐ์ค ์ฌ๊ณ )๊ณผ ํฌ๋ง์ ์ฌ๊ณ ๋๋ฌธ์ ํฌ์ง์ ์ ๋ฆ๊ฒ ๋๋๋ค โ NO ๊ฐ๊ฒฉ์ด ์ ๋น ๊ฐ์น๋ณด๋ค ๋ฎ๊ฒ ์ ์ง๋๋ ๊ตฌ๊ฐ์ด ์๊ธด๋ค. ์ฆ NO ๋งค์๋ "์๊ฐ์ ํ๋ฆ"์ด๋ผ๋ ํ์คํ ๋ฐฉํฅ์ฑ์ ๋ฒ ํ ํ๋ฉด์, ๋์ค ์ฌ๋ฆฌ๊ฐ ๋ง๋ ํ ์ธ๊น์ง ์ป๋ ๊ตฌ์กฐ๋ค.
cherry์ ๋ฏธ๋ฌ. cherry๋ ๊ฐ์ ํธํฅ์ favorite ์ชฝ(75~92% favorite ๋งค์)์ ์ํํด ์๋ค. fig๋ ๊ฐ์ ํธํฅ์ ๋ฏธ๋ฌ๋ค: cherry๊ฐ "favorite ์ ํ๊ฐ"๋ฅผ ์ฌ๋ฉด, fig๋ "longshot ๊ณผ๋ํ๊ฐ"๋ฅผ ํ๋ค(= NO ๋งค์). ๋ ๋ด์ ์ฑ๊ณผ ๋น๊ต๊ฐ ์ด ํธํฅ์ ์ด๋ ์ชฝ์ด ๋ ๋ํฐ์ด์ง์ ๋ํ A/B ๊ฒ์ฆ์ด ๋๋ค. ๋ cherry์ --yes-only ์ด์์ NO-favorite ์์ฅ ์ ๋ฐ์ ๋ฒ๋ ธ๋๋ฐ(STRATEGY_ANALYSIS ํ์ธ ์ฌํญ), fig๋ ๋ฐฉํฅ์ ์ ๋ต์ ๋ด์ฅ(ํญ์ NO)ํด์ ์ด ๋ญ๋น ์์ฒด๊ฐ ์๋ค.
banana์์ ๋ฐฐ์ด ๊ฒ. ๊ฐ์ ๊ธฐ๋ฐ ์ค๋ ์ท ์๋์ฐ ๋ฒ๊ทธ(Jenkins ์ค๋จ ์ 15๋ถ ์๋์ฐ๊ฐ ์ ์๊ฐ์ ์ปค๋ฒ), ๊ด๋ํ cold-start ํด๋ฐฑ(์ค๋ ์ท 6๊ฐ ๋ฏธ๋ง์ด๋ฉด ์ฌ์ค์ ๋ฌด์ ๋ต ์ง์ ), ์๊ตฌ one-shot(์ฌ์ง์ ๊ธ์ง) ๋ฌธ์ ๋ฅผ ๋ชจ๋ ์์ ํด ๋ฐ์ํ๋ค.
๋ชจ๋ ์ถฉ์กฑํด์ผ ๋งค์ํ๋ค.
| ์กฐ๊ฑด | ๊ฐ (๊ธฐ๋ณธ) | ์ด์ |
|---|---|---|
| ์ ๋์ฑ | liquidity โฅ $10,000 (Gamma liquidity) | ์ฒด๊ฒฐ ๊ฐ๋ฅ์ฑ ํ๋ณด |
| (์ต์ ) 24h ๊ฑฐ๋๋ | volume24hr โฅ $0 (0 = ๋นํ์ฑ, Gamma volume24hr) | ํ์ ์ env๋ก ํ์ฑํ |
| ์๊ฐ ์๋์ฐ | 24h โค ํด๊ฒฐ๊น์ง โค 240h (endDate ๊ธฐ์ค) | theta ์ํ ๊ตฌ๊ฐ ํ์ |
| YES ๋กฑ์ท ๋ฐด๋ | 0.05 โค YES โค 0.25 (์๋ ํฌํจ, outcomePrices[0]) | ๋ณต๊ถ ์ฌ๋ฆฌ ๊ณผ๋ํ๊ฐ ๊ตฌ๊ฐ๋ง ํ์ด๋ |
| ์๋์ฐ ์ ํจ์ฑ | 24h ์๋์ฐ์ โฅ 5 ํฌ์ธํธ, ์ปค๋ฒ๋ฆฌ์ง โฅ 12h. invalid โ ๋ฐฑํ ์๋ โ ๊ทธ๋๋ invalid๋ฉด ์ง์
๊ธ์ง (is_window_valid) | banana์ ๊ด๋ํ cold-start ํด๋ฐฑ ๊ธ์ง |
| ์ฌ๊ฑด ์งํ ๋ฐฐ์ โ | YES 24h ๋ณํ โค +0.02 (์๋์ฐ ์ต๊ณ (ๆๅค) ์ค๋
์ท ๋๋น, change_from_oldest) | ์ง์ง ์ ๋ณด๋ก ์ค๋ฅด๋ YES ๋ฐฐ์ |
| ์ฌ๊ฑด ์งํ ๋ฐฐ์ โก | ์ต๊ทผ 6h YES ๊ธ๋ฑ < 0.05 (6h ์๋์ฐ ์ ์ ๋๋น, rise_from_low) | ๊ธ๋ฑ ์งํ ์ค ์ง์ ์ฐจ๋จ |
| ์ฌ์ง์ ์ ์ฑ | HOLDING ์์ AND ๋ง์ง๋ง ์ฒญ์ฐ/skip ํ 24h ๊ฒฝ๊ณผ (is_in_reentry_cooldown) | ์๊ตฌ one-shot ๋์ ์ฟจ๋ค์ด ๊ธฐ๋ฐ ์ฌ์ง์ ํ์ฉ |
์ง์
์ NO ํ ํฐ(clobTokenIds[1])์ ๋งค์ํ๋ค. NO ๊ฐ๊ฒฉ์ 0.75~0.95 ๊ตฌ๊ฐ. ์ฃผ๋ฌธ์ midpoint ๊ฐ๊ฒฉ GTC limit BUY, POLYBOT_BUY_AMOUNT(USDC) รท ๊ฐ๊ฒฉ = ์ฃผ์ (์ต์ 5์ฃผ).
trader์ ๋งค์ ์ง์ ์ฌ๊ฒ์ฆ: NO midpoint > 0.95(๋ฐด๋ ์๋จ)๋ฉด rapid_jump๋ก skip ๊ธฐ๋ก(์ฟจ๋ค์ด 24h), < 0.75๋ฉด ์ด๋ฒ ์ฌ์ดํด๋ง skip.
์ฐ์ ์์ ์์ผ๋ก ๊ฒ์ฌํ๋ค. trailing stop์ ์๋ค.
| ์ฐ์ ์์ | ์กฐ๊ฑด | ํ๋ผ๋ฏธํฐ (๊ธฐ๋ณธ๊ฐ) | exit_reason |
|---|---|---|---|
| 1 | P&L โค -10% | stop_loss_percent -0.10 | stop_loss (NO ํ๋ฝ = YES ๊ธ๋ฑ = ์ฌ๊ฑด ๋ฐ์ ์ ํธ) |
| 2 | ํ์ฌ๊ฐ โฅ min(๋งค์๊ฐ ร 1.06, 0.99) | take_profit_percent +0.06 | take_profit |
| 3 | ํด๊ฒฐ๊น์ง < 2h | exit_hours 2 | time_exit |
| - | midpoint ์กฐํ ๋ถ๊ฐ + ํด๊ฒฐ 24h ๊ฒฝ๊ณผ | - | resolved_unredeemed (status=EXPIRED, ์๋ redeem ํ์) |
NO๋ ๋ง๊ธฐ ์๋ ด์ด ๋ณธ์ง์ด๋ฏ๋ก TP๊ฐ +6%๋ก ์์๋ ํ์ ์จ๋ก ์์ต์ ์๋๋ค. ๋งค์๊ฐ 0.934 ์ด์์ด๋ฉด ์๋ชฉํ๊ฐ๊ฐ 0.99๋ฅผ ๋์ผ๋ฏ๋ก 0.99 ๋๋ฌ ์ ์ต์ (์บก).
์ฐ์ ์์: env > config.yaml > ์ฝ๋ ๊ธฐ๋ณธ๊ฐ
| env | ๊ธฐ๋ณธ๊ฐ | ์๋ฏธ |
|---|---|---|
POLYBOT_BUY_AMOUNT | 5.0 | 1ํ ๋งค์ USDC |
POLYBOT_MIN_LIQUIDITY | 10000 | ์ต์ ์ ๋์ฑ $ |
POLYBOT_MIN_VOLUME_24H | 0 | ์ต์ 24h ๊ฑฐ๋๋ $ (0 = ๋นํ์ฑ) |
POLYBOT_TAKE_PROFIT | 0.06 | ์ต์ % (๋ชฉํ๊ฐ 0.99 ์บก) |
POLYBOT_STOP_LOSS | -0.10 | ์์ % |
POLYBOT_MAX_POSITIONS | -1 | ์ต๋ ๋์ ํฌ์ง์ (-1 ๋ฌด์ ํ) |
POLYBOT_REENTRY_COOLDOWN_HOURS | 24 | ์ฌ์ง์ ์ฟจ๋ค์ด |
POLYBOT_HISTORY_BACKFILL | true | prices-history ๋ฐฑํ |
POLYBOT_EXCLUDED_CATEGORIES | "" | ์ ์ธ ์นดํ ๊ณ ๋ฆฌ (comma ๊ตฌ๋ถ, ๋น ๊ฐ = ๋นํ์ฑ) |
POLYBOT_YES_MIN | 0.05 | YES ๋กฑ์ท ๋ฐด๋ ํํ |
POLYBOT_YES_MAX | 0.25 | YES ๋กฑ์ท ๋ฐด๋ ์ํ |
POLYBOT_YES_RISE_BLOCK_24H | 0.02 | 24h YES ์์น ์ฐจ๋จ ์๊ณ |
POLYBOT_YES_SPIKE_BLOCK_6H | 0.05 | 6h YES ๊ธ๋ฑ ์ฐจ๋จ ์๊ณ |
POLYBOT_RISE_LOOKBACK_HOURS | 24 | 24h ๊ฒ์ดํธ lookback |
POLYBOT_SPIKE_LOOKBACK_HOURS | 6 | 6h ๊ฒ์ดํธ lookback |
POLYBOT_ENTRY_HOURS_MIN | 24 | ์ง์ ์ต์ ์์ฌ ์๊ฐ |
POLYBOT_ENTRY_HOURS_MAX | 240 | ์ง์ ์ต๋ ์์ฌ ์๊ฐ |
POLYBOT_EXIT_HOURS | 2 | ํด๊ฒฐ N์๊ฐ ์ ์ฒญ์ฐ |
LOG_LEVEL | INFO | ๋ก๊ทธ ๋ ๋ฒจ (--verbose๊ฐ ์ต์ฐ์ ) |
1) ์๋ฎฌ๋ ์ด์
(1~2์ฃผ) โ uv run python main.py run --simulate --job fig-sim์ Jenkins 3~5๋ถ ์ฃผ๊ธฐ๋ก ์คํ. data/fig-sim/trades_sim.db ์ถ์ .
2) ์์ก ์ค์ (4์ฃผ) โ POLYBOT_BUY_AMOUNT๋ฅผ ์ต์ ์์ค์ผ๋ก ์คํ (๋ฐด๋ ํน์ฑ์ 5์ฃผ ์ต์ ์ฃผ๋ฌธ ์ถฉ์กฑ ํ์, NO 0.95 ๊ธฐ์ค ์ฝ $4.75 ์ด์).
3) ํ๋จ ๊ธฐ์ค โ 4์ฃผ ๊ฒฝ๊ณผ + 30๊ฑด ์ด์ ์๊ฒฐ ๊ฑฐ๋์์:
exit_reason ๋ถํฌ์์ stop_loss๊ฐ 25% ์ด๊ณผํ๋ฉด ๊ฒ์ดํธ ์๊ณ ์ฌ์กฐ์ ๋๋ ์ค๋จ4) cherry์์ A/B โ ๊ฐ์ ํธํฅ์ favorite ์ชฝ์ธ cherry์ ๋์ผ ๊ธฐ๊ฐ ์์ต๋ฅ ๋น๊ต โ ํธํฅ์ ์ด๋ ์ชฝ์ด ๋ ์ํ ๊ฐ๋ฅํ์ง ํ๋จ.
๋ฒ ๋ฆฌ์์ด์
ํ๋ณด (๊ฐ๊ฐ --job fig-1 ์์ผ๋ก job์ ๋ถ๋ฆฌํ๋ฉด DB๊ฐ ๋ถ๋ฆฌ๋์ด ๋์ A/B ์ด์ ๊ฐ๋ฅ):
POLYBOT_YES_MAX=0.15 โ ๋ ๊น์ ๋กฑ์ท๋ง. TP ์ฌ์ง๊ฐ ์ค์ด๋๋ ๋์ ์ฌ๊ฑด ๋ฐ์ ํ๋ฅ ๋ ๋ฎ์์ง๋ค.POLYBOT_ENTRY_HOURS_MAX=72 โ ํด๊ฒฐ 3์ผ ์ด๋ด๋ง ์ง์
. theta๊ฐ ๊ฐ์ฅ ๊ฐํ๋ฅธ ๊ตฌ๊ฐ๋ง ์ํ.POLYBOT_YES_RISE_BLOCK_24H=0.00, POLYBOT_YES_SPIKE_BLOCK_6H=0.03 โ YES๊ฐ ์กฐ๊ธ์ด๋ผ๋ ์ค๋ฅด๋ ์ค์ด๋ฉด ์ง์
๊ธ์ง. ์ง์
์๋ ์ค๊ณ ์์ ๋๋ ์ฌ๋ผ๊ฐ๋ค.#!/bin/bash export POLYBOT_BUY_AMOUNT=20 export POLYMARKET_PRIVATE_KEY=<Jenkins credential> export POLYMARKET_FUNDER_ADDRESS=<Jenkins credential> export LOG_LEVEL=INFO # ์ ๋ต ํ๋ผ๋ฏธํฐ ์์ (๊ธฐ๋ณธ๊ฐ๊ณผ ๋ค๋ฅด๊ฒ ์ด์ํ ๋๋ง) export POLYBOT_YES_MAX=0.25 export POLYBOT_TAKE_PROFIT=0.06 export POLYBOT_REENTRY_COOLDOWN_HOURS=24 cd ./golden-fig uv sync uv run python ./main.py run
3~5๋ถ ์ฃผ๊ธฐ cron ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ถ์ฅํ๋ค (์ค๋ ์ท ์ถ์ ์ด ์๊ทธ๋ ํ์ง์ ์ข์ฐ).