Увидел провал на графике → открыл Google или Twitter → полдня собираешь версии "почему". Знакомо? Детектор аномалий сам по себе даёт только точки на оси времени, а вопрос "почему" как был ручным, так и остаётся.
В этот раз я прогнал WhyTrend не на паре аккуратных точек из Google Trends, а на полном ряде BTC за 4.5 года — и заодно на двух разных LLM. Результат оказался неожиданным: модель меньшего размера дала в три раза больше настоящих объяснений, чем более крупная. Расскажу, что случилось и почему.
Что запускали
Данные — дневные close BTC/USDT, 1680 точек без единого пропуска, с 1 января 2022 по 7 августа 2026. Ключевое слово одно — Bitcoin, окно вокруг каждой найденной точки — ±5 дней. Детектор — Ruptures (PELT, penalty=10). Ranker — BM25, топ-8.
pipeline = ( Pipeline(window_days=5) .add_source(CSVSource("btc_usd_daily.csv", keyword="Bitcoin")) .add_detector(RupturesDetector(algorithm="pelt", model="rbf", penalty=10.0)) .add_collector(HackerNewsCollector(max_results=15)) .add_ranker(BM25Ranker(top_k=8)) .add_explainer(OllamaExplainer(model=MODEL, timeout=180.0)) )
Источник контекста — Hacker News, и тут есть причина, почему не более очевидный Google News: у Algolia (поиск по HN) есть фильтр по дате создания поста. Живой Google News живёт настоящим моментом, а для вопроса "что писали в мае 2022 года" он почти бесполезен — архивного среза с фильтром по дате там просто нет.
CLI (whytrend analyze ...) пока в разработке, roadmap v0.5 — сейчас работа идёт через Python API и такие вот скрипты-примеры, этого достаточно, чтобы пощупать поиск аномалий на своих данных.
Два слоя аномалий
Отдельным side-pass'ом прогнал ещё и Z-score по дневным доходностям (threshold=3.5) — это не смена режима рынка, а просто резкие дни:
Дата |
Тип |
Return |
Score |
|---|---|---|---|
2022-06-13 |
drop |
−15.38% |
0.829 |
2022-02-28 |
spike |
+14.49% |
0.775 |
2022-11-09 |
drop |
−14.15% |
0.763 |
Всего таких дней вышло 23. Полезно как индикатор рыночного шума, но если скормить все 23 в LLM — получите роман и счёт за электричество вместо аналитики. 2022-11-09, кстати, легко узнаётся — это окно краха FTX.
Главный слой кейса — не удары, а смены режима. Ruptures нашёл 8 changepoint'ов:
2024-11-11 close=88,648 score=0.196 2026-01-30 close=84,260 score=0.142 2024-02-25 close=51,729 score=0.094 2025-05-10 close=104,810 score=0.079 2025-11-11 close=103,059 score=0.075 2023-03-17 close=27,395 score=0.059 2022-05-11 close=29,104 score=0.058 2023-11-07 close=35,399 score=0.024
Масштаб удобный: не тысяча алертов, а карта переломов, которую можно наложить на известную историю рынка — крах Terra/Luna в мае 2022, банковский стресс весны 2023, ETF-ралли 2024 года. Именно эти 8 точек ушли в пайплайн объяснения — на них всё и разыгралось дальше.
Первый прогон — и коты из Монголии
Первый раз гонял на Qwen 32B. Пайплайн отработал честно, но в JSON-отчёте нашлась деталь, которую нельзя обделить вниманием: у шести из восьми событий сработал fallback — после ReadTimeout у Ollama. Пайплайн не упал, что уже хорошо — вместо этого подставил эвристику "возможно, связано с top evidence". Но именно отсюда взялись объяснения вроде:
The changepoint in 'Bitcoin' may be related to "Stray Cats and Bitcoin: A Costly Incident at a Bitcoin Mine in Mongolia" from hacker_news.
Confidence у этого объяснения — 1.00. И это важно понимать правильно: не "модель на 100% уверена", а артефакт запасного пути. Когда LLM не отвечает вовремя, fallback берёт первый документ по BM25-рейтингу и молча подставляет его как причину — без реального рассуждения. Статья про бездомных котов на майнинг-ферме в Монголии никак не объясняет перелом тренда цены, она просто содержала слово "Bitcoin" и оказалась в top evidence.
Такая же история — "Bitcoin Genetic Code Paper", "Bitcoin Private Key Finder": всё с тем же confidence=1.00, всё тем же механизмом. Корреляция в окне не равна причине, а таймаут локальной 32B-модели на восьми последовательных вызовах — рабочий риск, а не редкое исключение.
Там, где модель реально успевала ответить, картина другая. По 7 ноября 2023 года — единственный случай на 32B, где confidence не 1.00 и явно не fallback (0.60):
The detected changepoint in Bitcoin's price on November 7, 2023, may be attributed to market speculation or a short squeeze, given the recent peak near $37K.
Top cause — "Bitcoin Tops $37K for First Time Since May 2022". Это уже похоже на настоящую аналитику. Но два таких случая из восьми — маловато, чтобы статья звучала убедительно.
Второй прогон: модель поменьше из того же семейства
Прежде чем переписывать выводы, решил проверить очевидную гипотезу: что если дело не в качестве модели, а просто в том, что 32B на восьми последовательных вызовах регулярно не укладывается в timeout? Прогнал тот же пайплайн, тот же CSV — только qwen2.5-coder:14b вместо 32b. Это не та же модель с урезанным квантованием, а отдельный, меньший по числу параметров чекпоинт того же семейства Qwen2.5-Coder — обе версии Ollama раздаёт уже квантованными по умолчанию (обычно Q4_K_M), так что сравнение честное — это разные модели, а не одна и та же с разной точностью весов.
Qwen 32B |
Qwen 14B |
|
|---|---|---|
Время прогона |
~5 мин |
~3 мин |
Настоящих объяснений |
2 из 8 |
6 из 8 |
Fallback |
6 из 8 |
2 из 8 |
Тут сразу напрашивается вопрос: если timeout=180с, а fallback словили 6 из 8 событий, откуда всего 5, а не 18 минут(6×180с)? Explainer в Pipeline вызывается для всех событий через asyncio.gather, не по очереди — wall-clock время близко к самому долгому вызову (плюс сбор контекста), а не к сумме всех.
Не ожидал такого исхода. 14B оказалась не просто быстрее — она надёжнее в разы, потому что реже упирается в timeout. Похоже, для этой конкретной задачи (короткий структурированный ответ по уже отранжированным документам) более тяжёлая модель не даёт выигрыша в качестве, зато чаще не успевает ответить вовремя — а не успела значит fallback.
Вот все 8 событий из 14B-прогона целиком:
Дата |
Confidence |
Что нашла модель |
Результат |
|---|---|---|---|
2024-11-11 |
1.00 |
"Bitcoin Genetic Code Paper" |
fallback |
2026-01-30 |
0.50 |
Один крупный игрок удерживает цену ниже $90K |
реальный вывод |
2024-02-25 |
0.80 |
Негативный сентимент + регуляторное давление (3 причины) |
реальный вывод |
2025-05-10 |
0.90 |
Keynote Сэйлора про корпоративный Bitcoin |
реальный вывод |
2025-11-11 |
0.80 |
Изъятия Bitcoin государствами + обвинения в хаке на $13B |
реальный вывод |
2023-03-17 |
0.85 |
Банковская неопределённость + крипто-ралли |
реальный вывод |
2022-05-11 |
0.80 |
Общий рыночный сентимент, распродажи (окно краха Terra) |
реальный вывод |
2023-11-07 |
1.00 |
"Bitcoin vs. Medical School" |
fallback |
Забавная деталь: 7 ноября 2023 года — та самая точка, где на 32B модель дала единственный убедительный неfallback-ответ про short squeeze — на 14B неожиданно ушла в fallback с котами-подобной случайностью про "Bitcoin vs. Medical School". То есть улучшение не строго монотонное: 14B в среднем надёжнее, но не гарантирует успеха на каждой конкретной точке, где не подвела 32B.
А вот как это выглядит не в пересказе, а в самом отчёте — два реальных фрагмента, ссылки и confidence как есть, без причёсывания:
### Explanation 3 - Confidence: 0.80 The detected changepoint in Bitcoin value on 2024-02-25 may be influenced by a combination of negative sentiment and regulatory concerns. #### Causes 1. Bitcoin Is Mostly Worthless (1.00) Source: hacker_news URL: https://ajit.dhiwal.com/bitcoin-is-the-snake-oil-of-our-generation-2544a1984ce9 2. Exodus Bitcoin Wallet: $490k swindle (0.82) Source: hacker_news URL: https://popey.com/blog/2024/02/exodus-bitcoin-wallet-490k-swindle/ 3. European Central Bank argues against Bitcoin ETF (0.50) Source: hacker_news URL: https://www.ecb.europa.eu/press/blog/date/2024/html/ecb.blog20240222~0929f86e23.en.html
Три независимых источника, три разных веса — модель не просто нашла один заголовок с нужным словом, а честно сопоставила несколько версий с разной степенью уверенности в каждой. Второй пример — на 11 ноября 2025 года, там источники и вовсе спорят между собой по тональности:
### Explanation 5 - Confidence: 0.80 The detected changepoint in Bitcoin value on 2025-11-11 may be influenced by recent news about governments seizing more Bitcoin than gold and accusations of a US involvement in a $13 billion Bitcoin hack. #### Causes 1. Governments Seized More Bitcoin Than Gold (0.85) Source: hacker_news URL: https://illya.sh/thoughts/more-bitcoin-has-been-seized-than-gold 2. China Accuses US of Orchestrating $13B Bitcoin Hack (0.78) Source: hacker_news URL: https://www.bloomberg.com/news/articles/2025-11-11/china-accuses-us-of-orchestrating-13-billion-bitcoin-hack
Обе причины реальные, обе про 11 ноября 2025 года, но говорят о разном — геополитика вокруг изъятий Bitcoin государствами и обвинения в хакерской атаке. Модель не выбрала одну версию произвольно, а показала обе с весами, оставив решение о том, какая важнее, за читателем отчёта — то есть ровно то, для чего вообще нужен слой ranking перед LLM, а не просто "покажи топ-1 документ".
Что это значит на практике
Не "магию", а конкретную экономию на конкретном шаге. Карта смен режима за четыре с половиной года собирается за один прогон, а не за вечер кликанья по TradingView. Черновик гипотез со ссылками — даже шумный, с ложными срабатываниями вроде котов из Монголии — это уже точка старта расследования, а не чистый лист.
И отдельно — честный failure mode вместо тихого выдуманного нарратива без evidence. Таймаут → fallback на top evidence, а не сочинённая моделью история, которая выглядит правдоподобно, но ничем не подкреплена. WhyTrend не защищает от ложных срабатываний автоматически, но честно показывает, где сработал fallback — отличать его от настоящего вывода пока приходится по confidence и здравому смыслу, но сам факт, что это видно, уже немало.
Практический вывод для тех, кто будет повторять: не гнаться за самой крупной локальной моделью. В этом кейсе 14B оказалась разумным балансом — быстрее и стабильнее 32B, без заметной потери в качестве. Поднимать timeout выше 180 секунд имеет смысл, только если всё же нужна именно 32B и её не жалко ждать дольше. Или вообще использовать не локальною модель, а свой ключ для доступа к нейросетевому API одного из известных провайдеров(такая возможность тоже поддерживается).
Что дальше по проекту
В roadmap — CLI для тех, кому не хочется встраивать фреймворк кодом и гибридный ranker с фильтром "correlation_only / likely_cause" — чтобы меньше случайных котов попадало в executive summary без явной пометки, что это не настоящая причина.
Как повторить у себя
Все что нужно — лежит в отдельной ветке репозитория:
git clone https://github.com/AlexProvatorov/WhyTrend cd WhyTrend git checkout demo/btc-case-2022-2026 uv sync --extra ruptures # Ollama должна слушать localhost:11434 uv run python examples/btc_case_study_2022_2026.py \ --llm ollama \ --ollama-model qwen2.5-coder:14b
Отчёты появятся в examples/output/ — оба формата, markdown и JSON.
Исходный код — на GitHub. Если у вас есть идея, как отличать честный fallback от настоящего вывода модели ещё до чтения confidence вручную — это как раз то, что стоит добавить в roadmap следующим, и pull request тут будет особенно кстати.
Спасибо, что дочитали.
Комментарии (5)

