Polymarket Bot Tutorial · Chương 20 trong 32
Theo dõi ví whale của Polymarket và copy-trade các top performer bằng programmatically: xác định các ví profitable thông qua leaderboard và on-chain analysis, mirror các giao dịch của họ với quy tắc về size và timing.
Chương này đề cập đến gì
Copy các Polymarket wallet chiến thắng là một ý tưởng phổ biến, nhưng những whale thực sự trên Polymarket phần lớn đang làm late-window arb trên các thị trường đã resolved, chứ không phải directional bets. Chương này là nghiên cứu trung thực từ on-chain analysis: ví nào thật sự đáng copy, vì sao đa số không đáng copy, và công thức position-sizing.
- Xác định các wallet profitable
- Phát hiện giao dịch on-chain
- Position sizing tương đối so với whale
- Latency: trễ đến mức nào thì quá trễ
- Filters: chỉ theo dõi các wallet có verified edge
- Code: phát hiện whale buy event, đặt sized copy
Xác định các wallet profitable
Tiền đề của whale-copying là một số wallet liên tục profitable, và việc copy các entry của họ sẽ capture được một phần edge đó. Phân tích on-chain các top wallet của Polymarket trong giai đoạn 2025-26 cho ra một kết quả khá đáng suy nghĩ: đa số các whale nhìn thấy được đều đang làm late-window arbitrage trên các thị trường đã resolved, chứ không phải directional trading.
Hồ sơ chúng tôi đo được trên ba wallet whale ứng viên:
- "hhhhhh6" (98.5% win rate, $n M volume) - 88% entry ở mức giá ≥0.95, median entry timestamp là 226s trong cửa sổ 300s. Thuần tail-yield arb, không phải directional.
- "anonymous" (20% win rate) - degenerate gambler. Copy sẽ mất tiền.
- "Jkim123" (53.5% win rate) - coin-flip. Không phải tín hiệu đáng để copy.
0% giao dịch của các whale này xảy ra trong 120s đầu của bất kỳ cửa sổ 5 phút nào. Tín hiệu dự đoán (nếu có) sẽ đến từ các entry lớn trong EARLY-window - nhưng những wallet đó lại không đứng đầu leaderboard, vì rất khó làm được.
Phát hiện giao dịch on-chain
Phát hiện giao dịch của một wallet mục tiêu đòi hỏi либо polling data-api của Polymarket hoặc subscribe vào on-chain CTF transfer events. Tùy chọn data-api đơn giản hơn.
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 mỗi 5 giây là mức sàn thực tế cho data-api. Thấp hơn mức này bạn sẽ đụng rate limits. Để phát hiện dưới một giây, hãy subscribe vào on-chain ERC-1155 TransferSingle events từ CTF contract được lọc theo proxy address của whale.
Position sizing tương đối so với whale
Nếu bạn size copy của mình như một tỷ lệ cố định của giao dịch whale, bạn sẽ kế thừa risk profile của họ. Có hai cách thay thế thực tế.
- Cap-based: size mỗi lệnh copy thành một số tiền cố định ($10-50) bất kể whale lớn cỡ nào. Tích lũy chậm hơn nhưng giới hạn lỗ mỗi trade.
- Win-rate-weighted: size copy như một hàm của win rate gần đây của whale. WR 60%+ → copy full-size; 40-60% → half-size; dưới 40% → bỏ qua.
Cách cap-based là lựa chọn an toàn hơn để triển khai đầu tiên. Chỉ chuyển sang win-rate-weighted sau khi bạn đã đo win rate thực sự của whale trên CÁC LỆNH COPY CỦA CHÍNH BẠN (thường sẽ thấp hơn con số headline của họ vì bạn vào trễ).
Latency: trễ đến mức nào thì quá trễ
Giao dịch của whale sẽ được công khai trong vòng 1-2 giây sau khi thực thi. Copy nó đòi hỏi read-side latency nhanh hơn mức đó, cộng thêm độ trễ đặt lệnh của chính bạn.
End-to-end cho một copy bot điển hình: polling 5-10 giây + đặt lệnh 200ms = tổng 5-15 giây. Đến lúc lệnh copy của bạn khớp, tín hiệu của whale đã phản ánh vào giá.
Với 99% lệnh copy, như vậy là quá trễ trên các thị trường hẹp của Polymarket. Entry của whale đã làm mid dịch 1-2 cent; bạn phải trả premium 1-2 cent so với mức họ vào. Nếu edge của họ là 3c, thì một nửa đã mất khi bạn tới.
Copy bot hoạt động được sẽ либо (a) nhắm vào các thị trường biến động chậm nơi latency 30 giây không quan trọng, hoặc (b) dùng on-chain event subscription để phản ứng trong khung thời gian sub-second.
Filters: chỉ theo dõi các wallet có verified edge
Ba filter trước khi thêm bất kỳ wallet nào vào danh sách copy của bạn.
- 30+ closed trades trong lịch sử wallet. Mẫu nhỏ hơn chỉ là noise.
- Lifetime win rate > 60%, HOẶC positive expected value trên mỗi trade dựa trên entry prices. Chỉ cần một điều kiện; có cả hai thì tốt hơn.
- Pattern KHÔNG phải late-window arb. Kiểm tra median số giây đến lúc resolution tại thời điểm entry; nếu gần 0, wallet đó đang làm tail-yield arb mà bạn không thể tái tạo.
Phần lớn các whale ứng viên đều fail một trong ba điều này. Tập các wallet thực sự có thể copy là rất nhỏ. Duy trì danh sách này đòi hỏi kiểm tra lại định kỳ - những wallet profitable tháng trước chưa chắc tháng này vẫn vậy.
Code: phát hiện whale buy event, đặt sized copy
Tham chiếu: phát hiện một CTF TransferSingle event cho một whale đã theo dõi, rồi kích hoạt một lệnh buy copy có size tương ứng.
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)
Phân biệt buy và sell bằng cách kiểm tra from (zero address = mint = whale đã mua) so với to (zero address = burn = đã bán).





