Polymarket Bot Tutorial · Bölüm 20 / 32
Polymarket whale cüzdanlarını takip edin ve top performer’ları programatik olarak copy-trade edin: leaderboard ve on-chain analysis ile kârlı cüzdanları belirleyin, işlemlerini boyut ve zamanlama kurallarıyla birebir yansıtın.
Bu bölüm neleri kapsıyor
Kazanan Polymarket cüzdanlarını kopyalamak popüler bir fikir, ancak Polymarket’teki gerçek whale’ların çoğu yönlü bahisler değil, resolved markets üzerinde geç-window arb yapıyor. Bu bölüm, on-chain analysis’den gelen dürüst araştırmayı anlatıyor: gerçekten hangi cüzdanlar kopyalanmalı, çoğu neden kopyalamaya değmez ve position-sizing matematiği nedir.
- Kârlı cüzdanları belirleme
- On-chain trade detection
- Whale’a göre position sizing
- Latency: ne kadar geç çok geçtir
- Filtreler: yalnızca verified edge’e sahip cüzdanları takip et
- Code: whale buy event’i tespit et, boyutlandırılmış copy yerleştir
Kârlı cüzdanları belirleme
Whale-copying’in varsayımı, bazı cüzdanların sürekli kârlı olması ve onların entry’lerini kopyalamanın edge’lerinin bir kısmını yakalaması. Polymarket’in 2025-26 dönemindeki top cüzdanlarının on-chain analysis’i iç karartıcı bir sonuç verdi: görünür whale’ların çoğu yönlü trading değil, resolved markets üzerinde geç-window arbitrage yapıyor.
Ölçtüğümüz üç aday whale cüzdanının profili:
- "hhhhhh6" (%98.5 win rate, $n M volume) - entry’lerin %88’i fiyatlarda ≥0.95, 300 saniyelik pencerenin ortalama entry timestamp’i 226 sn. Saf tail-yield arb, yönlü değil.
- "anonymous" (%20 win rate) - dejenere kumarbaz. Kopyalamak para kaybettirir.
- "Jkim123" (%53.5 win rate) - yazı-tura. Kopyalanmaya değer bir sinyal değil.
Bu whale’ların işlemlerinin %0’ı herhangi bir 5 dakikalık pencerenin ilk 120 saniyesinde gerçekleşti. Predictive signal (varsa) EARLY-window büyük entry’lerden gelirdi - ama leaderboard’un tepesindeki cüzdanlar bunlar değil, çünkü zorlar.
On-chain trade detection
Hedef bir cüzdanın işlemlerini tespit etmek için ya Polymarket’in data-api’sini polling ile kontrol etmeniz ya da on-chain CTF transfer event’lerine subscribe olmanız gerekir. data-api seçeneği daha basittir.
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)
Beş saniyelik polling, data-api için pratik alt sınırdır. Bunun altına inerseniz rate limit’lere takılırsınız. Sub-second detection için, whale’ın proxy address’i ile filtrelenmiş CTF contract’ından on-chain ERC-1155 TransferSingle event’lerine subscribe olun.
Whale’a göre position sizing
Copy’nizi whale’ın trade’inin sabit bir yüzdesi olarak boyutlandırırsanız, onların risk profilini miras alırsınız. İki pratik alternatif var.
- Cap-based: Her copy’yi whale’ın büyüklüğünden bağımsız olarak sabit bir dolar tutarına ($10-50) göre boyutlandırın. Bileşik büyüme yavaştır ama trade başına zarar sınırlıdır.
- Win-rate-weighted: Copy boyutunu whale’ın son win rate’ine göre belirleyin. %60+ WR → tam boy copy; %40-60 → yarım boy; %40 altı → atla.
Cap-based yaklaşım, ilk deployment için daha güvenlidir. Win-rate-weighted yönteme ancak whale’ın GERÇEK win rate’ini kendi copies’leriniz üzerinde ölçtükten sonra geçin (bu oran genellikle headline number’dan daha düşüktür, çünkü geç ulaşırsınız).
Latency: ne kadar geç çok geçtir
Whale’ın trade’i execution’dan sonra 1-2 saniye içinde kamuya görünür olur. Onu kopyalamak için read tarafında bundan daha düşük latency gerekir, buna ek olarak kendi order placement latency’niz de vardır.
Tipik bir copy bot için uçtan uca süre: 5-10 saniyelik polling + 200ms order placement = toplam 5-15 saniye. Copy’niz tetiklendiğinde whale’ın sinyali zaten fiyata yansımış olur.
Polymarket’in dar market’lerinde copy’lerin %99’u için bu çok geçtir. Whale’ın entry’si mid’i 1-2 cent hareket ettirmiştir; siz onların giriş yaptığı yere göre bu 1-2 cent primi ödersiniz. Edge’leri 3c idiyse, siz vardığınızda bunun yarısı zaten gitmiştir.
İşe yarayan copy bot’lar ya (a) 30 saniyelik latency’nin önemli olmadığı yavaş hareket eden market’leri hedefler ya da (b) sub-second timeframe’lerde tepki vermek için on-chain event subscription kullanır.
Filtreler: yalnızca verified edge’e sahip cüzdanları takip et
Herhangi bir cüzdanı copy list’inize eklemeden önce üç filtre uygulayın.
- 30+ kapalı trade cüzdanın geçmişinde olmalı. Daha küçük örnekler gürültüdür.
- Lifetime win rate > %60 olmalı, YA DA entry fiyatlarına göre trade başına pozitif expected value olmalı. Bu koşullardan biri yeterli; ikisi birden daha iyidir.
- Pattern geç-window arb OLMAMALI. Entry anındaki median seconds-to-resolution değerine bakın; sıfıra yakınsa, wallet sizin tekrar üretemeyeceğiniz tail-yield arb yapıyordur.
Aday whale’ların çoğu bu üçünün birinde elenir. Gerçekten kopyalanabilir cüzdan havuzu küçüktür. Listeyi güncel tutmak periyodik recheck gerektirir - geçen ay kârlı olan cüzdanlar bu ay olmayabilir.
Code: whale buy event’i tespit et, boyutlandırılmış copy yerleştir
Referans: izlenen bir whale için CTF TransferSingle event’ini tespit edin ve boyutlandırılmış bir copy buy tetikleyin.
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)
from alanını kontrol ederek buy ile sell’i ayırt edin (zero address = mint = whale satın aldı) ve to alanını kontrol edin (zero address = burn = satıldı).





