Как перестать писать парсеры для каждого рынка предсказаний и начать торговать
Если вы когда-нибудь пытались собрать данные с Polymarket или Kalshi, то знаете, что это то еще удовольствие. У каждой площадки свои эндпоинты, разные структуры ответов и совершенно непохожие способы авторизации. Пока настраиваешь получение цены для одного события, на другом рынке уже всё изменилось.
Недавно я наткнулся на проект pmxt (Prediction Market eXchange Tool), который пытается решить эту проблему так же, как в своё время это сделал знаменитый CCXT для криптобирж. Идея простая: дать разработчикам единый интерфейс для работы с десятком разных площадок.
Что под капотом
Проект написан на TypeScript, но поставляется сразу в двух вариантах: как npm-пакет pmxtjs и как Python-библиотека pmxt. Это огромный плюс, потому что аналитики любят Python за его библиотеки для обработки данных, а бэкенд-разработчики часто выбирают Node.js для написания торговых ботов.
Основная фишка здесь в унификации. Библиотека поддерживает Polymarket, Kalshi, Limitless и еще несколько площадок поменьше. Вместо того чтобы изучать документацию каждой биржи, вы используете общие методы вроде fetch_events или create_order.
Абстракции, которые упрощают жизнь
Авторы pmxt ввели логичную иерархию, которая помогает не запутаться в структуре рынков:
- Event: Общая тема. Например, выборы или назначение главы центробанка.
- Market: Конкретный вопрос внутри темы, на который можно поставить деньги.
- Outcome: Исход события — те самые «Да» или «Нет», которые мы покупаем.
Вот как это выглядит в коде на Python:
import pmxt
api = pmxt.Exchange()
# Ищем событие по ключевым словам
events = api.fetch_events(query='Who will Trump nominate as Fed Chair?')
fed_event = events[0]
# Находим нужный маркет внутри события
warsh = fed_event.markets.match('Kevin Warsh')
print(f"Текущая цена: {warsh.yes.price}")
В TypeScript всё практически идентично, что удобно, если вы работаете в мультизадачной команде.
Переход от чтения к торговле
Самое интересное начинается, когда дело доходит до исполнения ордеров. Библиотека берет на себя всю грязную работу по подписанию транзакций и работе с ключами.
Для каждой биржи настройки свои, но логика API остается неизменной. Например, для Polymarket нужно пробросить приватный ключ и адрес прокси-контракта, а для Kalshi — API-ключ и RSA-ключ.
Пример создания ордера:
exchange = pmxt.Polymarket(
private_key=os.getenv('POLYMARKET_PRIVATE_KEY'),
proxy_address=os.getenv('POLYMARKET_PROXY_ADDRESS')
)
# Проверяем баланс перед сделкой
balance = exchange.fetch_balance()
print(f"Доступно: {balance[0].available}")
# Покупаем исход по лимитной цене
order = exchange.create_order(
outcome=markets[0].yes,
side='buy',
type='limit',
price=0.33,
amount=100
)
Стоит ли переходить с Dome API
Если вы уже используете Dome API для Polymarket, разработчики pmxt подготовили скрипт для миграции. Команда npx dome-to-pmxt ./src должна автоматически переписать ваш код под новый интерфейс. Это смелый шаг — ребята явно метят в стандарт индустрии.
Кстати, в репозитории есть папки с примерами для обоих языков. Там можно подсмотреть, как работать с вебсокетами (если нужно получать котировки в реальном времени) или как строить более сложные стратегии арбитража между площадками.
Кому это пригодится
Я вижу два основных сценария использования. Первый — это арбитраж. Разница в ценах на одно и то же событие между Polymarket и Kalshi возникает постоянно, и иметь под рукой инструмент, который понимает оба API «из коробки», — большое преимущество.
Второй сценарий — создание агрегаторов данных или дашбордов. Вместо того чтобы поддерживать пять разных коннекторов, вы просто подключаете pmxt и фокусируетесь на UI или аналитике.
В проекте сейчас около тысячи звезд, что для такой узкой ниши вполне прилично. Документация на сайте pmxt.dev выглядит опрятно, хотя некоторые разделы еще в процессе наполнения. Если вы планируете заходить в тему рынков предсказаний со своим кодом, этот инструмент точно сэкономит вам пару недель жизни.