Polymarket Bot Tutorial · บทที่ 20 จาก 32
ติดตาม whale wallets ของ Polymarket และ copy-trade ผู้ทำผลงานสูงสุดแบบโปรแกรม: ระบุ wallets ที่ทำกำไรได้ผ่าน leaderboard และการวิเคราะห์ on-chain แล้ว mirror การเทรดของพวกเขาด้วยกฎเรื่องขนาดและเวลาเข้าออก
บทนี้ครอบคลุมอะไรบ้าง
การก็อปปี้ wallets ที่ชนะบน Polymarket เป็นไอเดียยอดนิยม แต่ whale ตัวจริงบน Polymarket ส่วนใหญ่กำลังทำ late-window arb บนตลาดที่ปิดผลแล้ว ไม่ใช่การเดิมพันเชิงทิศทาง บทนี้คือการวิจัยแบบตรงไปตรงมาจากการวิเคราะห์ on-chain: wallets ไหนที่ควรจะก็อปปี้จริง ๆ, ทำไมส่วนใหญ่ถึงไม่คุ้มจะก็อปปี้, และคณิตศาสตร์การกำหนดขนาดโพซิชัน
- การระบุ wallets ที่ทำกำไรได้
- การตรวจจับ trade บน chain
- การกำหนดขนาดโพซิชันเทียบกับ whale
- Latency: ช้าแค่ไหนถึงเรียกว่าช้าเกินไป
- Filters: ติดตามเฉพาะ wallets ที่พิสูจน์ edge ได้
- Code: ตรวจจับ whale buy event แล้ววาง copy ตามขนาด
การระบุ wallets ที่ทำกำไรได้
แนวคิดของ whale-copying คือ wallets บางตัวทำกำไรได้อย่างสม่ำเสมอ และการก็อปปี้การเข้าโพซิชันของพวกเขาจะจับเอาบางส่วนของ edge นั้นได้ การวิเคราะห์ on-chain ของ wallets ชั้นนำบน Polymarket ในปี 2025-26 ให้ผลที่ค่อนข้างน่าผิดหวัง: whale ที่มองเห็นได้ส่วนใหญ่กำลังทำ arbitrage ช่วงท้ายของหน้าต่างเวลาบนตลาดที่ปิดผลแล้ว ไม่ใช่การเทรดเชิงทิศทาง
โปรไฟล์ที่เราวัดจาก whale wallets ผู้สมัคร 3 ราย:
- "hhhhhh6" (win rate 98.5%, volume $n M)-88% ของการเข้าเกิดที่ราคามากกว่าเท่ากับ 0.95, median timestamp ของการเข้าคือ 226 วินาทีในหน้าต่าง 300 วินาที เป็น tail-yield arb ล้วน ๆ ไม่ใช่เชิงทิศทาง
- "anonymous" (win rate 20%)-นักเสี่ยงโชคแบบไร้รูปแบบ ก็อปปี้แล้วขาดทุน
- "Jkim123" (win rate 53.5%)-พอ ๆ กับการโยนเหรียญ ไม่ใช่สัญญาณที่คุ้มจะก็อปปี้
0% ของการเทรดจาก whales เหล่านี้เกิดขึ้นใน 120 วินาทีแรกของหน้าต่าง 5 นาทีใด ๆ สัญญาณเชิงคาดการณ์ (ถ้ามี) จะมาจากการเข้าโพซิชันขนาดใหญ่ในช่วงต้นหน้าต่าง-แต่ wallets พวกนั้นไม่ใช่ตัวที่อยู่บน top ของ leaderboard เพราะทำได้ยาก
การตรวจจับ trade บน chain
การตรวจจับการเทรดของ wallet เป้าหมายต้องอาศัย either polling data-api ของ Polymarket หรือ subscribing เหตุการณ์ transfer ของ CTF บน chain ตัวเลือก 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 ทุก 5 วินาทีคือขีดจำกัดที่ใช้งานได้จริงสำหรับ data-api ถ้าต่ำกว่านี้คุณจะชน rate limits หากต้องการตรวจจับระดับ sub-second ให้ subscribe to on-chain ERC-1155 TransferSingle events จาก CTF contract โดยกรองด้วย proxy address ของ whale
การกำหนดขนาดโพซิชันเทียบกับ whale
ถ้าคุณกำหนดขนาด copy ของคุณเป็นสัดส่วนคงที่ของการเทรดของ whale คุณก็จะรับความเสี่ยงแบบเดียวกับเขาไปด้วย มีสองทางเลือกที่ใช้งานได้จริง
- Cap-based: กำหนดขนาดแต่ละ copy เป็นจำนวนเงินคงที่ ($10-50) ไม่ว่า whale จะเทรดใหญ่แค่ไหนก็ตาม โตช้าแต่จำกัดการขาดทุนต่อเทรด
- Win-rate-weighted: กำหนดขนาด copy ตาม win rate ล่าสุดของ whale ถ้า WR 60%+ → copy เต็มขนาด; 40-60% → ครึ่งขนาด; ต่ำกว่า 40% → ข้าม
แนวทางแบบ cap-based ปลอดภัยกว่าสำหรับการใช้งานครั้งแรก ค่อยย้ายไปใช้ win-rate-weighted ก็ต่อเมื่อคุณวัด win rate จริงของ whale จาก copy ของคุณเองแล้วเท่านั้น ซึ่งโดยมากจะแย่กว่าตัวเลขหัวข้อข่าว เพราะคุณมาช้า
Latency: ช้าแค่ไหนถึงเรียกว่าช้าเกินไป
การเทรดของ whale จะมองเห็นสาธารณะภายใน 1-2 วินาทีหลัง execution การก็อปปี้มันต้องมี latency ฝั่งอ่านที่เร็วกว่านั้น บวกกับ latency การส่งคำสั่งของคุณเอง
End-to-end สำหรับ copy bot ทั่วไป: polling 5-10 วินาที + ส่งคำสั่ง 200ms = รวม 5-15 วินาที พอถึงเวลาที่ copy ของคุณยิงออก สัญญาณของ whale ก็ได้สะท้อนเข้าไปในราคาแล้ว
สำหรับ 99% ของการ copy นี่ถือว่าช้าเกินไปสำหรับตลาดที่แคบของ Polymarket การเข้าโพซิชันของ whale ขยับ mid ไป 1-2 เซนต์; คุณจ่าย premium 1-2 เซนต์จากจุดที่เขาเข้าจริง ถ้า edge ของเขาอยู่ที่ 3c ครึ่งหนึ่งก็หายไปแล้วตอนที่คุณมาถึง
copy bots ที่ใช้งานได้จริงจะ either (a) เลือกตลาดที่เคลื่อนไหวช้า ซึ่ง latency 30 วินาทีไม่สำคัญ, หรือ (b) ใช้ on-chain event subscription เพื่อโต้ตอบใน timeframe ระดับ sub-second
Filters: ติดตามเฉพาะ wallets ที่พิสูจน์ edge ได้
มี 3 ฟิลเตอร์ก่อนจะเพิ่ม wallet ใด ๆ เข้า copy list ของคุณ
- มี closed trades 30+ ครั้ง ในประวัติของ wallet ตัวอย่างที่น้อยกว่านี้เป็น noise
- win rate ตลอดอายุบัญชี > 60% หรือ EV ต่อเทรดเป็นบวกจากราคาเข้าเงื่อนไขอย่างใดอย่างหนึ่ง ถ้าได้ทั้งคู่ยิ่งดี
- รูปแบบไม่ใช่ late-window arb ตรวจสอบ median seconds-to-resolution ตอนเข้า ถ้าใกล้ 0 แปลว่า wallet นั้นกำลังทำ tail-yield arb ซึ่งคุณไม่สามารถทำซ้ำได้
ผู้สมัคร whale ส่วนใหญ่ไม่ผ่านอย่างน้อยหนึ่งในสามข้อนี้ กลุ่ม wallets ที่ก็อปปี้ได้จริงมีจำนวนน้อย การรักษารายชื่อจำเป็นต้องตรวจซ้ำเป็นระยะ-wallets ที่ทำกำไรได้เมื่อเดือนที่แล้วอาจไม่ทำกำไรในเดือนนี้
Code: ตรวจจับ whale buy event แล้ววาง copy ตามขนาด
ตัวอย่างอ้างอิง: ตรวจจับเหตุการณ์ CTF TransferSingle สำหรับ whale ที่เฝ้าดู แล้วส่ง buy copy ตามขนาด
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 ซื้อ) เทียบกับ to (zero address = burn = ขายแล้ว)





