Polymarket Bot Tutorial · Розділ 20 із 32
Відстежуйте whale wallets Polymarket і copy-trade найкращих виконавців програмно: визначайте прибуткові wallets через leaderboard та on-chain analysis, віддзеркалюйте їхні trades із правилами щодо розміру та таймінгу.
Що охоплює цей розділ
Копіювання успішних Polymarket wallets - популярна ідея, але реальні whales на Polymarket здебільшого займаються late-window arb на resolved markets, а не directional bets. Цей розділ - чесне дослідження на основі on-chain analysis: які wallets справді варто копіювати, чому більшість не варта копіювання, і математика position-sizing.
- Визначення прибуткових wallets
- On-chain trade detection
- Position sizing відносно whale
- Latency: наскільки запізно - це вже запізно
- Filters: слідкувати лише за wallets із підтвердженою edge
- Code: detect whale buy event, place sized copy
Визначення прибуткових wallets
Передумова whale-copying полягає в тому, що деякі wallets стабільно прибуткові, а копіювання їхніх entries дає змогу захопити частину їхньої edge. On-chain analysis топових wallets Polymarket у 2025-26 роках дала тверезий результат: більшість видимих whales займаються late-window arbitrage на resolved markets, а не directional trading.
Профіль, який ми виміряли на трьох кандидатах whale wallets:
- "hhhhhh6" (98.5% win rate, $n M volume) - 88% entries за цінами ≥0.95, медіанний timestamp входу - 226s у 300s вікні. Чистий tail-yield arb, не directional.
- "anonymous" (20% win rate) - degenerate gambler. Копіювання призводить до втрат.
- "Jkim123" (53.5% win rate) - coin-flip. Не сигнал, який варто копіювати.
0% trades цих whales відбулися в перші 120s будь-якого 5-хвилинного вікна. Predictive signal (якщо він є) походив би від великих entries на РАННЬОМУ етапі вікна - але саме ці wallets не очолюють leaderboard, бо їх важко знаходити.
On-chain trade detection
Виявлення trades цільового wallet вимагає або polling data-api Polymarket, або підписки на on-chain події CTF transfer. Варіант із data-api простіший.
def watch_wallet(wallet_addr, last_seen_ts=0):
while True:
url = f"https://data-api.polymarket.com/activity?user={wallet_addr}&limit=100"
events = requests.get(url).json()
for ev in events:
ts = int(ev.get("timestamp", 0))
if ts <= last_seen_ts: continue
if ev["type"] == "TRADE":
process_whale_trade(ev)
last_seen_ts = max(last_seen_ts, ts)
time.sleep(5)
П’ятисекундний polling - практична нижня межа для data-api. Якщо зменшити інтервал, ви натрапите на rate limits. Для sub-second detection підписуйтесь на on-chain ERC-1155 TransferSingle events із контракту CTF, відфільтровані за proxy address whale.
Position sizing відносно whale
Якщо ви визначаєте розмір копії як сталу частку trade whale, то успадковуєте його risk profile. Є два практичні альтернативні підходи.
- Cap-based: задавайте кожну копію як фіксовану суму в доларах ($10-50) незалежно від розміру whale. Повільніше нарощує прибуток, але збиток на trade обмежений.
- Win-rate-weighted: визначайте розмір копії як функцію recent win rate whale. 60%+ WR → copy повного розміру; 40-60% → половина розміру; нижче 40% → пропустити.
Cap-based підхід - безпечніший для першого запуску. Переходьте до win-rate-weighted лише після того, як виміряєте фактичний win rate whale на ВАШИХ копіях (який зазвичай гірший за headline number, бо ви приходите запізно).
Latency: наскільки запізно - це вже запізно
Trade whale стає публічно видимим через 1-2 секунди після виконання. Щоб його скопіювати, потрібна менша latency на етапі читання, а також власна latency розміщення ордера.
End-to-end для типового copy bot: 5-10 секунд polling + 200ms розміщення ордера = 5-15 секунд загалом. На момент, коли спрацьовує ваша копія, сигнал whale уже врахований у ціні.
Для 99% копій це надто пізно на вузьких markets Polymarket. Вхід whale зрушує mid на 1-2 центи; ви платите цю премію 1-2 центи відносно того, де зайшов він. Якщо його edge був 3c, половина вже зникла до вашого приходу.
Copy bots, які працюють, або (a) орієнтуються на повільні markets, де latency 30s не має значення, або (b) використовують on-chain event subscription, щоб реагувати в sub-second таймфреймах.
Filters: слідкувати лише за wallets із підтвердженою edge
Три фільтри перед тим, як додати будь-який wallet до списку копіювання.
- 30+ закритих trades в історії wallet. Менші вибірки - це шум.
- Lifetime win rate > 60%, АБО позитивний expected value на trade на основі entry prices. Достатньо однієї умови; обидві разом - краще.
- Pattern НЕ є late-window arb. Перевірте median seconds-to-resolution на вході; якщо він близький до 0, wallet займається tail-yield arb, який ви не зможете відтворити.
Більшість кандидатів whales не проходять один із цих трьох фільтрів. Пул wallet, які реально можна копіювати, невеликий. Список потрібно періодично перевіряти заново - wallets, прибуткові минулого місяця, можуть не бути такими цього місяця.
Code: detect whale buy event, place sized copy
Reference: detect подію CTF TransferSingle для відстежуваного whale, виконати buy-копію потрібного розміру.
from web3 import Web3
w3 = Web3(Web3.WebsocketProvider(POLYGON_WSS))
ctf = w3.eth.contract(address=CTF_ADDR, abi=CTF_ABI)
WHALES = {"0xabc...": {"fraction": 0.05, "cap": 50}}
def on_transfer(event):
to = event.args["to"].lower()
if to not in WHALES: return
cfg = WHALES[to]
token_id = event.args.id
whale_size = event.args.value / 1e6
copy_size = min(cfg["cap"], whale_size * cfg["fraction"])
if copy_size < 5: return # not worth fees
book = fetch_book(str(token_id))
if book.best_ask:
place_fok(str(token_id), "BUY", book.best_ask + 0.01, copy_size)
# subscribe to ERC-1155 TransferSingle events from CTF
filt = ctf.events.TransferSingle.create_filter(fromBlock="latest")
while True:
for ev in filt.get_new_entries(): on_transfer(ev)
time.sleep(0.5)
Розрізняйте buy і sell, перевіряючи from (zero address = mint = whale купив) vs to (zero address = burn = продав).





