Polymarket Bot Tutorial · Chương 3 trong 32

Chọn stack cho Polymarket bot của bạn: Python (py-clob-client 0.34.6), Node.js (@polymarket/clob-client-v2 v1.0.6), hoặc Rust (không có official SDK, xây trên ethers-rs). Ưu, nhược, latency, ví dụ code.

Chương này bao gồm những gì

Lựa chọn ngôn ngữ ít quan trọng hơn nhiều so với cách hầu hết builder vẫn nghĩ. Polymarket cung cấp cùng một REST và WebSocket endpoints cho mọi ngôn ngữ; việc chọn SDK chủ yếu quyết định bạn phải tự viết bao nhiêu glue code. Python và Node đều có SDK được duy trì chính thức; Rust thì không, nhưng vẫn khả thi cho hot path. Chương này sẽ phân tích trade-off, cho thấy cùng một tác vụ "fetch order book" trong từng ngôn ngữ để phần khác biệt trở nên cụ thể, và kết thúc bằng một pattern mixed-stack mà hầu hết production bots thực sự đi đến.

  • Khung ra quyết định
  • Python (lựa chọn mặc định)
  • Node.js (dev full-stack)
  • Rust (hot path nhạy latency)
  • Lệnh setup cho từng stack
  • Code skeleton: fetch order book trong 3 ngôn ngữ
  • Khi nào nên kết hợp stack (Python control plane + Rust hot path)

Khung ra quyết định

Ba câu hỏi sẽ giải quyết 90% việc chọn stack.

  1. Bạn có thế mạnh sẵn có rõ ràng không? Nếu bạn viết Python hằng ngày, hãy viết bot bằng Python. Nếu bạn viết TypeScript hằng ngày, hãy viết bot bằng Node. Chênh lệch về chất lượng SDK bên dưới là có thật, nhưng nhỏ hơn nhiều so với chi phí phải vật lộn với một ngôn ngữ xa lạ.
  2. Chiến lược có phụ thuộc vào latency không? Nếu edge của bạn phụ thuộc vào phản ứng dưới 50ms (crypto markets 5 phút, market-making khi có tin tức), hot path sẽ hưởng lợi từ Rust hoặc Go. Phần lớn chiến lược không cần đến mức này.
  3. Bạn có chạy hơn một chiến lược không? Một Python process đơn lẻ có thể thoải mái quản lý 10-20 markets. Vượt quá mức đó, async Node hoặc Python chia tách process sẽ scale tốt hơn.

Mặc định trung thực cho bot đầu tiên là Python. Chỉ đổi khi một ràng buộc đo được buộc bạn phải làm vậy.

Python (lựa chọn mặc định)

Python là lựa chọn mặc định vì SDK đầy đủ nhất và vòng lặp thử nghiệm nhanh nhất. py-clob-client ở version 0.34.6 (tháng 5 năm 2026) bao phủ mọi CLOB v2 endpoint quan trọng: market và limit orders, biến thể FOK/FAK/GTC, đọc order book, đọc balance/allowance, và direct chain operations thông qua web3.py.

Ưu điểm: SDK trưởng thành, dễ phân tích dữ liệu với pandas, cộng đồng lớn, web3.py cho on-chain reads. Nhược điểm: async ergonomics kém hơn JavaScript, GIL giới hạn tăng tốc đa lõi (thường không đáng kể với bot thiên về I/O), thời gian khởi động trên cold containers chậm.

Khuyến nghị cho: 80% builder. Đặc biệt là những ai có chiến lược bao gồm backtesting, statistical analysis, hoặc bất kỳ công việc dữ liệu nào đi kèm execution.

Node.js (dev full-stack)

Node.js là stack được hỗ trợ tốt thứ hai. @polymarket/clob-client-v2 ở version 1.0.6 bao phủ cùng các endpoint như Python SDK với TypeScript types xuyên suốt. Async là native và nhanh; xử lý WebSocket rất tốt.

Ưu điểm: async tốt nhất, TypeScript types native, hệ sinh thái lớn cho HTTP + WS, dễ triển khai trên cùng Node runtime với web dashboard. Nhược điểm: độ chính xác số cần BigInt hoặc xử lý dạng string cho token IDs lớn (ERC-1155 IDs là 256-bit), công cụ dữ liệu tương đương pandas kém hơn.

Khuyến nghị cho: builder đã duy trì JavaScript stack và muốn một runtime duy nhất. Cũng phù hợp với bất kỳ ai xây dashboard cùng bot - chia sẻ types giữa bot core và dashboard Next.js giúp loại bỏ một nhóm bug.

Rust (hot path nhạy latency)

Rust không có official Polymarket SDK. Bạn xây trực tiếp trên V2 REST và WebSocket APIs bằng reqwest (HTTP), tokio-tungstenite (WebSocket), và ethers-rs hoặc alloy để ký. Thời gian setup khoảng hai ngày so với 30 phút trong Python.