CrissSquirrel
11.08.2026 10:28Слушай, а как отличить настоящий вывод модели от fallback, не листая JSON и не сверяя confidence вручную? Может стоит просто помечать fallback прямо в отчёте отдельным полем?

AlexProvatorov Автор
11.08.2026 10:28Спасибо за вопрос.
Да, сейчас единственный способ отличить их снаружи это confidence=1.00 + один cause + шаблонная фраза "may be related to X", но это эвристика читателя, а не явный флаг от системы. Как раз в roadmap стоит post-ranker фильтр с разметкой "correlation_only / likely_cause" — по сути это и есть явный флаг вместо угадывания по паттерну. Пока не сделал, потому что хотелось сначала понять частоту и природу самого fallback на реальных данных — эта статья и была таким замером.
Kriketo
А почему не проще было просто поднять timeout для 32B секунд до 400-500, раз модель явно не укладывается в 180? Может там дело вообще не в размере модели, а просто в жёстком лимите?
AlexProvatorov Автор
Спасибо за вопрос.
По коду Pipeline на том прогоне восемь explain шли через
asyncio.gather, то есть стартовали вместе. Wall-clock — а время до завершения самого позднего запроса.Ollama на одной GPU при этом обычно почти сериализует генерацию. Запрос в очереди для httpx — всё ещё ожидание ответа, поэтому хвост очереди на 32B чаще упирается в 180 с и уходит в fallback. Поднять timeout до 400–500 с имело бы смысл, если цель — дождаться именно 32B-ответов: больше шансов, что хвост очереди успеет посчитаться. Цена — дольше ждать весь
gather(ближе к сумме инференсов в очереди). Для статьи важнее было уложиться в разумное время и получить воспроизводимый прогон, а не выжать максимум из 32B.14B тут не костыль вокруг лимита, а практичный выбор: на той же GPU она быстрее → короче очередь → реже timeout при 180 с → меньше fallback. Для этого шага пайплайна топовая модель и не обязательна: на вход уже есть детекция, окно и отранжированные evidence, на выход нужен структурированный JSON-черновик гипотез. Сильнее модель имеет смысл позже, точечно, когда правишь формулировки или разбираешь спорные даты.
Надеюсь ответил на вопрос.