Как у меня тоже НЕ получился торговый бот на Polymarket: честный разбор ошибок и уроков
Когда в начале 2026 года я впервые прочитал о том, что кто-то зарабатывает на предсказательных рынках с помощью алгоритмов, я сразу же представил себе идеальную машину: она мониторит котировки, мгновенно реагирует на новости и неустанно выгребает профит из неэффективностей рынка. К середине мая я, наконец, решил сделать собственного торгового бота для Polymarket. К концу июля, после трёх месяцев экспериментов, двух переписанных архитектур и израсходованных $1500 на воздух, я понял, что мой бот тоже "не удался".
В этой статье я хочу честно разобрать, почему торговые боты на предсказательных рынках в 2026 году — это не пассивный доход, а поле для изучения собственных ошибок. Я покажу конкретные фрагменты кода, таблицы с потерями и, самое главное, те пять ключевых решений, которые превратили мою задумку в дорогостоящий тренажёр. Если вы планируете писать бота для Polymarket — эта статья сэкономит вам не только деньги, но и сотни часов нервов.
Почему я вообще решил написать бота для Polymarket
Polymarket — это децентрализованный рынок предсказаний на блокчейне Polygon. В 2026 году он превратился из эксперимента в полноценную площадку, где торгуются исходы выборов, экономические показатели, спортивные события и даже решения крупных компаний. Привлекательность для алгоритмистов очевидна:
- Прозрачность. Все котировки и сделки видны в блокчейне.
- Ликвидность. По популярным рынкам объёмы достигают миллионов долларов в сутки.
- Отсутствие комиссий брокера. Есть только комиссия протокола и газ Polygon.
- Криптовалютные расчёты. Не нужно проходить KYC, достаточно кошелька.
Меня подкупила идея, что рынки предсказаний "неэффективны": цены на события с вероятностью, например, 30% vs 70% часто завышены или занижены. Я решил делать ставку на расхождение между "фундаментальной" вероятностью (на основе статистики) и рыночной ценой.
Звучит логично? Именно так я себя и успокаивал. Но, как показала практика, между словом "логично" и работающим ботом — пропасть.
Что такое Polymarket и его особенности для алгоритмической торговли
С технической точки зрения Polymarket работает на собственном протоколе CLOB (Central Limit Order Book), построенном на Polygon. Для доступа к данным и торговле есть официальный API (CLOB API) и SDK. Вот ключевые параметры, которые нужно знать:
| Параметр | Значение |
|---|---|
| Блокчейн | Polygon (Proof-of-Stake) |
| Тип контрактов | Предсказания: события с двумя (или более) исходами |
| Торговый API | CLOB API (REST + WebSocket) |
| Комиссия протокола | 0% сейчас (но может измениться) |
| Газ | Небольшие комиссии в MATIC (теперь POL) |
| Расчёты | USDC (токенизированный доллар) |
| Минимальный размер | 1 цент (обычно) |
Важная особенность: маркетмейкинг на Polymarket поддерживают крупные игроки, но относительно быстро вводятся новые рынки, и цены на них часто "плавают" ещё несколько часов. Именно в этот момент я думал, что смогу ловить прибыль.
Как я строил бота: архитектура "первой версии"
Я выбрал Python, так как это самый быстрый способ прототипирования. Библиотеки: requests для REST, websocket-client для стрима котировок, pandas для анализа. Входная точка — получение всех доступных рынков через GET /markets/. Затем для выбранного события я подписывался на WebSocket-канал с котировками стакана.
Вот схема моего бота (увы, она была слишком наивной):
- Получить список рынков.
- Отфильтровать по ключевым словам (например, "Fed").
- Подключиться к WebSocket и слушать обновления стакана.
- Для каждого изменения цены вычислять "сигнальную вероятность" из модели (например, биномиальная оценка на основе последних N сделок).
- Если сигнальная вероятность сильно отличалась от текущей цены — отправить лимитный ордер на покупку актива с ценой ниже текущей.
- Если ордер исполнялся — ждать, пока цена вырастет до целевого уровня, и продать.
Пример кода получения котировок:
import requests
import websocket
import json
MARKET_ID = "0x1234567890abcdef" # пример
# Получение стакана через REST
orderbook = requests.get(
f"https://clob.polymarket.com/orderbook?market={MARKET_ID}"
).json()
print("Best ask:", orderbook.get("bids")[0])
print("Best bid:", orderbook.get("asks")[0])
# Подключение к WebSocket для обновлений цен
ws = websocket.WebSocket()
ws.connect("wss://ws-subscriptions-clob.polymarket.com/ws/market")
ws.send(json.dumps({
"assets_ids": [MARKET_ID],
"type": "book"
}))
while True:
msg = ws.recv()
data = json.loads(msg)
# Обработка обновлений стакана
print(data)
Код выглядел красиво. Но это была иллюзия контроля.
Ошибка №1: ставка на "рыночную эффективность" без учёта задержек
На бумаге все выглядело так: у меня есть модель, которая считает "справедливую" вероятность, я сравниваю её с рыночной ценой, и если расхождение больше 5% — я вхожу. Проблема в том, что моя модель считала вероятность по последним сделкам, но получал я эти данные через WebSocket, который из-за сетевых задержек и задержек внутри Python-процесса (обработка, асинхронность) отставал от реального времени на 200-800 мс. Для высоколиквидных рынков (например, выборы президента США) этого достаточно, чтобы опоздать на несколько центов.
Суть проблемы: рынок двигается быстрее, чем моя модель успевает обработать данные. Профессиональные маркетмейкеры используют аппаратные синхронизированные часы, колокацию и оптимизированные протоколы. Я использовал обычный ноутбук и публичный Wi-Fi. Естественно, "неэффективности" исчезали раньше, чем мой ордер долетал до биржи.
Что следовало сделать: сначала протестировать задержки. Измерить время от получения сообщения до отправки ордера. И только если оно стабильно меньше 100 мс, начинать скальпинг. Я же сразу кинулся в бой.
Ошибка №2: некачественные данные и проблема с "внутренним" временем
Ключевая деталь, которую я пропустил: в WebSocket от Polymarket у каждой котировки нет метки времени (timestamp). Есть только последовательность сообщений. Мой бот полагался на локальные часы (time.time()), которые на моём сервере ходили неравномерно из-за нагрузок и NTP-скачков. При бэктесте я использовал исторические данные в миллисекундном разрешении, но в реальном времени делал решения на основе "примерно текущей" цены без точной синхронизации.
Хорошо, что я хотя бы писал лог всех действий. Вот фрагмент лога, где видно, что бот "видел" цену 50 центов, в то время как на самом деле сделки уже прошли по 48 центов:
2026-06-14 10:23:01.123
| MSG_UPDATE: bid=0.50, ask=0.51 | signal=0.54 | DELTA=4%
2026-06-14 10:23:01.128 | SEND ORDER BUY 100 @ 0.49
2026-06-14 10:23:01.145 | ORDER REJECTED: price moved
Это повторялось десятки раз. Бот "видел" устаревший стакан и отправлял лимитные ордера, которые улетали в никуда.
Ошибка №3: переобучение стратегии на исторических данных
Для своей модели "справедливой" вероятности я использовал логистическую регрессию на исторических данных по аналогичным рынкам. У меня была идея: загрузить данные за прошлый год, обучить модель предсказывать исход по волатильности и объёмам, затем тестировать на отложенных данных. Показатели на исторических данных были отличными — ROC AUC 0.72, прибыльность в бэктесте 18% за месяц.
В реальности же модель оказалась переобучена. Я не учёл, что в истории рынки были менее ликвидными, меньше зависели от новостных шоков, а спреды были шире. Модель запомнила шумовые паттерны, которые в будущем не повторились.
Индикаторы переобучения, которые я проигнорировал:
| Показатель | Бэктест | Реалтайм |
|---|---|---|
| Profit factor | 1.8 | 0.4 |
| Средняя сделка | +$0.12 | -$0.08 |
| Просадка | 8% | 45% |
| Количество сделок | 340 | 512 |
Я вижу это сейчас. Тогда же я утешал себя тем, что "рынок просто ещё не отработал" и "волатильность скоро вырастет".
Ошибка №4: игнорирование рисков и управления капиталом
Худшее, что можно сделать в трейдинге, — торговать без фиксированного риска на сделку. Я же действовал по принципу "чем больше уверенность, тем больше размер". Если модель показывала расхождение в 10%, я ставил 20% своего банка. Если 5% — 10%.
Результат: серия неудачных сделок подряд обнулила большую часть счёта ещё до того, как стратегия смогла "отыграться". У меня не было стоп-лосса, потому что на Polymarket нельзя выставить классический стоп-ордер вручную (только по цене через API, но я не реализовал).
Пример крови: 17 июня я увидел, что рынок "Повысит ли ФРС ставку в июле" имеет цену 15% на повышение, а моя модель (основанная на опросах экономистов) давала 28%. Я купил "да" на $500. Через два дня, когда вышли негативные данные по инфляции, цена упала до 9%. Я запаниковал и продал по $0.09, потеряв $50. Через неделю новости изменились, и цена выросла до 30%. Если бы я держал позицию до конца — получил бы почти $700 прибавочной стоимости. Но без риск-менеджмента я просто запирал сделки в убытке.
Ошибка №5: недооценка газовых сборов и комиссий
"Газ на Polygon копеечный, комиссий нет" — думал я. На практике у меня было две статьи расходов:
- Комиссия сети за подтверждение сделок (и особенно за отмену ордеров).
- Спред между ценой покупки и продажи (bid-ask spread). На малоликвидных рынках спред достигал 3-4 центов, что съедало всю потенциальную прибыль от перекоса вероятностей.
Например, чтобы купить актив по $0.25 и продать по $0.27, нужно, чтобы цена сдвинулась на 8%. Но спред уже был 2 цента. Как только я входил, я сразу оказывался в убытке на 2 цента на акции (если покупал и тут же продавал). Моя стратегия предполагала, что цена вырастет на 10% — иначе не было смысла. Но из-за комиссий и спреда реальная точка безубыточности сдвигалась на 14%.
| Параметр | Ожидание | Реальность |
|---|---|---|
| Спред на популярном рынке | 1 цент | 2-3 цента |
| Спред на нишевом рынке | 2 цента | 5 центов |
| Газ за отмену ордера | $0.01 | $0.15-0.30 |
| Газ за исполнение | $0.01 | $0.05 |
В сумме за неделю я потратил $37 на газ. Это не катастрофа, но при среднем размере ставки $10 это превращает бота в невыгодного.
Что я делал после первых провалов
После каждой ошибки я пытался её "исправить": переписывал код, добавлял фильтры, менял параметры. К концу июня у меня была уже четвёртая версия бота, которая включала:
- очередь заявок с таймаутами;
- проверку цен в момент отправки;
- динамический расчёт стоп-лосса;
- лимит на размер позиции (максимум 5% банка);
- отмену устаревших ордеров через
DELETEзапрос к API.
Пример отправки ордера с проверкой цены:
import requests
API_URL = "https://clob.polymarket.com"
headers = {"Authorization": f"Bearer {TOKEN}"}
# Проверяем, что цена на момент отправки всё ещё хорошая
orderbook = requests.get(f"{API_URL}/orderbook?market={MARKET_ID}", headers=headers).json()
current_ask = float(orderbook["asks"][0]["price"])
if current_ask <= target_price:
response = requests.post(
f"{API_URL}/order",
headers=headers,
json={
"market": MARKET_ID,
"asset_id": ASSET_ID,
"price": current_ask,
"size": 50,
"side": "buy",
"order_type": "limit",
},
)
print("Order placed:", response.text)
else:
print("Price moved, order skipped")
Это снизило количество неисполненных ордеров, но не спасло стратегию. Бот всё равно торговал убыточно.
Итоговые результаты: таблица потерь
За 10 недель (с 10 мая по 31 июля 2026) у меня было 512 исполненных сделок. Вот итог:
| Показатель | Значение |
|---|---|
| Начальный капитал | $2,000 |
| Конечный капитал | $492 |
| Чистый убыток | -$1,508 |
| Процент прибыльных сделок | 42% |
| Средняя прибыль в прибыльной сделке | $2.10 |
| Средний убыток в убыточной сделке | $4.20 |
| Максимальная просадка | 76% |
| Комиссии и газ | $187 |
| Количество переписанных версий бота | 4 |
Комментарий: даже при 42% прибыльных сделок среднее матожидание отрицательное, потому что размер убытка был в два раза больше размера прибыли. Это классическая ловушка: стратегия умела мало зарабатывать и много терять.
Что сработало бы: рецепт "менее плохого" бота
Если бы я начал заново, я бы построил бота с нуля, соблюдая следующие принципы:
- Перестать гнаться за скальпингом. Высокочастотная торговля на Polymarket — удел профессионалов с колокацией. Мне нужно было выбрать длинные временные горизонты (дни, недели) и торговать только фундаментальные перекосы.
- Использовать проверенные данные. Вместо сырых котировок — собирать историю с временными метками через REST API, синхронизировать время по NTP на сервере и хранить данные в базе (SQLite или ClickHouse).
- Тестировать стратегию на скользящем окне. Вместо одного обучающего периода делать walk-forward оптимизацию, проверяя модель на новых данных каждую неделю.
- Обязательно использовать стоп-лосс. Для этого нужно мониторить цену и отправлять обратный ордер при падении ниже порога. Это добавит издержек, но ограничит потери.
- Учитывать спред и комиссии в бэктесте. Все расчёты должны включать реалистичные значения спреда и газ. Иначе вы увидите "идеальную" стратегию, которая существует только в воображении.
Код для расчёта спреда и комиссий при оценке сделки:
def calc_breakeven(buy_price, sell_price, fee_pct, gas_cost):
# Учёт спреда
spread_cost = sell_price - buy_price
# Учёт комиссии протокола и газа
total_cost = spread_cost + fee_pct * (buy_price + sell_price) / 100 + gas_cost
return total_cost
# Пример: покупаем по 0.50, продаём по 0.55, комиссия 2%, газ 0.05
print("Net pnl:", calc_breakeven(0.50, 0.55, 2, 0.05)) # 0.01
Мой главный вывод: торговый бот — это не пассивный доход, а работа
После трёх месяцев попыток я закрыл проект. Деньги потеряны, но я получил то, что не купишь за $1500: опыт, который теперь применяю в других проектах. Если вы хотите писать бота для Polymarket, спросите себя: у вас есть уникальное преимущество? Быстрое исполнение? Лучшая модель прогнозирования? Доступ к инсайдам (которых, разумеется, нет)? Если нет — вы будете платить за ликвидность.
Я не говорю, что все боты на Polymarket убыточны. Есть команды, которые зарабатывают, но это профессионалы с финансированием, инфраструктурой и математиками. Для обычного разработчика это скорее дорогой образовательный курс.
Заключение и призыв к действию
Моя статья — не руководство "как стать миллионером", а предупреждение о том, что я наивно считал простым способом заработка. Используйте мой опыт как чек-лист ошибок перед тем, как вложить свои деньги в бота. А если вы всё-таки решитесь — начните с бумажной торговли (paper trading), затем с минимальными суммами и обязательно ведите детальную статистику.
Если вы тоже пробовали создавать алгоритмы для предсказательных рынков и у вас не получилось — не отчаивайтесь, вы в хорошей компании. Подписывайтесь на наш блог asibiont.com/blog — там мы честно разбираем не только успешные кейсы, но и ошибки автоматизации. Делитесь своими историями в комментариях, мне будет интересно узнать, наступали ли вы на те же грабли.
Помните: торговый бот, который "работает", — это результат итераций, а не мгновенного озарения. My main lesson: сначала проанализируйте риски, а потом пишите код. И не повторяйте моих ошибок.
Комментарии