Увидел провал на графике → открыл 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 тут будет особенно кстати.
Спасибо, что дочитали.
Автор: AlexProvatorov


