Kronos: foundation-модель, которая учит свечной график говорить на языке трансформера

Если рынок — это шум, то любая попытка предсказать следующую свечу похожа на расшифровку радиопомех. Авторы Kronos предлагают радикальный подход: превратить биржевые свечи в дискретные токены (как слова в языке) и обучить трансформер предсказывать «следующее слово» — то есть следующую свечу.
Это не универсальный time-series transformer «на все случаи жизни», а узкоспециализированная модель под многомерные K-line (OHLCV) с календарными признаками. Репозиторий shiyu-coder/Kronos открыт под MIT, веса на Hugging Face, статья принята на AAAI 2026.
Главная идея: свечи = язык
Как ChatGPT учится предсказывать следующее слово в тексте, так Kronos учится предсказывать следующую свечу в ценовом ряде. Но для этого нужно решить ключевую проблему: свеча — это непрерывный вектор (open, high, low, close, volume), а трансформеры работают с дискретными токенами.
Решение — двухэтажная архитектура:
- Токенизатор (BSQ) — сжимает непрерывную свечу в дискретный код
- Декодер (трансформер) — предсказывает следующий код авторегрессивно
BSQ-токенизатор: как сжать свечу в два числа

KronosTokenizer — это encoder–decoder на трансформер-блоках с квантизацией посередине. Ключевой модуль — Binary Spherical Quantizer (BSQ):
- Непрерывный вектор свечи проецируется на сферу (
F.normalize) - Затем квантизуется в бинарный код — набор 0 и 1
- Код разбивается на два уровня: грубый (S1) и детальный (S2)
Почему два уровня? Это факторизация словаря. Вместо одного огромного словаря размером S1 × S2, модель оперирует двумя маленькими таблицами эмбеддингов — значительно эффективнее.
Борьба с коллапсом кодовой книги
Наивный квантизатор быстро «схлопнется» — будет использовать 3 кода из тысячи. BSQ борется с этим через:
- Энтропийные штрафы — стимулируют равномерное использование кодов
- Commit loss — связывает непрерывное представление с дискретным
- Нормализация на сфере — стабилизирует обучение
Иерархический декодер: сначала сценарий, потом детали
Класс Kronos содержит стопку трансформер-блоков с RMSNorm, RoPE, причинной маской — стандартный арсенал современных LLM. Но голова — двойная (DualHead):
- Сначала модель предсказывает S1 — «грубый сценарий» свечи (растём? падаем? на сколько примерно?)
- Затем при фиксированном S1 уточняет S2 — детали (точные цены, объём)
Между головами работает DependencyAwareLayer — кросс-внимание, где query — эмбеддинг выбранного грубого токена, key/value — контекст трансформера. Это значит: детальный прогноз зависит от «сценария», а не строится независимо.
Временные эмбеддинги
Модель получает календарную информацию через TemporalEmbedding: минута, час, день недели, число месяца, месяц. Время следующих баров известно заранее (это расписание, а не цена) — поэтому его можно подавать на вход при генерации.
Инференс: скользящее окно и стохастические траектории
Функция auto_regressive_inference — сердце практического использования:
-
Нормализация окна. Входные данные нормализуются локально:
(x - mean) / (std + 1e-5). Модель не ожидает глобально нормированного рынка — она работает в масштабе текущего окна. -
Параллельные траектории. Вход реплицируется по
sample_count— генерируется несколько стохастических будущих путей одновременно. -
Скользящий контекст. Если история длиннее контекста модели, буфер сдвигается (
torch.roll). Старые токены выбрасываются — это жёсткое окно, не падение. -
Двухступенчатый сэмплинг. На каждом шаге:
decode_s1→ logits → nucleus sampling (temperature, top-k, top-p) → один S1decode_s2при фиксированном S1 → один S2
-
Усреднение. Несколько стохастических траекторий в латентном пространстве → усреднённая траектория в ценах. Это эвристика сглаживания — нужно помнить при интерпретации.
Обучение на своих данных
Датасет: случайные окна
QlibDataset строит список допустимых стартов скользящего окна, но __getitem__ игнорирует индекс — внутри случайная выборка с фиксированным seed для воспроизводимости в distributed обучении. Нормализация на уровне окна — согласованность train/infer.
Два этапа обучения
-
Токенизатор (
train_tokenizer.py): AdamW, DDP, накопление градиентов. Учится восстанавливать свечи + BSQ-loss. -
Предиктор (
train_predictor.py): токенизатор заморожен (torch.no_grad). Классическое next-token prediction на парах (S1, S2) со сдвигом. Gradient clippingmax_norm=3.0, OneCycleLR.
Бэктест через Qlib
qlib_test.py — инференс → сигналы → TopkDropoutStrategy в Qlib. Модель прогноза и правила портфеля явно разведены: сырой сигнал остаётся сырьём для стратегии.
Сильные стороны и ограничения
| ✅ Плюсы | ⚠️ Минусы |
|---|---|
| Факторизация токенов S1/S2 | Стохастическая генерация — одна реализация может быть «красивой случайностью» |
| BSQ с регуляризацией энтропии | Усреднение ≠ калибровка вероятностей |
| Скользящий контекст на длинных рядах | Демонстрационный Qlib-пайплайн — не продакшен |
| Согласованная локальная нормализация | Kronos-large не открыт |
| DDP-ready, регрессионные тесты на весах | Перенос на другой рынок требует переобучения токенизатора |
Ссылки
- 💻 GitHub: shiyu-coder/Kronos
- 📄 Статья: arXiv:2508.02739
- 🤗 Веса: Hugging Face (ссылки в README)
- 📄 Лицензия: MIT
Вывод
Kronos — не «ещё один трансформер на ряд», а согласованный конвейер: BSQ-токенизатор с контролем кодовой книги, иерархическая языковая модель на двух уровнях дискретизации, автогрессия с двухшаговым сэмплингом, локальная нормализация окон. Это открытая реализация идеи «свечи = язык» — с понятными местами, где заканчивается машинное обучение и начинается дисциплина торговой системы.
MarketMaker.cc Team
Количественные исследования и стратегии