Polymarket Bot Tutorial · Kapitel 3 von 32
Wähle deinen Polymarket Bot-Stack: Python (py-clob-client 0.34.6), Node.js (@polymarket/clob-client-v2 v1.0.6) oder Rust (kein offizielles SDK, auf ethers-rs aufbauen). Vor- und Nachteile, Latenz, Code-Beispiele.
Was dieses Kapitel abdeckt
Die Wahl der Programmiersprache ist viel weniger entscheidend, als die meisten Builder denken. Polymarket stellt allen Sprachen dieselben REST- und WebSocket-Endpunkte zur Verfügung; die SDK-Wahl bestimmt vor allem, wie viel Glue Code du selbst schreiben musst. Python und Node haben beide offiziell gepflegte SDKs; Rust hat keines, ist aber für den Hot Path gut machbar. Dieses Kapitel geht die Trade-offs durch, zeigt dieselbe Aufgabe „Order Book abrufen“ in jeder Sprache, damit der Unterschied konkret wird, und endet mit einem Mixed-Stack-Pattern, auf das sich die meisten Production Bots tatsächlich einigen.
- Decision Framework
- Python (Standardwahl)
- Node.js (Full-Stack-Entwickler)
- Rust (latency-kritischer Hot Path)
- Setup-Befehle pro Stack
- Code-Skeleton: Order Book in 3 Sprachen abrufen
- Wann man Stacks mischt (Python Control Plane + Rust Hot Path)
Decision Framework
Drei Fragen klären 90% der Stack-Wahl.
- Hast du bereits starke Vorkenntnisse? Wenn du täglich Python schreibst, schreibe den Bot in Python. Wenn du täglich TypeScript schreibst, schreibe den Bot in Node. Die Qualitätsunterschiede der SDKs unten sind real, aber kleiner als die Kosten, mit einer ungewohnten Sprache zu kämpfen.
- Ist die Strategie latency-kritisch? Wenn dein Edge davon abhängt, in unter 50 ms zu reagieren (5-Minuten-Crypto-Märkte, Market Making während News), profitiert der Hot Path von Rust oder Go. Die meisten Strategien brauchen das nicht.
- Wirst du mehr als eine Strategie ausführen? Ein einzelner Python-Prozess kann bequem 10-20 Märkte verwalten. Darüber hinaus skaliert async Node oder ein aufgeteilter Python-Ansatz mit mehreren Prozessen besser.
Die ehrliche Standardwahl für den ersten Bot ist Python. Wechsel nur, wenn eine gemessene Anforderung dich dazu zwingt.
Python (Standardwahl)
Python ist die Standardwahl, weil das SDK am vollständigsten ist und der Iterationszyklus am schnellsten. py-clob-client in Version 0.34.6 (Mai 2026) deckt jeden wichtigen CLOB-v2-Endpunkt ab: Market- und Limit-Orders, FOK/FAK/GTC-Varianten, Order-Book-Reads, Balance-/Allowance-Reads und direkte Chain-Operationen über web3.py.
Vorteile: ausgereiftes SDK, einfache Datenanalyse mit pandas, große Community, web3.py für On-Chain-Reads. Nachteile: async-Ergonomie ist im Vergleich zu JavaScript umständlich, GIL begrenzt Multi-Core-Speedups (spielt bei einem I/O-bound Bot selten eine Rolle), Startzeit auf kalten Containern ist langsam.
Empfohlen für: 80% der Builder. Besonders für alle, deren Strategie Backtesting, statistische Analyse oder allgemeine Datenarbeit neben der Ausführung umfasst.
Node.js (Full-Stack-Entwickler)
Node.js ist der zweitbeste unterstützte Stack. @polymarket/clob-client-v2 in Version 1.0.6 deckt dieselben Endpunkte wie das Python-SDK ab, mit TypeScript-Typen durchgängig. Async ist nativ und schnell; WebSocket-Handling ist hervorragend.
Vorteile: beste async Story, native TypeScript-Typen, großes Ökosystem für HTTP + WS, einfache Bereitstellung im selben Node-Runtime wie ein Web-Dashboard. Nachteile: Zahlenpräzision erfordert BigInt oder String-Handling für große Token-IDs (ERC-1155-IDs sind 256 Bit), Data-Tools als Pendant zu pandas sind schwächer.
Empfohlen für: Builder, die bereits einen JavaScript-Stack pflegen und nur eine Runtime wollen. Auch für alle, die neben dem Bot ein Dashboard bauen - geteilte Typen zwischen Bot-Core und Next.js-Dashboard beseitigen eine ganze Klasse von Bugs.
Rust (latency-kritischer Hot Path)
Rust hat kein offizielles Polymarket SDK. Du baust direkt gegen die V2 REST- und WebSocket-APIs mit reqwest (HTTP), tokio-tungstenite (WebSocket) und ethers-rs oder alloy für das Signieren. Grob zwei Tage Setup-Arbeit statt 30 Minuten in Python.
Vorteile: natives EIP-712-Signing ohne JS-Subprozess, Order-Erstellung im Sub-Millisecond-Bereich, deterministisches Memory-Profil unter Last, keine GC-Pausen. Nachteile: kein SDK bedeutet, dass du neu implementierst, was Python-Nutzer kostenlos bekommen (clobToken-ID-Parsing, Validierung des Response-Schemas, Salt-/Nonce-Management). Der Latenzgewinn liegt bei 20-100 ms gegenüber optimiertem Python und ist nur für Sub-Second-Strategien relevant.
Empfohlen für: den Hot Path eines Market-Making-Bots oder den Trade-Auslöse-Teil eines News-Arb-Bots. Fast nie für den gesamten Bot.
Setup-Befehle pro Stack
Minimale Befehle für eine funktionierende signierte Order gegen Mainnet (einzelner CLOB-v2-Endpunkt).
Python:
python -m venv venv && source venv/bin/activate
pip install py-clob-client==0.34.6 web3 python-dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Node:
npm init -y
npm install @polymarket/[email protected] ethers dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Rust:
cargo new --bin pmt
cd pmt
cargo add tokio reqwest serde serde_json ethers alloy tungstenite tokio-tungstenite
# Hand-write signer + endpoint client; no SDK shortcut.
Time-to-first-order: ca. 10 Min. Python, ca. 15 Min. Node, ca. 4-8 Stunden Rust.
Code-Skeleton: Order Book in 3 Sprachen abrufen
Dieselbe Aufgabe - das Order Book für einen Polymarket-Token abrufen - in jedem Stack. Alle drei treffen denselben CLOB-v2-REST-Endpunkt.
Python (py-clob-client):
from py_clob_client.client import ClobClient
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)
book = client.get_order_book("<token_id>")
print(book.bids[:3], book.asks[:3])
Node (@polymarket/clob-client-v2):
import { ClobClient } from "@polymarket/clob-client-v2";
const c = new ClobClient({ host: "https://clob.polymarket.com", chain: 137 });
const book = await c.getOrderBook("<token_id>");
console.log(book.bids.slice(0,3), book.asks.slice(0,3));
Rust (direktes HTTP):
let url = format!("https://clob.polymarket.com/book?token_id={}", token);
let book: serde_json::Value = reqwest::get(&url).await?.json().await?;
println!("{:?} {:?}", &book["bids"][..3], &book["asks"][..3]);
Gleiches Response-Format in allen drei Fällen. Die Kosten von Rust liegen überall sonst - Signieren, Order-Erstellung, Fehlerbehandlung - nicht im Read Path.
Wann man Stacks mischt (Python Control Plane + Rust Hot Path)
Das Pattern, auf das viele Production Bots hinauslaufen: Python für alles, was Entscheidungen betrifft, Rust für den millisekundenschnellen Execution-Teil.
Architektur: Ein Python-Prozess liest den Marktstatus, führt die Strategie-Logik aus und schreibt eine kleine Command-Datei (z. B. {"action":"buy","token":"...","size":10,"price":0.45}) auf einen Unix Socket. Ein Rust-Daemon lauscht auf diesem Socket, signiert die Order und sendet sie an den CLOB. Der Python-Prozess kann langsam und bequem sein; der Rust-Daemon ist schnell und minimal.
Der Übergabepunkt ist entscheidend: Indem der Signed-Order-Schritt isoliert wird, holst du dir das Crash-Budget von Python zurück, ohne Latenz zu opfern. Wir verwenden genau dieses Pattern in unseren Production Bots - Python emittiert Absichten, ein Node-Daemon auf /tmp/clob.sock übernimmt das Signieren. Die Node-Version des Daemons ist für unter 100 ms völlig in Ordnung; Rust lohnt sich erst unter 50 ms wirklich.












