Идея казалась простой: рынки предсказаний систематически ошибаются, новостной поток плюс языковая модель позволяют поймать ошибку раньше толпы. Разработчик с бэкграундом в IoT и телеграм-ботах запустил бумажного бота на Polymarket с виртуальным стартовым капиталом $100 — и на второй день увидел +9% на счёте.
Polymarket — децентрализованный рынок предсказаний, где контракты торгуются в диапазоне $0–$1, а цена читается как вероятность события. Рынок резолвится в $1 (событие произошло) или $0 (не произошло). Привлекательность платформы для подобных экспериментов — прозрачность данных и наличие известной неэффективности: favorite-longshot bias (FLB), когда участники систематически переплачивают за маловероятные исходы.
| Версия | Сделок | Результат | TP/SL/Timeout | Главная проблема |
|---|---|---|---|---|
| v1–v2 | 260 | +$0.21, winrate 49% | 0% / 0% / 100% | Пороги TP/SL математически недостижимы |
| v3 | 1052 | +$9.03 (+9%), equity $109.03 | 49% / 33% / 18% | Весь профит — один рынок, артефакт mark и clamp |
| v4–v5 (LLM-трейдер) | — | Отрицательный | — | Тавтологичная формула edge, нет сравнения с исходом |
Архитектура бота намеренно прагматична: FastAPI как API-слой, Aiogram 3 для телеграм-интерфейса, PostgreSQL для хранения рынков, снапшотов цен, новостей и сделок, Redis и Celery для фоновых задач. В качестве LLM — Claude Sonnet 4.6 через CometAPI для торговых решений и более дешёвая модель для оценки релевантности новостей. Конвейер линейный: новость → анализ → сигнал → бумажная сделка → дашборд.
Весь профит ($10.55 из $14.35) пришёл от одного рынка — US x Iran peace by May 31: NO — через 371 повторный вход в почти решённую позицию.
Первые две версии провалились по очевидной причине: пороги take-profit и stop-loss стояли на 10 и 7 процентных пунктах, тогда как медианная амплитуда цены за окно удержания составляла 0.7 п.п., максимум — 7 п.п. Бот физически не мог закрыть ни одну сделку по TP или SL: из 260 закрытых сделок 100% завершились по тайм-ауту, суммарный результат — +$0.21.
В третьей версии пороги скорректировали по измеренной амплитуде: take-profit снизили до 0.02, stop-loss до 0.015. На 1052 закрытых сделках механика ожила — TP 49%, SL 33%, time-limit 18%, equity выросла до $109.03. Именно здесь большинство авторов остановились бы и написали статью про 9% за два дня. Но разбивка по рынкам убила картину: 2 рынка из 17 дали +$14.35, остальные 15 — минус $6.10. Один рынок, US x Iran peace by May 31: NO, принёс $10.55 через 371 повторный вход с winrate 94.6%.
Что на самом деле происходило: бот нашёл почти решённый рынок (мира с Ираном к 31 мая явно не будет) и снова и снова заходил в позицию NO по цене около $0.10–$0.15, собирая календарный распад — детерминированное снижение цены по мере приближения даты резолюции. Никакого предсказательного навыка здесь нет: winrate 94.6% — это структура рынка, а не аналитика.
Но главная проблема лежала глубже — в самой формуле edge. Открыв signal_engine/service.py, автор обнаружил, что вычисление выглядит так: edge = strength × confidence × 0.5 × sign, где strength и confidence — параметры, которые LLM сам же и выставляет. После подстановки edge буквально равен собственной уверенности модели, умноженной на 0.5. Сравнения с реальным исходом рынка нет вообще. Это замкнутый круг: модель уверена → есть edge → потому что модель уверена.
Дополнительную ловушку создавал clamp — ограничение значений в диапазоне 0–1. На дешёвых лонгшотах, где market_probability близка к нулю, model_probability после прибавления delta упиралась в ноль, и edge становился отрицательным — равным минус market_probability. Логика paper_trading интерпретировала отрицательный edge как сигнал NO. Таким образом, бот структурно всегда покупал NO на дешёвых лонгшотах — не потому что так решила модель, а потому что так работала математика clamp.
Второй системный изъян — метод оценки результата. Бумажные сделки переоценивались по текущей рыночной цене (mark), а не по итогу резолюции. Открыл NO по 0.10, цена упала до 0.08 — на бумаге +$0.02 «прибыли». Но реализованный результат известен только в момент резолюции: $1 или $0. Календарный распад почти решённого рынка по mark выглядит как стабильный доход — именно на этом и держались иранские +$10.55.
Автор честно фиксирует: проект дал отрицательный результат, код открыт, цифры воспроизводятся. Ценность материала — не в найденной стратегии, а в демонстрации того, как легко принять артефакт измерения за реальный торговый edge, особенно когда формула выглядит убедительно, а цифры на дашборде растут.


