POLYANA
54 subscribers
20 photos
1 video
18 links
We dive deeper into Polymarket than most.

Break down how to work with CLOB,
pricing, bots, and trading strategies.

For those who want to understand the market.
Download Telegram
Обновленная база данных.

- polymarket_btc_5m_public.db
- BTC Up/Down 5-min raw data (Mar 11-24)
- ticks + orderbook + windows
- No strategy data included
- Size: 180 MB unzipped

#updated_data | POLYANA
Polymarket вводит новые комиссии - что меняется с 30 марта

Polymarket обновляет структуру комиссий. Сейчас TAKER FEE есть только на рынках Crypto и Sports. С 30 марта - на всех категориях, кроме Geopolitics.

Что сейчас (до 30 марта)

Crypto: peak rate 1.56%
Sports: peak rate 0.44%
Все остальное: 0%

Что будет (с 30 марта)

11 категорий, каждая со своей ставкой:

Категорія       Peak Rate   Maker Rebate
─────────────────────────────────────────
Crypto 1.80% 20%
Sports 0.75% 25%
Finance 1.00% 50%
Politics 1.00% 25%
Economics 1.50% 25%
Culture 1.25% 25%
Weather 1.25% 25%
Tech 1.00% 25%
Mentions 1.56% 25%
Other 1.25% 25%
Geopolitics 0% —


Как считается комиссия

# Формула:
# fee = C * p * feeRate * (p * (1 - p))^exponent
#
# C = кількість shares
# p = ціна share
# Peak rate = при p = 0.50 (максимальна невизначеність)
# При p → 0 або p → 1 комісія → 0

# Приклад: купуєш YES за $0.75 на Crypto ринку
p = 0.75
fee_rate = 0.072
exponent = 1
shares = 100

fee_per_share = p * fee_rate * (p * (1 - p)) ** exponent
# = 0.75 * 0.072 * (0.75 * 0.25)^1
# = 0.75 * 0.072 * 0.1875
# = 0.01013 за share (~1.01%)

total_fee = shares * fee_per_share
# = $1.01 на 100 shares


Что это означает для Up/Down трейдеров

BTC Up/Down - это категория Crypto. Peak rate вырастает с 1.56% до 1.80%.

Но есть нюанс. Комиссия симметричная - чем ближе цена к 0 или 1, тем меньше платишь. На наших типичных entry $0.70-0.85 эффективная ставка = ~1.0-1.3%.

При 80 трейдах в день со стейком $20:
Зараз:  ~$0.25/trade × 80 = ~$20/день
Після: ~$0.30/trade × 80 = ~$24/день
Різниця: +$4/день (~$120/міс)


Не критично, но съедает часть EDGE. Для стратегий с маленьким EV на трейд - может быть решающим.

Maker Rebate

20% собранных комиссий возвращаются мейкерам ежедневно. То есть если ставишь лимитные ордера, а не маркетные - часть комиссии получишь обратно.

Для ботов (API)


# Перевірити поточну ставку для токена:
import requests

resp = requests.get(
"https://clob.polymarket.com/fee-rate",
params={"token_id": your_token_id}
)
fee_bps = resp.json() # в basis points

# SDK (python/ts/rust) рахує автоматично
# REST API — потрібно додавати feeRateBps в signed order


Docs: docs.polymarket.com/trading/fees

#poly_updates | POLYANA
Как читать стакан на Polymarket

Ты уже знаешь, что цену YES и NO определяют трейдеры. Но как именно? Через СТАКАН - книгу ордеров.

Стакан состоит из двух сторон:

BID - сколько покупатели готовы заплатить
ASK - за сколько продавцы готовы продать

Ты всегда покупаешь по ASK. Продаешь по BID.

Пример

Открываем стакан YES токена:
ASK (продають)
$0.74 — 120 shares
$0.72 — 85 shares
$0.70 — 200 shares ← найкраща ціна
──────────────────────
BID (купують)
$0.68 — 150 shares ← найкраща ціна
$0.65 — 300 shares
$0.62 — 90 shares


Хочешь купить YES прямо сейчас - платишь $0.70. Хочешь продать - получаешь $0.68.

Разница между лучшим ASK и BID - это СПРЕД. Здесь: $0.70 - $0.68 = $0.02.

Почему спред важен?

Спред - это твой скрытый убыток при входе. Купил за $0.70, сразу же продал - получил $0.68. Минус $0.02 еще до того, как рынок вообще сдвинулся.

На активных окнах спред бывает $0.01-0.02. На "мертвых" - $0.05-0.10. Заходить в рынок с большим спредом = сразу быть в минусе.

Как получить стакан через API

import requests

token_id = "28982754460..." # YES токен

resp = requests.get(
"https://clob.polymarket.com/book",
params={"token_id": token_id}
)
book = resp.json()

best_ask = book["asks"][0] # найдешевший продавець
best_bid = book["bids"][0] # найдорожчий покупець

print(f"ASK: {best_ask['price']} x {best_ask['size']}")
print(f"BID: {best_bid['price']} x {best_bid['size']}")
print(f"Спред: {float(best_ask['price']) - float(best_bid['price']):.3f}")


Ликвидность

Еще одна вещь из стакана - сколько shares можно купить. Если ты хочешь купить на $500, а в ASK $0.70 стоит всего 50 shares ($35) - остальное придется добирать выше, по $0.72, $0.74...

Реальная цена входа для большого объема всегда хуже, чем видно вверху стакана. Это называется slippage.

——————————————

📖 СЛОВАРЬ

BID - максимальная цена покупателя в стакане
ASK - минимальная цена продавца в стакане
СПРЕД - разница между ASK и BID, скрытая стоимость входа
ЛИКВИДНОСТЬ - сколько объема доступно в стакане
SLIPPAGE - ухудшение цены при покупке большого объема
CLOB API - API для чтения книги ордеров на Polymarket

#Entry | POLYANA
3
Инфраструктура торгового бота для Polymarket BTC 5-мин бинарных опционов

Polymarket каждые 5 минут открывает бинарный рынок:
"BTC выше/ниже текущей цены через 5 минут?"
Ордербук с двумя токенами (YES/NO), резолв через Chainlink RTDS oracle. Разберем, как построить real-time pipeline для торговли на этих рынках.

1. Ландшафт API

Для полноценного бота нужны три источника данных одновременно:
Binance WS ──→ BTC ціна + потік угод (OFI)
Gamma API ──→ пошук ринків за slug + резолюція
CLOB API ──→ ордербук + розміщення ордерів


Market discovery — рынки появляються за ~30с до открытия окна:
import requests, time

def find_market(window_start_ts: int) -> dict | None:
slug = f"btc-updown-5m-{window_start_ts}"
url = f"https://gamma-api.polymarket.com/events?slug={slug}"
resp = requests.get(url, timeout=5)
events = resp.json()
if not events:
return None
event = events[0]
for m in event.get("markets", []):
tokens = m.get("clobTokenIds", [])
return {
"slug": slug,
"yes_token": tokens[0],
"no_token": tokens[1],
"condition_id": m.get("conditionId", ""),
}
return None

# Вікно кожні 5 хв (00:00, 00:05, 00:10...)
now = int(time.time())
window_start = now - (now % 300)
market = find_market(window_start)


2. Трюк с комплементарными токенами

На Polymarket YES + NO = $1.00. Это дает неочевидную возможность для лучшего входа:
def get_best_yes_entry(yes_best_ask, no_best_bid):
"""
Найкраща ціна для купівлі YES:
min(YES ask, 1 - NO bid)

Приклад: YES ask = 0.87, NO bid = 0.14
-> 1 - 0.14 = 0.86 -- дешевше через NO сторону!
"""
candidates = []
if yes_best_ask and 0.01 < yes_best_ask < 0.99:
candidates.append(yes_best_ask)
if no_best_bid and 0.01 < no_best_bid < 0.99:
candidates.append(round(1.0 - no_best_bid, 2))
return min(candidates) if candidates else None

def get_best_no_entry(no_best_ask, yes_best_bid):
"""Аналогічно для NO сторони."""
candidates = []
if no_best_ask and 0.01 < no_best_ask < 0.99:
candidates.append(no_best_ask)
if yes_best_bid and 0.01 < yes_best_bid < 0.99:
candidates.append(round(1.0 - yes_best_bid, 2))
return min(candidates) if candidates else None

