Как у меня тоже НЕ получился торговый бот на Polymarket: честный разбор ошибок и уроков

Как у меня тоже НЕ получился торговый бот на 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-канал с котировками стакана.

Вот схема моего бота (увы, она была слишком наивной):

  1. Получить список рынков.
  2. Отфильтровать по ключевым словам (например, "Fed").
  3. Подключиться к WebSocket и слушать обновления стакана.
  4. Для каждого изменения цены вычислять "сигнальную вероятность" из модели (например, биномиальная оценка на основе последних N сделок).
  5. Если сигнальная вероятность сильно отличалась от текущей цены — отправить лимитный ордер на покупку актива с ценой ниже текущей.
  6. Если ордер исполнялся — ждать, пока цена вырастет до целевого уровня, и продать.

Пример кода получения котировок:

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 копеечный, комиссий нет" — думал я. На практике у меня было две статьи расходов:

  1. Комиссия сети за подтверждение сделок (и особенно за отмену ордеров).
  2. Спред между ценой покупки и продажи (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% прибыльных сделок среднее матожидание отрицательное, потому что размер убытка был в два раза больше размера прибыли. Это классическая ловушка: стратегия умела мало зарабатывать и много терять.

Что сработало бы: рецепт "менее плохого" бота

Если бы я начал заново, я бы построил бота с нуля, соблюдая следующие принципы:

  1. Перестать гнаться за скальпингом. Высокочастотная торговля на Polymarket — удел профессионалов с колокацией. Мне нужно было выбрать длинные временные горизонты (дни, недели) и торговать только фундаментальные перекосы.
  2. Использовать проверенные данные. Вместо сырых котировок — собирать историю с временными метками через REST API, синхронизировать время по NTP на сервере и хранить данные в базе (SQLite или ClickHouse).
  3. Тестировать стратегию на скользящем окне. Вместо одного обучающего периода делать walk-forward оптимизацию, проверяя модель на новых данных каждую неделю.
  4. Обязательно использовать стоп-лосс. Для этого нужно мониторить цену и отправлять обратный ордер при падении ниже порога. Это добавит издержек, но ограничит потери.
  5. Учитывать спред и комиссии в бэктесте. Все расчёты должны включать реалистичные значения спреда и газ. Иначе вы увидите "идеальную" стратегию, которая существует только в воображении.

Код для расчёта спреда и комиссий при оценке сделки:

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: сначала проанализируйте риски, а потом пишите код. И не повторяйте моих ошибок.

← Все статьи

Комментарии

Читайте также

Show HN: Каким должен быть GUI для AI-агентов? Разбираем тренды и кейсы

31 июля 2026

Meta заявляет, что ИИ упрощает создание новых приложений — и их станет больше

31 июля 2026

Промпт-инжиниринг (Prompt Engineering): курс для будущего, где ИИ — рабочий инструмент

31 июля 2026

Музыка и аудиопроизводство в 2026: тренды, навыки и как AI-обучение помогает создавать треки

31 июля 2026

Черный пояс Lean Six Sigma: полное руководство по управлению качеством, которое приносит реальные результаты

31 июля 2026

Умный дом на Zigbee и Z-Wave: как подключить датчики и устройства к AI-агенту ASI Biont для автоматизации без кода

31 июля 2026

FRM — Финансовый риск-менеджер (Часть I + Часть II): Ваша дорожная карта к овладению финансовыми рисками

31 июля 2026

Кейс: Как основательница стартапа защитила своё ИИ-изобретение с помощью курса по интеллектуальной собственности от Asibiont

31 июля 2026

Топ-6 нейронок для генерации сайтов, страниц и иконок в 2026: рейтинг и практический разбор

31 июля 2026