TideGBM: градиентный бустинг, уважающий стрелу времени
Обычный градиентный бустинг считает строки взаимозаменяемыми. Рыночные данные такими не являются. Мы написали библиотеку, где purged-валидация по умолчанию, а заглядывание в будущее — ошибка линтера.
Инженеры Vizanix · об авторе
- РАЗДЕЛ
- Исследование и проверка
- ОПУБЛИКОВАНО
- 2026-08-28
- ГЛАВ
- 6
- ЧИТАТЬ ДАЛЬШЕ
- 3
- ЯЗЫК
- написано на русском
Большинство библиотек градиентного бустинга делают одно допущение, неверное для рыночных данных: что строки взаимозаменяемы. Перемешайте их, разбейте случайно — и оценка всё ещё осмысленна. Для временных и панельных данных не верно ничего из этого.
TideGBM — наша попытка починить это на уровне библиотеки, а не дисциплиной. Открытая, Apache-2.0, опубликована на PyPI как tidegbm, исходники — github.com/Vizanix.
Чем отличается
| Возможность | Что это значит |
|---|---|
| TORB | Temporal ordered residual boosting — причинные остатки в листьях и структура деревьев, уважающая порядок времени |
| Purge / embargo | Walk-forward разбиение с зазорами под горизонт прогноза: окно обучающей метки не может перекрыть валидационную выборку |
| Линт утечек | Строгий режим отказывается обучаться на признаках, заглядывающих в будущее |
| Попарная функция | Ранжирование в стиле LambdaMART внутри даты — ради кросс-секционного информационного коэффициента, а не абсолютного уровня |
| Гистограммное ядро | Колоночное ядро на C++17 с OpenMP; опционально CUDA-гистограммы |
Почему purging обязан быть поведением по умолчанию
О purging знают все, кто работает в количественных финансах. Применяют его последовательно почти никто, потому что честное разбиение — это больше работы, чем удобное, и оно даёт хуже выглядящие цифры.
Это плохое сочетание. Когда правильный путь труднее, а наградой за срезание угла оказывается более красивая метрика, под давлением срока побеждает срезание угла — всегда, в любой команде, включая нашу. Единственное устойчивое лечение — сделать честный путь путём по умолчанию, а срезание угла тем, что нужно запросить явно.
from tidegbm import TideRegressor
model = TideRegressor(
horizon=1, # метка смотрит на один период вперёд
n_estimators=200,
max_depth=6,
objective="pairwise", # кросс-секционное ранжирование / IC
)
# Purge и embargo выводятся из `horizon`. Это не опция, которую включают.
model.fit(X_train, y_train, timestamp="ts", entity="symbol")
pred = model.predict(X_live)Аргументы timestamp и entity обязательны, а не факультативны. Модель, не знающая, какая колонка является временем, не может корректно выполнить purging, а библиотека, позволяющая их не указывать, приглашает баг.
Уровень против ранжирования
Различие, решающее, какая целевая функция вам нужна. Если надо предсказать, насколько сильно что-то сдвинется, — это регрессия уровня, и вам нужен objective="mse".
Но в кросс-секционной работе полезный вопрос обычно другой: какие из доступных прямо сейчас инструментов обгонят остальные? Это задача ранжирования внутри каждой даты, и оптимизация квадратичной ошибки по уровню — неверная для неё цель. У модели может быть плохой R² и отличный информационный коэффициент, а для построения портфеля платит именно второе.
Чем она не является
TideGBM — это не «лучше нейросетей», и мы не заявляем, что она обыгрывает устоявшиеся библиотеки бустинга на стандартных бенчмарках, где их допущения выполняются. В документации это сказано прямо.
Цель уже и честнее: более сильный бустинг для табличных временных и панельных задач при purged-оценке. Значимо сравнение с другой честно валидированной моделью, а не со счётом на случайном разбиении, которого никогда не существовало.
Зачем мы её опубликовали
Три причины, в порядке возрастания честности.
Первая: это делает наши утверждения проверяемыми. Мы пишем на этом сайте, что нам важны purged-валидация и утечки в будущее. Теперь любой может прочитать код и убедиться, так ли это, не подписывая NDA и не веря нам на слово.
Вторая: публикация меняет то, как пишешь. Код, который прочитают незнакомые люди, обрастает тестами, документацией и честными разделами про ограничения. Эта дисциплина протекает обратно в клиентскую работу.
Третья — и мы предпочитаем сказать это, а не делать вид, — открытый репозиторий под собственным именем является устойчивым проверяемым сигналом о том, чем мы занимаемся. Он стоит больше любого текста на странице услуг именно потому, что его можно проверить.
Если хотите посмотреть
pip install tidegbm или исходники на github.com/Vizanix. Замечания и критика приветствуются; баг-репорт по линту утечек полезнее нам, чем звезда.
Статья описывает инженерную практику. Это не инвестиционная рекомендация. Vizanix разрабатывает программное обеспечение и не обещает торговую доходность.