Polymarket Bot Tutorial · Глава 20 из 32
Отслеживайте whale wallets Polymarket и программно копируйте сделки топовых участников: находите прибыльные wallets через leaderboard и on-chain analysis, зеркальте их сделки с правилами по размеру позиции и времени входа.
Что рассматривается в этой главе
Идея копировать winning Polymarket wallets популярна, но реальные whales на Polymarket в основном делают late-window arb на resolved markets, а не directional bets. Эта глава - честное исследование на основе on-chain analysis: какие wallets действительно стоит копировать, почему большинство не заслуживает копирования и как работает math для 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.
Профиль, который мы измерили на трех candidate 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) - дегенеративный gambler. Копирование приводит к убыткам.
- "Jkim123" (53.5% win rate) - coin-flip. Не signal, который стоит копировать.
0% этих whales trades происходили в первые 120s любого 5-minute window. Predictive signal (если он вообще есть) был бы в EARLY-window крупных входах - но именно эти wallets не находятся на вершине leaderboard, потому что это сложно.
On-chain trade detection
Чтобы обнаруживать trades целевого wallet, нужно либо опрашивать Polymarket data-api, либо подписаться на on-chain CTF transfer events. Вариант с 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 задержкой подпишитесь на on-chain ERC-1155 TransferSingle events из CTF contract, отфильтровав их по proxy address whale.
Position sizing относительно whale
Если вы делаете copy с постоянной долей от trade whale, вы унаследуете его risk profile. Два практических альтернативных подхода.
- Cap-based: размер каждого copy фиксирован в долларах ($10-50) независимо от размера сделки whale. Медленнее наращивается, но loss на одну сделку ограничен.
- Win-rate-weighted: размер copy зависит от недавнего win rate whale. WR выше 60% → full-size copy; 40-60% → half-size; ниже 40% → пропускать.
Cap-based подход - более безопасный вариант для первого запуска. Переходите к win-rate-weighted только после того, как измерите реальный win rate whale на ВАШИХ copies (он обычно хуже, чем headline number, потому что вы приходите поздно).
Latency: насколько поздно - это уже слишком поздно
Trade whale становится публично видимым в течение 1-2 секунд после исполнения. Чтобы скопировать его, вам нужна более быстрая read-side latency, плюс собственная latency размещения order.
End-to-end для типичного copy bot: 5-10 second polling + 200ms order placement = всего 5-15 секунд. К тому моменту, когда ваша copy срабатывает, signal whale уже заложен в price.
Для 99% copies это слишком поздно на узких markets Polymarket. Вход whale сдвинул mid на 1-2 cents; вы платите эту премию 1-2 cents относительно его цены входа. Если его edge был 3c, к моменту вашего прихода половина уже исчезла.
Copy bots, которые работают, либо (a) target slow-moving markets, где latency в 30s не имеет значения, либо (b) используют on-chain event subscription, чтобы реагировать в sub-second timeframe.
Filters: следуйте только за wallets с подтвержденным edge
Три фильтра перед тем, как добавлять любой wallet в ваш copy list.
- 30+ closed trades в истории wallet. Меньшие выборки - это noise.
- Lifetime win rate > 60% ИЛИ положительный expected value на trade на основе entry prices. Любое из условий; оба - лучше.
- Pattern НЕ является late-window arb. Проверьте median seconds-to-resolution на входе; если он близок к 0, wallet занимается tail-yield arb, который вы не сможете воспроизвести.
Большинство candidate whales не проходят один из этих трех фильтров. Набор wallets, которые действительно можно копировать, невелик. Список нужно периодически перепроверять - wallets, которые были прибыльны в прошлом месяце, могут не быть такими в этом.
Code: detect whale buy event, place sized copy
Reference: detect CTF TransferSingle event для отслеживаемого whale, отправить sized copy 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 = sold).