Многие боты смотрят только на YES ask — и переплачивают на 1-3 цента. На 100 сделок в день это $1-3 потерянного edge ежедневно.

#Intermediate | POLYANA
POLYANA
Инфраструктура торгового бота для Polymarket BTC 5-мин бинарных опционов Polymarket каждые 5 минут открывает бинарный рынок: "BTC выше/ниже текущей цены через 5 минут?" Ордербук с двумя токенами (YES/NO), резолв через Chainlink RTDS oracle. Разберем, как…
3. Real-time волатильность: 4 метода

Волатильность — ключевой вход для любой модели на 5-мин опционах. 4 варианта, которые стоит рассчитывать параллельно:

import numpy as np

def compute_sigmas(prices, window_min=30):
"""prices: [(timestamp, btc_price), ...]"""
ts = np.array([p[0] for p in prices])
px = np.array([p[1] for p in prices])
avg = px.mean()

# 1. Trail -- std ціни / середня
trail = np.std(px) / avg

# 2. Realized -- std логарифмічних ретурнів
log_ret = np.diff(np.log(px))
realized = np.std(log_ret)

# 3. Range -- (high - low) / avg
range_vol = (px.max() - px.min()) / avg

# 4. Max rolling -- max ковзних 1-хв std
max_std = 0.0
for i in range(len(ts)):
mask = (ts >= ts[i] - 60) & (ts <= ts[i])
if mask.sum() >= 5:
local = np.std(px[mask]) / avg
max_std = max(max_std, local)

dur = (ts[-1] - ts[0]) / 60
return {
"trail": trail,
"trail_pmin": trail / max(dur, 0.1),
"realized": realized,
"realized_pmin": realized / max(dur, 0.1),
"range": range_vol,
"max_rolling": max_std,
}


Какой тип выбрать?

trail / realized — для моделей с нормальным распределением
range — робастный, не чувствительный к выбросам
max_rolling — консервативная оценка (завышает σ → меньше ложных сигналов)

Нормализация _pmin (per minute) позволяет корректно сравнивать разные таймфреймы.

4. Order Flow Imbalance с Binance


Поток Binance aggTrade даёт ~50 сообщений/сек для BTC. Из этого потока можно извлечь OFI — метрику давления покупателей/продавцов:
import json, time, threading
from collections import deque

class BinanceOFI:
def __init__(self, buffer_size=30_000):
self._buffer = deque(maxlen=buffer_size)
self._lock = threading.Lock()

def on_message(self, raw):
msg = json.loads(raw)
ts = msg["T"] / 1000
price = float(msg["p"])
qty = float(msg["q"])
is_sell = msg["m"] # True = market sell
notional = price * qty
with self._lock:
self._buffer.append((ts, notional, is_sell))

def compute(self):
now = time.time()
ofi_1 = ofi_5 = 0.0
buy_1 = sell_1 = 0.0
count_1 = 0
with self._lock:
cutoff = now - 300
while self._buffer and self._buffer[0][0] < cutoff:
self._buffer.popleft()
for ts, notional, is_sell in self._buffer:
signed = -notional if is_sell else notional
age = now - ts
if age <= 60:
ofi_1 += signed
count_1 += 1
if is_sell: sell_1 += notional
else: buy_1 += notional
ofi_5 += signed
total = buy_1 + sell_1
return {
"ofi_1min": ofi_1, "ofi_5min": ofi_5,
"buy_vol_1min": buy_1, "sell_vol_1min": sell_1,
"vol_imbalance": (buy_1-sell_1)/total if total else 0,
"trade_count_1min": count_1,
}


wss://stream.binance.com:9443/ws/btcusdt@aggTrade

Сильный дисбаланс buy/sell объема может быть предиктором направления BTC. Но нюанс — на микроструктуре OFI часто работает контр-интуитивно: когда все покупают, цена уже отразила это давление.

