Группа ИИ-агентов прогнозирует события: как проверить точность прогнозов
Моя собственная система прогнозирует исходы на рынках предсказаний — площадках, где торгуют ставками на исход событий. Пять независимых агентов на языковой модели ищут информацию в открытых источниках, ещё один агент сводит их ответы, затем вероятность калибруется. Каждый прогноз записывается в базу до исхода, а после исхода проверяется по показателю Брайера — мере точности вероятностных прогнозов. Этот кейс об измерении: как ставится планка качества, что она показала на 203 рынках с известным исходом и почему торговля реальными деньгами так и не была включена.
Уверенный ответ модели нечем проверить
Языковая модель с доступом к поиску выдаёт связное рассуждение и число: «вероятность 0,82». Проверить это число на глаз невозможно. До исхода у отдельного прогноза нет правильного ответа. После исхода один случай ничего не говорит о калибровке: уверенная ошибка и осторожное попадание выглядят одинаково. Нужна серия записанных прогнозов и метрика, которая наказывает и за самоуверенность, и за вечные осторожные 50%.
Предыстория тоже связана с измерением. До этой системы на тех же площадках проверялись стратегии торговли на мелких движениях цены: реакция на движение котировок, повтор сделок крупных участников. 12 мая 2026 года это направление закрыто по итогам разбора: 2,5 недели прогона без денег, семь стратегий, и ни одна не прошла проверку. Нашлись три общие причины. Подсчёт по снимкам биржевого стакана раздувал долю выигрышей: 51,9% по снимкам и 30,4% при подсчёте по рынкам. Сигнал, прошедший проверку на истории с t = 4,79, за две недели ослаб до t = 1,73, а к 12 мая перестал срабатывать вовсе: ноль срабатываний за 11 часов при 27 тысячах проверок. А один удачный день скрывал, что семь дней из восьми были убыточными.
Отсюда правила, с которыми строилась новая система: результат считается по рынкам, после исхода, на выборке заданного размера и с поправкой на то, что найденное преимущество со временем слабеет. Новая система взялась за другой класс задач: медленные события в геополитике и политике. Там цена держится днями, комиссия площадки для этой категории нулевая, и у модели есть время прочитать условия, по которым будет определён исход рынка. Гипотеза была такая: цена ошибается там, где участники читают заголовки и не читают эти условия.
Прогноз записывается до исхода и проверяется после
Система работает в пять шагов. Модель отвечает только за рассуждение. Отбор рынков, база, калибровка, сверка исходов и показатель Брайера написаны на Python и работают без модели. Рецепт ансамбля взят из статьи AIA Forecaster, и с первого дня каждый его элемент записывался так, чтобы его можно было пересчитать задним числом.
Открытый API площадки: рынки «да/нет» по геополитике и политике, до исхода 1–45 дней, цена 0,02–0,98, порог по суточному обороту. Повторный прогноз по рынку не чаще раза в 48 часов
Пять независимых агентов на Claude Sonnet, у каждого до пяти поисковых запросов. Агент видит вопрос, условия определения исхода и срок; ответ заканчивается строкой PROBABILITY
Агент на Claude Opus читает рассуждения всех пяти, проверяет спорные факты поиском и выдаёт итоговую вероятность
Среднее по ансамблю, поправка Платта с α = 1,73, смесь с ценой рынка (вес 0,33), порог расхождения 0,03. В DuckDB пишутся сырая, калиброванная и смешанная вероятности, цена, согласие агентов, рассуждение
Ежедневный таймер сверяет закрытые рынки по явной отметке победителя, считает Брайер системы и рынка, бумажный результат по цене покупки с полуспредом 0,015 и отправляет отчёт в мессенджер
Планка задана до первого прогноза
Показатель Брайера — квадрат разности между названной вероятностью и исходом (1 или 0). Ноль означает безошибочный прогноз, вечные 50% дают ровно 0,25, уверенная ошибка стоит почти единицу. Та же величина считается для цены рынка на момент прогноза, и это даёт естественный эталон: рынок тоже прогнозирует. Планка записана в коде отчёта раньше, чем появился первый прогноз:
- не меньше 30 рынков с известным исходом, и показатель Брайера у системы ниже, чем у рынка
- пока оба условия не выполнены, торговля реальными деньгами запрещена; система работает в режиме прогона без денег
- бумажный результат считается по цене покупки с полуспредом 0,015 (половиной разницы между ценами покупки и продажи), чтобы прогон без денег не приукрашивал результат
- геополитика выбрана в том числе потому, что комиссия площадки в этой категории нулевая: спред остаётся единственной издержкой в расчёте
Два способа получить прогноз
Полная версия на Python вызывает модель по API: пять агентов параллельно, потом супервизор. На сервере ключа к API не оказалось, поэтому рабочим стал второй способ. Сессия Claude Code с веб-поиском проводит исследование по рецепту, записанному в виде готовой инструкции. Скрипт записи получает от неё сырую вероятность, сам берёт живую цену рынка, применяет калибровку, считает расхождение и пишет строку в базу. Ежедневный прогон выглядит так: очередь из 13–14 рынков, 8–14 вспомогательных агентов на Claude Sonnet, затем решение агента-арбитра перед записью.
Роли разделены сознательно. Модель отвечает за рассуждение и поиск. Python отвечает за то, что должно пережить смену моделей и промптов: отбор рынков, базу, калибровку, сверку исходов и отчёт.
Счётчик исходов молчал семь недель
Первый серьёзный сбой случился в самом важном месте. Открытый API площадки перестал отдавать закрытые рынки по адресу, через который система сверяла исходы: ответ приходил пустым и без ошибки. Таблица исходов оставалась пустой с конца мая по 16 июля, отчёт честно писал «разрешившихся пока нет», и это выглядело как медленные рынки. Тот же тип отказа, что в кейсе про надёжность фоновых служб: процесс жив, данные не приходят, никто не жалуется.
Исправление: сверка переведена на другой адрес API. Там исход ищется по идентификатору условия, и у каждого исхода стоит явная отметка победителя. Запрос по адресу рынка остался запасным путём. Первый же запуск записал 4 исхода: показатель Брайера у системы 0,499, у рынка 0,235. Рынок оказался точнее с первых же записей, и с этого момента измерение стало ежедневным.
В строке хранится всё, что нужно для пересчёта
У каждого прогноза сохраняются сырая вероятность ансамбля, калиброванная, смешанная с ценой, сама цена, число агентов, мера их согласия, направление сигнала, рассуждение и версия модели. Позже это пригодилось. Когда возник вопрос, помогает ли поправка Платта, ответ посчитали по уже накопленным строкам, без повторных прогонов. Правила очереди появлялись после сбоев:
- рынок попадает в очередь, только если отбор видел его в последние 48 часов: майские рынки с застывшим сроком «1,6 дня» висели в очереди в июле
- расхождение считается только по живой цене: цена в очереди отличалась от реальной в 10 раз (0,04 при реальной 0,389)
- срок до исхода при отборе сокращён со 120 до 45 дней: короткие рынки быстрее дают пары «прогноз — исход»
Кода мало, вся сложность в измерении
Работа с открытыми API площадки без авторизации: отбор рынков, живые цены, сверка исходов
Три таблицы: рынки, прогнозы, исходы. Сырая и калиброванная вероятности лежат рядом, пересчитать можно задним числом
Пять независимых агентов с веб-поиском и супервизор, который сводит их разногласия
Второй способ: 8–14 агентов на пакет, проверка скептиком и арбитром, запись через скрипт
Растяжение вероятностей к краям (логит × 1,73) и смесь с ценой (вес 0,33) по рецепту статьи; оба слоя измерены отдельно
Сверка исходов и отчёт раз в сутки без участия модели. Пакет прогнозов по API подготовлен отдельным таймером (08:45 UTC, до 12 рынков за прогон) и включается одной командой, когда на сервере появится ключ
Число рынков, прогнозов и исходов, Брайер системы и рынка, очередь на прогноз — ежедневная сводка в Discord
Разбивка потерь по диапазонам цены и базовые частоты по типам вопросов
Планка не взята, и это измерено
первый замер 31 июля, тринадцатый — 5 сентября 2026; больше 600 записанных прогнозов
планка не взята 13 замеров подряд; на первом замере было 0,119 и 0,080
164 из 203; основную часть отставания по сумме дают редкие уверенные промахи
Где именно теряется точность
Картина повторяется от замера к замеру: на большинстве рынков система точнее цены, но по сумме проигрывает. При n = 66 четыре промаха давали 84% всего отставания (3,646 из 4,322); без них получалось 0,068 у системы и 0,057 у рынка на 62 парах, почти вровень. Три из четырёх — уверенные расхождения с ценой больше чем на 75 процентных пунктов, и во всех четырёх прав оказался рынок. Два промаха — один и тот же тип вопроса о проходе военных кораблей через пролив: сырые 0,98 и 0,82 при цене 0,010 и 0,037, оба исхода «нет». Ещё в одном модель спутала один конфликт с другим: 0,03 при цене 0,895, исход «да». Разбивка по диапазонам цены на n = 203 показала, что потери распределены неравномерно:
- цена ниже 0,10 — n = 132, Брайер системы 0,042, рынка 0,022 при реальной частоте таких исходов 2,3%: редкие события система переоценивала
- середина 0,25–0,75 — n = 20, 0,297 и 0,220: единственный диапазон, где вред от несогласия системы с ценой статистически заметен
- цена выше 0,90 — n = 21, 0,048 и 0,047: здесь система наравне с рынком, исправлять нечего
Поправка из статьи ухудшала показатель
Поправка Платта растягивает вероятности к краям: логит умножается на 1,73. В статье она улучшала Брайер, потому что модели склонны жаться к 50%. На этой серии эффект оказался обратным, и это видно по тем же строкам, где сырая вероятность хранится отдельно: при n = 53 сырой Брайер 0,108, с поправкой 0,115, рыночный 0,048. На краях поправка переворачивает знак расхождения: сырые 0,13 при цене 0,07 означают «прогноз выше рынка», а после растяжения получается 0,036 и сигнал в обратную сторону. В одном пакете из 13 рынков знак перевернулся у 9.
Практический вывод: поле сигнала в базе для дешёвых и дорогих рынков недостоверно, расхождение читается только как «сырая вероятность минус цена». Общий урок для любой оценки качества ИИ: коэффициент из статьи нужно проверять на собственных исходах, а величину до поправки хранить отдельно.
Что изменили по итогам замеров
Каждое изменение рецепта записывалось с датой и проверялось на следующих замерах по той же таблице:
- Агенту не показывают цену рынка. Несмотря на прямой запрет в промпте, все пять прогнозов по одной серии рынков с разными датами легли в пределах 1,5 процентного пункта от цены, и в рассуждении так и было написано. С 23 августа агент получает только вопрос, условия определения исхода и срок
- Одно семейство рынков — один агент. Независимые агенты выдавали логически невозможные пары в таких сериях: 0,25 на «до 31 августа» и 0,15 на «до 15 сентября». Теперь серия считается целиком, одним расчётом, а арбитр проверяет, что вероятность не падает с ростом срока
- Проверка скептиком и арбитром. Если прогноз расходится с ценой на 15 пунктов и больше, второй агент пытается опровергнуть ключевые факты: 29 августа так переписаны 5 прогнозов из 14. При расхождении от 20 пунктов третий агент в роли «того, кто будет определять исход» проходит по условиям пункт за пунктом: 1 сентября он пересмотрел 3 крайних прогноза из 5 (0,94 → 0,33; 0,93 → 0,32; 0,78 → 0,55) и два подтвердил
- Базовые частоты по семействам из таблицы исходов. «Перемирие продержится до даты» — 14 из 14 «да» при среднем прогнозе системы 0,847; «захват населённого пункта к дате» — 0 из 4 при прогнозе 0,268 и цене 0,095; «снятие блокады к дате» — 10 из 10 «нет», прогноз 0,011 при цене 0,101, показатель Брайера 0,0003 у системы и 0,0161 у рынка. Это единственное семейство, где система уверенно точнее рынка
Эффект виден в тех же диапазонах. Дешёвый край перестал ухудшаться: с n = 183 до n = 203 в нём прибавилось 12 исходов, а суммарный разрыв изменился с 2,605 до 2,579; переоценка редких событий сократилась с 2,3 до 1,7 раза от реальной частоты. Середина 0,25–0,75 по-прежнему теряет: два новых исхода добавили 0,371 разрыва. Поэтому сейчас работа идёт над серединой: если цена рынка в этом диапазоне, прогноз записывается осторожнее, чем предлагают агенты.
Параллельный опыт: рынки на погоду
Параллельно тот же подход применялся к рынкам на дневную температуру, где вероятность считалась по набору численных прогнозов погоды (30–50 вариантов). Первый урок оттуда: доля выигрышей сама по себе ничего не значит. Бот с долей выигрышей 91,6% на 1089 рынках оставался в минусе: при покупке фаворитов по высокой цене один проигрыш съедает много выигрышей. Крайний диапазон показал это в чистом виде: при средней цене 0,995 точка безубыточности — 99,5%, а фактические 97,54% на 285 рынках до неё не дотягивали. Второй урок: бот выбирал фаворитов по цене и вообще не смотрел на прогноз погоды. Фильтр по прогнозу подключили 31 мая, сначала в режиме наблюдения: он только записывал своё решение в журнал. Рынки на минимальную температуру исключены, когда доля выигрышей на них оказалась 61%, в бумажный расчёт добавлена найденная комиссия площадки. 28 июля это направление закрыто по заранее заданному порогу A/B-сравнения: ожидаемый результат в проверенных вариантах отрицательный.
Коротко: система не заслужила права торговать реальными деньгами, и таблица исходов во всех 13 замерах показывает одно и то же. Ценна сама система измерений: у каждого прогноза есть дата, сырая и калиброванная вероятность, цена и исход, поэтому спор о качестве решается запросом к базе.
Такая проверка нужна ИИ, который отвечает числом или решением
За кейсом стоит частая задача: модель отвечает уверенно, и проверить её можно только по накопленным исходам. На этом строится услуга оценки и настройки качества ответов ИИ: записать ответ до того, как известен результат, сравнить с эталоном, найти диапазон, где модель ошибается. Такой контур переносится почти без изменений:
- → ИИ-чаты и поиск по документам, где качество ответов оценивает вторая модель: её оценки сверяются с оценками людей по той же метрике, по которой здесь прогнозы сверялись с исходами
- → Скоринг и оценка рисков, где модель выдаёт вероятность: разбивка по диапазонам показывает, где именно она переоценивает себя
- → Классификация документов и обращений, где уверенная ошибка на редком классе обходится дорого
- → Прогноз спроса и сроков — базовые частоты по похожим случаям из собственной истории дают отправную точку для прогноза
- → Агенты с поиском, которые строят связную историю из свежих новостей: проверка скептиком и арбитром по условиям нужна им до того, как ответ ушёл дальше
- → Любая методика из статьи — коэффициенты калибровки, веса, пороги — применяется только после проверки на собственных исходах
- Схему хранения: ответ записывается до исхода, величины до поправки и после лежат рядом, любой слой можно пересчитать задним числом
- Планку качества, заданную до первого запуска: размер выборки, метрика, эталон и запрет на следующий шаг, пока планка не взята
- Разбор по диапазонам: показатель по диапазонам ответа и базовые частоты по типам случаев
- Проверку скептиком и арбитром: попытка опровергнуть ключевые факты и разбор по пунктам условий для ответов, которые сильно расходятся с эталоном
- Защиту от подстройки под эталон: модели не показывают эталонный ответ во время исследования, согласованность связанных ответов проверяет отдельный агент
- Сверку исходов как отдельный процесс с проверкой на тихий отказ: пустой ответ источника не принимается за отсутствие исходов
Если модель отвечает уверенно, важно одно: записываются ли исходы
Начать стоит с двух вещей: таблицы, куда ответ попадает до того, как известен результат, и одной метрики, которая наказывает уверенную ошибку сильнее осторожной. Часто уже по первым 30–50 парам «ответ — исход» видно, в каком диапазоне модель переоценивает себя, и дальше настройка идёт по цифрам.
Похожие кейсы
Нейросеть разбирает торговые сигналы прямо на ноутбуке: Ollama и RAG на M3
Основная модель qwen2.5:14b, запасная llama3.1:8b, скриншоты графиков разбирает LLaVA:7b, похожие случаи из…
Бот с цифрами по продажам: шесть метрик, расчёты перепроверили ИИ-агенты
Telegram-бот считает продажи по странам, годам, товарам и штатам США через одно общее ядро метрик. Все цифры…
ИИ-помощник по базе знаний компании в Telegram
Бот отвечает по рабочим чатам, письмам, голосовым и документам и к каждому ответу прикладывает цитаты из…
Начните с аудита за 5 000 ₽: письменный отчёт и расчёт окупаемости
Расскажу, что автоматизировать в первую очередь, когда это окупится и нужен ли вашей задаче ИИ вообще. Иногда он не нужен.
Или просто задайте вопрос. В рабочее время отвечаю в течение 2 часов