Polymarket Bot Tutorial · Kabanata 20 ng 32
Subaybayan ang Polymarket whale wallets at copy-trade ang top performers nang programmatically: tukuyin ang profitable wallets sa pamamagitan ng leaderboard at on-chain analysis, salaminin ang kanilang trades na may size at timing rules.
Ano ang sinasaklaw ng kabanatang ito
Ang pagkopya sa winning Polymarket wallets ay tanyag na ideya, ngunit ang aktwal na whales sa Polymarket ay karamihan nagsasagawa ng late-window arb sa resolved markets, hindi directional bets. Ang kabanatang ito ay ang honest research mula sa on-chain analysis: kung anong wallets ang dapat aktwal na kopyahin, kung bakit karamihan ay hindi sulit kopyahin, at ang position-sizing math.
- Pagtukoy ng profitable wallets
- On-chain trade detection
- Position sizing kaugnay sa whale
- Latency: gaano kahuli ay masyado nang huli
- Filters: sundan lamang ang wallets na may verified edge
- Code: i-detect ang whale buy event, maglagay ng sized copy
Pagtukoy ng profitable wallets
Ang premise ng whale-copying ay may ilang wallets na patuloy na kumikita at ang pagkopya sa kanilang entries ay nakakakuha ng bahagi ng kanilang edge. Ang on-chain analysis ng Polymarket top wallets sa 2025-26 ay nagprodyus ng sobering na resulta: karamihan sa visible whales ay nagsasagawa ng late-window arbitrage sa resolved markets, hindi directional trading.
Profile na sinukat namin sa tatlong candidate whale wallets:
- "hhhhhh6" (98.5% win rate, $n M volume) - 88% ng entries sa mga presyo ≥0.95, median entry timestamp 226s ng 300s window. Pure tail-yield arb, hindi directional.
- "anonymous" (20% win rate) - degenerate gambler. Ang pagkopya ay nawawalan ng pera.
- "Jkim123" (53.5% win rate) - coin-flip. Hindi signal na sulit kopyahin.
0% ng trades ng mga whale na ito ay nangyari sa unang 120s ng anumang 5-minute window. Ang predictive signal (kung mayroon) ay magmumula sa EARLY-window large entries - ngunit ang mga wallet na iyon ay hindi yung nasa tuktok ng leaderboard, dahil mahirap sila.
On-chain trade detection
Ang pag-detect ng trades ng target wallet ay nangangailangan ng alinman sa pag-poll sa data-api ng Polymarket o pag-subscribe sa on-chain CTF transfer events. Ang data-api option ay mas simple.
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)
Ang five-second polling ay practical floor para sa data-api. Mas mababa pa dito, tatamaan mo ang rate limits. Para sa sub-second detection, mag-subscribe sa on-chain ERC-1155 TransferSingle events mula sa CTF contract na na-filter sa whale's proxy address.
Position sizing kaugnay sa whale
Kung sinusukat mo ang iyong copy bilang constant fraction ng trade ng whale, mamamana mo ang kanilang risk profile. Dalawang praktikal na alternatibo.
- Cap-based: sukatin ang bawat copy sa fixed dollar amount ($10-50) anuman ang whale size. Mabagal mag-compound ngunit bounded loss bawat trade.
- Win-rate-weighted: sukatin ang copy bilang function ng kamakailang win rate ng whale. 60%+ WR → full-size copy; 40-60% → half-size; sa ibaba ng 40% → laktawan.
Ang cap-based approach ay mas ligtas na unang deploy. Lumipat sa win-rate-weighted lamang pagkatapos mong sukatin ang aktwal na win rate ng whale sa IYONG copies (na karaniwang mas masama kaysa sa kanilang headline number dahil huli ka dumating).
Latency: gaano kahuli ay masyado nang huli
Ang trade ng whale ay publicly nakikita sa loob ng 1-2 segundo ng execution. Ang pagkopya nito ay nangangailangan ng mas mabilis na latency kaysa doon sa read side, plus ang sarili mong order placement latency.
End-to-end para sa tipikal na copy bot: 5-10 segundong polling + 200ms order placement = 5-15 segundo total. Sa oras na mag-fire ang iyong copy, ang signal ng whale ay nasa price na.
Para sa 99% ng copies, masyado nang huli ito sa narrow markets ng Polymarket. Ang entry ng whale ay nagpalipat sa mid ng 1-2 cents; nagbabayad ka ng 1-2 cents premium kaugnay sa kung saan sila pumasok. Kung ang kanilang edge ay 3c, kalahati nito ay nawala na sa oras na dumating ka.
Ang copy bots na gumagana ay (a) target ng slow-moving markets kung saan ang 30s latency ay hindi mahalaga, o (b) gumagamit ng on-chain event subscription upang mag-react sa sub-second timeframes.
Filters: sundan lamang ang wallets na may verified edge
Tatlong filters bago magdagdag ng anumang wallet sa iyong copy list.
- 30+ na sara na trades sa kasaysayan ng wallet. Ang mas maliit na samples ay noise.
- Lifetime win rate > 60%, O positive expected value bawat trade batay sa entry prices. Alinmang kondisyon; parehong mas mahusay.
- Ang pattern ay HINDI late-window arb. Suriin ang median seconds-to-resolution sa entry; kung malapit sa 0, ang wallet ay nagsasagawa ng tail-yield arb na hindi mo maparami.
Karamihan sa candidate whales ay bumabagsak sa isa sa tatlo. Ang pool ng aktwal na maaaring kopyahin na wallets ay maliit. Ang pagpapanatili ng listahan ay nangangailangan ng pana-panahong recheck - ang mga wallet na kumikita noong nakaraang buwan ay maaaring hindi sa buwang ito.
Code: i-detect ang whale buy event, maglagay ng sized copy
Reference: i-detect ang CTF TransferSingle event para sa whale na pinanonood, mag-fire ng 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)
Paghiwalayin ang buy mula sa sell sa pamamagitan ng pagsuri sa from (zero address = mint = bumili ang whale) vs to (zero address = burn = nagbenta).





