Как я построил ИИ-агента, который торгует за меня на Polymarket — и что из этого вышло
Три недели назад я решил проверить одну гипотезу: если на предиктивном рынке есть человек, который стабильно зарабатывает миллионы, можно ли просто идти за ним след в след? Не угадывать самому, не строить сложные модели — а буквально копировать его сделки в реальном времени. Оказалось, что да — но путь от идеи до работающей системы получился куда длиннее и куда интереснее, чем я думал.
Трейдер, за которым я решил идти
На Polymarket — бирже предсказаний, где люди торгуют исходами реальных событий: кто выиграет матч, кто станет президентом, закончится ли война — есть трейдер. На момент, когда я на него наткнулся, его накопленный профит перевалил за 9.6 миллионов долларов. Не разовая удача — систематика, месяцами. Я разобрал его активность по публичному API до последней сделки и увидел паттерн, который выдаёт в нём не casual-игрока: 25 покупок за 57 секунд одновременно в шести разных live-матчах, в разных видах спорта. Это не человек с телефоном в руке. Это либо бот, либо команда с очень дисциплинированным процессом.
Логичный вопрос: а можно ли просто встать у него за спиной? Я решил не гадать, а проверить экспериментально — написать своего бота, который копирует его сделки в реальном времени, сначала в полной симуляции, на реальных ценах и реальных задержках, без единого цента настоящих денег.
Первые открытия: как трейдер выходит из позиций
Первые пробные сессии дали смешанный, но обнадёживающий результат — бот то зарабатывал скромные деньги, то немного терял. Но по-настоящему интересное открытие было не про деньги, а про механику. Я залез в историю сделок за три месяца и обнаружил: прямых продаж там — 25 штук. Всего. При сотнях покупок в день. Он практически никогда не продаёт напрямую в стакан. Вместо этого, когда хочет зафиксировать позицию, он покупает ПРОТИВОПОЛОЖНУЮ сторону того же рынка — токены мерджатся в доллар, и это его способ выйти в кэш без единой рыночной продажи.
Я не поверил с первого раза — перепроверил на 138 подобных событиях на сумму 38 тысяч долларов. Подтвердилось дважды. Научил бота ловить именно этот сигнал: как только покупает противоположную сторону рынка, где у нас уже открыта позиция, бот продаёт синхронно с ним, не дожидаясь собственных индикаторов. Это стало основным механизмом выхода из позиций на все оставшиеся недели эксперимента.
Первая серьёзная просадка — и разбор полётов
После пары удачных сессий бот ушёл в минус. Первым порывом было списать это на "рынок такой" и двигаться дальше. Я так не делаю. Разобрал каждую убыточную сделку по отдельности и нашёл: 90% всего минуса — это не случайность. Семь позиций умерли в ноль, потому что rn1 ни разу не захеджировал именно эти рынки — сигнала выхода не было вообще, а у бота не было защиты снизу без него. Добавил аварийный выход: если позиция улетает почти в ноль и мы уже в минусе — продаём немедленно, не дожидаясь, пока трейдер соизволит захеджироваться.
Отдельно нашёл дыру в фильтре видов спорта — бот должен был игнорировать футбол (там своя специфика волатильности), но мелкие скандинавские лиги проходили фильтр незамеченными, потому что классификатор искал знакомые аббревиатуры крупных лиг и не узнавал местные клубные обозначения. Формально фильтр стоял "выключить футбол", а футбол всё равно торговался.
Эксперимент "максимальное копирование" и его крах
В какой-то момент я задался вопросом: а что, если мы вообще неправильно понимаем стратегию? Снял живой снапшот его открытых позиций и увидел: он реально держит убыточные ноги долго и глубоко — минус 85%, минус 92% нереализованного убытка — и не режет их. У него есть позиции, которые уже можно обналичить (рынок решился), а он просто сидит, ничего не делает. Его прибыль строится не на избегании убытков, а на том, что победители в плюс 200%, 150% перекрывают отдельные крупные потери.
Логика подсказывала: может, наш собственный Stop Loss в 5% агрессивнее его собственного риск-допуска на порядок, и мы режем позиции, которые он сам держит до победного. Выключил полностью TP, SL, трейлинг — оставил только хедж-выход и автоматическую фиксацию, когда рынок фактически решён. Результат первой полной сессии с этой конфигурацией: минус 162 доллара за первую половину дня. Рынок вежливо объяснил, что чужие принципы риск-менеджмента — это не то же самое, что своя защита.
Разобрал день по категориям и нашёл настоящего виновника: не футбол, не вид спорта вообще, а конкретный ТИП рынка. Ставки вида "а закончится ли матч вничью?", "кто поведёт в перерыве?", "тотал больше 2.5?" — экзотика с тонким стаканом, где любое движение цены превращается в разрывной гэп прямо нам в лицо. На простом "кто выиграет матч" бот вёл себя прилично. На проп-беттинге — как будто специально шёл топиться. Написал отдельный фильтр именно под такие рынки, прогнал на всей истории дня — не ошибся ни разу. Вторая половина того же дня, с той секунды, как фильтр включился, минус схлопнулся с 162 долларов до 5.
Перенос на выделенный сервер — и цирк с VNC-консолью
Всё это время бот работал только на моём компьютере — выключил его на ночь, симуляция встала, а рынок за это время не спит. Решил снять отдельный сервер, который работает круглосуточно. Взял — и уткнулся в первую стену: у сервера оказался заблокирован SSH-доступ, причём не сервером, а моим же домашним интернет-провайдером. Техподдержка честно призналась: "это не мы". Единственный доступ к серверу — консоль в браузере, работающая как удалённый рабочий стол, только текстом.
У этой консоли обнаружился отдельный баг: она молча теряет и путает символы при вставке длинных команд. Присылаешь строку в двести символов — на экране остаётся половина, без единого предупреждения. Пришлось перейти на дисциплину: только короткие команды, по одной, с проверкой каждой. Передачу файлов на сервер решили похожим образом — раз печатать руками нельзя, нужен внешний посредник. Перепробовали три бесплатных файлохостинга — два отключили анонимную загрузку ("устали от ИИ-ботов, засоряющих сервис", буквально их слова), третий просто не работал. Четвёртый сработал, и теперь это отлаженный конвейер: файл с компьютера → временный хостинг на час → скачивание на сервере одной короткой командой.
Баг, который прятался семь недель
На сервер сначала поставил "теневой сканер" — процесс, который молча следит за 66 трейдерами и копит данные для будущего отбора кандидатов на копирование, круглосуточно, без остановки. Потом поднял туда же копию торгового бота — те же настройки, та же логика, только теперь работает 24/7 независимо от того, включён ли мой компьютер.
Кошелёк на сервер переносить не стал принципиально — консоль в браузере это не то место, где должен лежать ключ от настоящего кошелька. Проверил по исходному коду библиотеки: для симуляции реальный ключ вообще не обязателен, публичные запросы идут без подписи. Поставил случайный, ни к чему не привязанный ключ — бот думает, что он настоящий, по факту это пустышка.
Запустил — и бот молчит. Ноль новых сделок трейдера, хотя рядом теневой сканер прекрасно видит его активность. Начал копать — и стало по-настоящему стыдно. Модуль слежения бота дёргал тот же публичный API, что и сканер, но с чуть другим набором параметров. И на этом наборе параметров сервер Polymarket годами кэшировал ответ где-то на своих CDN-серверах. Не на пару минут — бот считал, что последняя сделка трейдера была семь недель назад. Разница — один параметр в запросе. Добавил — и живой поток данных пошёл.
Обиднее всего, что точно такой же баг сидел и в основном боте на моём компьютере всё это время — просто раньше никто не сверял, отстаёт ли то, что видит бот, от реальности на пару секунд или на полтора месяца. Теперь это встроенная привычка: любые данные не из собственного журнала бота сначала проверяются на штамп времени, и только потом идут в дело.
Проверка на собственную честность
По ходу дела возник резонный вопрос: если баг с кэшем был всегда, может, все предыдущие сессии посчитаны неправильно? Проверил по журналу закрытых сделок — за девять дней там от 129 до 228 уникальных рынков в день, торгующихся непрерывно. Если бы кэш стоял мёртво неделями, бот видел бы одни и те же полсотни старых сделок и молчал бы дальше — новых имён и матчей просто не появлялось бы. Максимальный разрыв между закрытиями сделок за любой из дней — 39 минут, обычная рыночная тишина, а не многонедельная заморозка. Прошлые данные оказались чистыми — баг проявился именно в моменте, когда я впервые поставил рядом два процесса с чуть разными параметрами запроса и сравнил их.
Где сейчас
На сегодня бот работает круглосуточно на выделенном сервере, копирует сделки по реальным ценам стакана в реальном времени, без единого приближения в логике входа и выхода. Параллельно тот же сервер собирает статистику ещё по 65 трейдерам — уже сейчас можно увидеть, что двое из них показывают устойчивую доходность на статистически значимой выборке в сотни и тысячи сделок, а не на удачной паре ставок. Это следующий шаг: не просто копировать одного человека, а найти дисциплинированный процесс отбора тех, за кем вообще имеет смысл идти.
Деньги в это пока не заведены ни цента — вся система остаётся в режиме честной симуляции, пока цифры не подтвердят стабильность на нескольких сессиях подряд. Но инфраструктура для перехода в реальную торговлю уже готова — осталось решить, когда доверять ей первые настоящие два-три доллара.
Ссылка на ТГ канал: