VIZANIXРазработка торгового ПО
Исследование и проверкаОткрытый код8 мин чтения

TideGBM: градиентный бустинг, уважающий стрелу времени

Обычный градиентный бустинг считает строки взаимозаменяемыми. Рыночные данные такими не являются. Мы написали библиотеку, где purged-валидация по умолчанию, а заглядывание в будущее — ошибка линтера.

Инженеры Vizanix · об авторе

МАТЕРИАЛ
8 минвремя чтения
РАЗДЕЛ
Исследование и проверка
ОПУБЛИКОВАНО
2026-08-28
ГЛАВ
6
ЧИТАТЬ ДАЛЬШЕ
3
ЯЗЫК
написано на русском
Инженерный разбор, а не пересказ документации.
TIDEGBMC++17PURGED CVLEAK LINTAPACHE-2.0

Большинство библиотек градиентного бустинга делают одно допущение, неверное для рыночных данных: что строки взаимозаменяемы. Перемешайте их, разбейте случайно — и оценка всё ещё осмысленна. Для временных и панельных данных не верно ничего из этого.

TideGBM — наша попытка починить это на уровне библиотеки, а не дисциплиной. Открытая, Apache-2.0, опубликована на PyPI как tidegbm, исходники — github.com/Vizanix.

Чем отличается

ВозможностьЧто это значит
TORBTemporal ordered residual boosting — причинные остатки в листьях и структура деревьев, уважающая порядок времени
Purge / embargoWalk-forward разбиение с зазорами под горизонт прогноза: окно обучающей метки не может перекрыть валидационную выборку
Линт утечекСтрогий режим отказывается обучаться на признаках, заглядывающих в будущее
Попарная функцияРанжирование в стиле LambdaMART внутри даты — ради кросс-секционного информационного коэффициента, а не абсолютного уровня
Гистограммное ядроКолоночное ядро на C++17 с OpenMP; опционально CUDA-гистограммы

Почему purging обязан быть поведением по умолчанию

О purging знают все, кто работает в количественных финансах. Применяют его последовательно почти никто, потому что честное разбиение — это больше работы, чем удобное, и оно даёт хуже выглядящие цифры.

Это плохое сочетание. Когда правильный путь труднее, а наградой за срезание угла оказывается более красивая метрика, под давлением срока побеждает срезание угла — всегда, в любой команде, включая нашу. Единственное устойчивое лечение — сделать честный путь путём по умолчанию, а срезание угла тем, что нужно запросить явно.

python
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 разрабатывает программное обеспечение и не обещает торговую доходность.

Блог

Читать дальше

Research · 9 мин

Заглядывание в будущее: как автоматический аудит нашёл три настоящие утечки в нашей модели

Любая просочившаяся крупица будущего делает бэктест красивее. Именно поэтому утечки так трудно заметить — свидетельством бага оказывается результат, которого вы и ждали.

Проверка · 8 мин

Бэктест и paper trading доказывают разные вещи

Бэктест проверяет гипотезу о рынке. Paper trading проверяет вашу программу против реальности. Пропустить любой из них — значит выйти в бой на непроверенном допущении.

Хотите такое у себя?

Мы пишем о том, что строим. Если нужно построить — напишите, разбор бесплатный.

Бриф

Получить оценку проекта

Четыре вопроса и контакт. Предоплата для разговора не нужна — если задача не наша, скажем сразу.

01Что вам нужно
02Биржа
03Рынок
04Стратегия
05Контакты

Проще написать напрямую? Telegram @vx_ceo

Обсудить систему