#Intermediate | POLYANA
POLYANA
3. Real-time волатильность: 4 метода Волатильность — ключевой вход для любой модели на 5-мин опционах. 4 варианта, которые стоит рассчитывать параллельно: import numpy as np def compute_sigmas(prices, window_min=30): """prices: [(timestamp, btc_price)…
5. Подводный камень: Chainlink ≠ Binance

Polymarket резолвит через Chainlink RTDS oracle, а не Binance:
import json

def check_resolution(event):
for market in event.get("markets", []):
prices = market.get("outcomePrices", "")
if not prices:
return None
prices = json.loads(prices)
return "UP" if prices[0] == "1" else "DOWN"
return None


На реальных данных ~4.7% рынков резолвятся иначе, чем показывает Binance.
Если ваш бот ориентируется на цену Binance — получаете систематическую ошибку почти в 5% сделок.

Причина: Chainlink агрегирует цену с нескольких бирж с собственной задержкой.

6. Архитектура бота

┌──────────────┐  ┌──────────────┐  ┌──────────────┐
│ Binance WS │ │ Gamma API │ │ CLOB API │
│ aggTrade │ │ market disc │ │ book+orders │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────┐
│ Collector (1s loop) │
│ BTC, delta, sigma[], OFI, tau, entry_price │
└────────────────────┬────────────────────────────┘
▼
┌─────────────────┐
│ Strategy Loop │
│ signal -> order│
└────────┬────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────────┐ ┌─────────┐ ┌────────┐
│ CLOB │ │ SQLite │ │Telegram│
│ Order │ │ Log │ │ Alert │
└──────────┘ └─────────┘ └────────┘


7. Полезные эндпоинты

# Ордербук
GET https://clob.polymarket.com/book?token_id={TOKEN_ID}

# Пошук ринку
GET https://gamma-api.polymarket.com/events?slug=btc-updown-5m-{UNIX_TS}

# BTC realtime
WSS wss://stream.binance.com:9443/ws/btcusdt@aggTrade

# CLOB WebSocket (ордербук + угоди)
WSS wss://ws-subscriptions-clob.polymarket.com/ws/market


TL;DR:
1. Рынки появляются примерно за 30 секунд — ищите через Gamma API по slug
2. Entry = min(YES ask, 1 − NO bid) — всегда проверяйте обе стороны
3. Считайте несколько типов волатильности параллельно
4. OFI с Binance aggTrade — мощная фича, но может работать контр-интуитивно
5. Chainlink ≠ Binance: ~5% расхождений
6. Архитектура: async collector + strategy loop + отдельный трекер позиций


#Intermediate | POLYANA
На Polymarket вышло новое обновление для ставок на спортивные исходы.

Теперь рыночные ордера исполняются с задержкой в 1 секунду перед сопоставлением (matching), ранее за 3 секунды.

Может есть смысл присмотреться к спорту?

#poly_updates | POLYANA
Так ли много людей зарабатывает на Prediction Markets?

Свежее исследование по Polymarket от ESSEC Business School и ECGI показывает картину довольно знакомую для любого рынка: основная масса участников теряет деньги, а прибыль уходит очень узкому кругу сильных игроков.

Авторы проанализировали данные за 2022–2025 годы: более 1,4 млн пользователей, 70 млн сделок и свыше $20 млрд объема.

Результат показательный: около 71% участников в минусе, а топ-1% забирает 84% всей прибыли. То есть Polymarket для большинства — это не “легкие деньги на новостях”, а довольно эффективный рынок, где слабые системно платят сильным.

Лучшие результаты чаще у тех, кто качественнее читает цену, лучше оценивает вероятности и действует дисциплинированнее. А вот путь к убыткам вполне типичный: ставки на лонгшоты, лишние сделки, импульсивная торговля и роль обычного taker’а вместо поставщика ликвидности.

Вывод простой: Polymarket может хорошо отражать коллективные ожидания, но зарабатывать на нем без реального преимущества над рынком намного сложнее, чем кажется со стороны.

Ознакомится самостоятельно:
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=6443103

#poly_updates | POLYANA
Polymarket переезжает на CLOB V2 — 28 апреля, ~11:00 UTC

Крупнейший апдейт биржи. Ожидается около часа даунтайма.

https://x.com/polymarketdevs/status/2045173502328594677?s=46

Что важно знать:
- Все открытые лимитки будут отменены при переключении
- V1 после миграции перестанет работать полностью
- Залог переезжает с USDC.e на pUSD (оборачивается через Collateral Onramp)
- Новые адреса контрактов и новая структура ордеров
- Если торгуете через API/SDK — обновить интеграцию надо до 22-го

Средства и позиции в безопасности. Новая версия уже открыта для тестов всем желающим.

По безопасности: контракты CTFv2 открыты, аудит от Cantina и Quantstamp, параллельно запущена багбаунти-программа на $5M.

Гайд по миграции: docs.polymarket.com/v2-migration


#poly_updates | POLYANA
Архив исторических данных стаканов (orderbooks) Polymarket.

В архиве публикуются почасовые снапшоты стаканов всех рынков.

Что внутри

• Orderbook данные Polymarket
• Hourly snapshots (обновление каждый час)
• Формат Parquet — удобный для аналитики и обработки больших данных
• Бесплатный доступ для исследований

Для чего можно использовать

— research и анализ prediction-маркетов
— бэктестинг торговых стратегий
— анализ ликвидности рынков
— обучение ML / AI моделей
— построение аналитических инструментов

Ссылки

Архив данных
https://archive.pmxt.dev/

Основной сайт
https://www.pmxt.dev/

GitHub
https://github.com/pmxt-dev/pmxt

Документация
https://www.pmxt.dev/docs

#poly_updates | POLYANA
This media is not supported in your browser
VIEW IN TELEGRAM
Полик запускает торговлю фьючами
POLYANA
Polymarket переезжает на CLOB V2 — 28 апреля, ~11:00 UTC Крупнейший апдейт биржи. Ожидается около часа даунтайма. https://x.com/polymarketdevs/status/2045173502328594677?s=46 Что важно знать: - Все открытые лимитки будут отменены при переключении - V1 после…
Polymarket проводит масштабное обновление биржи

Платформа перешла с USDC.e на Polymarket USD (pUSD) с конвертацией 1:1 к USDC, при этом для большинства пользователей процесс прошёл автоматически, а для API-трейдеров доступен через wrap. В рамках обновления были очищены ордербуки и временно приостанавливались торги, после чего система запущена с обновлённой архитектурой.

На фоне запуска платформа выделила 1 000 000 долларов вознаграждений для пользователей, которые обеспечат ликвидность в первые 24 часа после обновления, что делает текущий момент ключевым для активных участников рынка.

#poly_updates | POLYANA
1
Эксплойт Polymarket

Появилась информация о крупной утечке данных с Polymarket. По заявлению злоумышленника (xorcat), было извлечено более 300,000 записей.

- Более 10 000 пользовательских профилей с персональными данными
- 250 000+ активных CLOB-рынков и ~48 500 gamma-маркетов.
- 4111 комментариев с привязкой к профилям.
- 9000 профилей подписчиков.
- 1000 отчётов (включая 58 уникальных ETH-адресов и admin-индикаторы).
- 292 события с адресами отправителей и резолверов.
- 100 конфигураций наград (USDC-контракты, ставки).
- Утечка внутренних user ID

Общий объём: ~750 MB (JSON), сжатый архив ~8.3 MB

Причина — уязвимости API:
- Использование скрытых (undocumented) endpoints
- Обход пагинации (limit без ограничений, нет rate limit)
- Ошибка CORS (разрешены любые origin + credentials)
- Доступ к чувствительным endpoint без авторизации

Подтверждённые уязвимости (есть POC):
- SSRF через Axios (CVE-2025-62718, CVSS 9.9)
- Обход авторизации в Next.js (CVE-2024-51479)
- Открытые endpoints:
– /comments/{id} → утечка профилей
– /reports → активность пользователей + admin-индикаторы
– /v1/data/followers/{address} → полный соцграф

Дополнительно опубликовали:
- Полные дампы данных (markets, profiles, events и др.)
- 5 рабочих эксплойтов (CORS, SSRF, auth bypass, DoS, WebSocket)
- Скрипт для автоматического сбора новых данных
- Red Team отчёт с маппингом на MITRE ATT&CK

#poly_updates | POLYANA
Патчим py_clob_client под скорость

Polymarket прячется за Cloudflare и держит CLOB на стандартной питон-сборке requests — из коробки это означает:
- TLS-челленджи и периодические 403 от CF
- пересоздание TCP сокета на каждый POST.
На активной работе с ордерами набегает 200-400мс потерь на ровном месте.

Решение: HTTP-handler в py_clob_client на curl_cffi
import py_clob_client_v2.http_helpers.helpers as clob_helpers
from curl_cffi import requests as curl_requests

_session = curl_requests.Session(impersonate="chrome120")

def patched_request(endpoint, method, headers=None, data=None, params=None):
headers = clob_helpers._overload_headers(method, headers)
resp = _session.request(method=method, url=endpoint, headers=headers,
data=data, params=params, timeout=15)
if resp.status_code != 200:
raise clob_helpers.PolyApiException(resp)
return resp.json()

clob_helpers.request = patched_request

impersonate="chrome120" подделывает TLS-fingerprint (JA3/JA4 + HTTP/2 settings) под живой Chrome. CF перестаёт ставить челленджи, 403'шек больше нет. Бонусом — Session держит keep-alive: следующий запрос не платит handshake.

2. Pre-sign с кешем - главная победа по latency


Каждый presign на CLOB — это EIP-712 подпись через eth_account + сборка ордера = 100-150мс CPU. Если основной цикл регулярно зовёт presign_order, чтобы держать готовую подпись наготове, то перед самим выстрелом приходят ещё одна-две пересайны, хотя свежая подпись с прошлой итерации ещё валидна. В инструментарии стадия pre_fire стабильно сидела на 200-260мс.

Коротко-замыкание сверху функции:
def presign_order(self, token_id, price, amount, ...):
cached = self._presigned.get(token_id)
if cached and (now - cached["ts"] < 1.5) and abs(cached["price"] - price) < 0.01:
return cached["signed"] # ← пропускаем подпись
# иначе подписываем как обычно 1.5с

TTL стоит ниже 5с-порога, который fire_presigned использует для протухания - кеш гарантированно не остынет между обновлениями.

3. Затянули петли и сшивку
параметр               было  стало
Collector loop 200ms 50ms → 10ms
Основной цикл 100ms 20ms
Client refresh 200ms 50ms

HTTP к коллектору новый сокет каждый раз (requests.Session + pool_maxsize=2)
Persistent session сама по себе срезала 2-5мс с каждого /snapshot, потому что keep-alive теперь работает end-to-end.

Результат:
7-step stopwatch с наносекундными timestamps на каждый ордер. До/после (медианы
                              до       после
data_age 90ms 12ms (50→10мс поллинг)
decide 5ms 5ms
pre_fire 230ms 25ms (пресайн-кеш)
dispatch 15ms 12ms
submit→resp 180ms 135ms (curl_cffi/keep-alive)
db 3ms 3ms
─────────────────────────────────────
TOTAL ~520ms ~190ms

На выходе имеем ~330мс отыграно на каждом запросе. На быстрых движениях это разница между "успел" и "не успел" = "заработал" и "не заработал"

#Skilled|POLYANA
⚠️ Осторожно — возможны сбои на Polymarket
Похоже, лёг 5-минутный BTC-рынок (BTC Up/Down 5m). Что наблюдаем прямо сейчас:
• Стакан завис на 50¢ / 51¢ и не переоценивается — цена стоит на месте, даже когда BTC уходит далеко от таргета (видели разницу ~$90 при сохранении 50/51). • Объём $0, реальных сделок нет («Последнее: --»). • Книга идентична при повторных запросах — маркет-мейкер не двигается.
Что делать: • Не торгуйте 5м BTC-рынок, пока не восстановится — ордера могут не исполниться, а котировки не отражают реальную вероятность. • Возможно затронуты и другие 5м крипто-рынки — проверяйте стакан перед входом (объём, переоценку под спот). • По открытым позициям резолюция (Chainlink), скорее всего, отработает штатно — но входы/выходы сейчас ненадёжны.
Следим, отпишем когда оживёт.

POLYANA
YES token: best_bid=0.50  best_ask=0.51   44 bids / 45 asks   (63ms)
NO token: best_bid=0.49 best_ask=0.50 45 bids / 44 asks (46ms)