Увидел провал на графике → открыл 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)


  1. Kriketo
    11.08.2026 10:28

    А почему не проще было просто поднять timeout для 32B секунд до 400-500, раз модель явно не укладывается в 180? Может там дело вообще не в размере модели, а просто в жёстком лимите?


    1. AlexProvatorov Автор
      11.08.2026 10:28

      Спасибо за вопрос.

      По коду 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-черновик гипотез. Сильнее модель имеет смысл позже, точечно, когда правишь формулировки или разбираешь спорные даты.

      Надеюсь ответил на вопрос.


  1. CrissSquirrel
    11.08.2026 10:28

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


    1. AlexProvatorov Автор
      11.08.2026 10:28

      Спасибо за вопрос.

      Да, сейчас единственный способ отличить их снаружи это confidence=1.00 + один cause + шаблонная фраза "may be related to X", но это эвристика читателя, а не явный флаг от системы. Как раз в roadmap стоит post-ranker фильтр с разметкой "correlation_only / likely_cause" — по сути это и есть явный флаг вместо угадывания по паттерну. Пока не сделал, потому что хотелось сначала понять частоту и природу самого fallback на реальных данных — эта статья и была таким замером.


      1. CrissSquirrel
        11.08.2026 10:28

        Спасибо за ответ