Ưu điểm: EIP-712 signing native không cần JS subprocess, tạo order dưới millisecond, memory profile có tính quyết định dưới tải lớn, không có GC pauses. Nhược điểm: không có SDK nghĩa là bạn phải tự triển khai những gì người dùng Python có sẵn (parsing clobToken ID, validation response schema, quản lý salt/nonce). Lợi thế latency là 20-100ms so với Python đã tối ưu, chỉ quan trọng với chiến lược dưới một giây.

Khuyến nghị cho: hot path của market-making bot, hoặc nhánh thực thi lệnh của news-arb bot. Gần như không bao giờ là toàn bộ bot.

Lệnh setup cho từng stack

Những lệnh tối thiểu để có một signed order hoạt động trên mainnet (một CLOB v2 endpoint).

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: ~10 phút với Python, ~15 phút với Node, ~4-8 giờ với Rust.

Code skeleton: fetch order book trong 3 ngôn ngữ

Cùng một tác vụ - fetch order book cho một Polymarket token - trong từng stack. Cả ba đều gọi cùng một CLOB v2 REST endpoint.

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 (direct 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]);

Cấu trúc response giống nhau ở cả ba. Chi phí của Rust nằm ở mọi thứ khác - signing, order construction, error handling - chứ không phải ở read path.

Khi nào nên kết hợp stack (Python control plane + Rust hot path)

Pattern mà nhiều production bots hội tụ về: Python cho mọi thứ liên quan đến quyết định, Rust cho nhánh thực thi trong mili-giây.

Kiến trúc: một Python process đọc market state, chạy strategy logic, và ghi một file lệnh nhỏ (ví dụ {"action":"buy","token":"...","size":10,"price":0.45}) vào Unix socket. Một Rust daemon lắng nghe socket đó, ký order, và gửi nó lên CLOB. Python process có thể chậm nhưng tiện; Rust daemon thì nhanh và tối giản.

Chuyển giao là điểm then chốt: bằng cách cô lập bước signed-order, bạn giảm rủi ro crash của Python mà không phải hy sinh latency. Chúng tôi dùng đúng pattern này trong production bots của mình - Python phát ra ý định, một Node daemon trên /tmp/clob.sock xử lý signing. Phiên bản daemon bằng Node là đủ tốt cho dưới 100ms; chỉ khi thấp hơn 50ms thì Rust mới thực sự đáng giá.

Câu hỏi thường gặp

py-clob-client có tương thích với Polymarket V2 không?
Có. py-clob-client 0.34.6 (phiên bản chúng tôi đang chạy trong production trên VPS tính đến tháng 5 năm 2026) tương thích V2 và hoạt động với quá trình migration thế chấp pUSD. Gói được cài bằng "pip install py-clob-client".
SDK Polymarket chính thức cho Node.js là gì?
@polymarket/clob-client-v2 (hiện là v1.0.6 tính đến tháng 5 năm 2026). Phần "v2" trong tên gói là rất quan trọng - package @polymarket/clob-client cũ là V1 và không được khuyến nghị cho dự án mới. Cài bằng "npm install @polymarket/clob-client-v2".
Có official Rust Polymarket SDK không?
Không. Tính đến tháng 5 năm 2026, Polymarket chưa có official Rust SDK. Người dùng Rust xây trực tiếp trên V2 REST và WebSocket APIs bằng ethers-rs (để EIP-712 signing) và reqwest hoặc hyper (cho HTTP/WS). Cần viết nhiều code hơn, nhưng lợi thế latency và concurrency rất đáng kể cho market making.
Tôi có thể dùng Go cho Polymarket bot không?
Có, về mặt kỹ thuật - Go có thư viện HTTP và Ethereum tốt (go-ethereum). Không có official Go SDK, nên bạn sẽ xây trực tiếp trên REST API. Chúng tôi không thấy Go được dùng cho Polymarket bot phổ biến như Python hoặc Node.js, nhưng hoàn toàn khả thi.
Nếu biết cả Python lẫn Node.js thì nên dùng cái nào?
Python nếu chiến lược của bạn nặng về research (pandas, NumPy, scikit-learn). Node.js nếu chiến lược của bạn là real-time / event-driven và bạn muốn cùng một ngôn ngữ cho client và server. Cả hai đều truy cập được cùng CLOB endpoints; cả hai đều đủ nhanh cho mọi chiến lược không phải HFT.
Tôi có cần TypeScript cho Node SDK không?
Không bắt buộc, nhưng được khuyến nghị. @polymarket/clob-client-v2 đi kèm TypeScript types, và việc bắt lỗi type ở compile time sẽ tiết kiệm rất nhiều thời gian debug khi EIP-712 signature payload hoặc order types bị sai.
Polymarket bot cần nhanh đến mức nào?
Phần lớn chiến lược chỉ cần đủ tốt ở mức mili-giây, không phải micro-giây. Sports microstructure và market making hưởng lợi từ dưới 100ms; news arbitrage chấp nhận 500-1000ms. Hãy dùng Python cho strategy logic, chỉ chuyển sang Rust cho hot path nếu latency profiling chứng minh nó ảnh hưởng đến edge của bạn.