VIZANIXTrading Software Development
Research and validationOpen source8 min read

TideGBM: gradient boosting that respects the arrow of time

Standard gradient boosting treats rows as exchangeable. Market data is not. We wrote a library where purged validation is the default and look-ahead is a lint error.

Vizanix engineering · about the author

ARTICLE
8 minreading time
SECTION
Research and validation
PUBLISHED
2026-08-28
CHAPTERS
6
READ NEXT
3
LANGUAGE
written in English
An engineering breakdown, not a rewrite of the docs.
TIDEGBMC++17PURGED CVLEAK LINTAPACHE-2.0

Most gradient boosting libraries make one assumption that is wrong for market data: that rows are exchangeable. Shuffle them, split them randomly, and the evaluation is still meaningful. For time-indexed and panel data, none of that holds.

TideGBM is our attempt to fix that at the library level rather than by discipline. It is open, Apache-2.0, published on PyPI as tidegbm, with source at github.com/Vizanix.

What is different

CapabilityWhat it means
TORBTemporal ordered residual boosting — causal leaf residuals and tree structure that respect the order of time
Purge / embargoWalk-forward splits with horizon-aware gaps, so a training label window cannot overlap the validation set
Leak lintStrict mode refuses to fit on features that peek into the future
Pairwise objectiveWithin-date LambdaMART-style ranking, for cross-sectional information coefficient rather than absolute level
Histogram engineColumn-major C++17 core with OpenMP; optional CUDA histograms

Why purging has to be a default

Everyone in quantitative finance knows about purging. Almost nobody applies it consistently, because the honest split is more work than the convenient one and it produces worse-looking numbers.

That is a bad combination. When the correct path is harder and the reward for taking the shortcut is a better-looking metric, the shortcut wins under deadline pressure — every time, in every team, including ours. The only durable fix is to make the honest path the default and the shortcut the thing you have to ask for.

python
from tidegbm import TideRegressor

model = TideRegressor(
    horizon=1,               # label looks one period ahead
    n_estimators=200,
    max_depth=6,
    objective="pairwise",    # cross-sectional ranking / IC
)
# Purge and embargo are derived from `horizon`. Not an option to enable.
model.fit(X_train, y_train, timestamp="ts", entity="symbol")
pred = model.predict(X_live)

The timestamp and entity arguments are required rather than optional. A model that does not know which column is time cannot purge correctly, and a library that lets you omit it is inviting the bug.

Level versus ranking

A distinction that decides which objective you want. If you need to predict how much something will move, that is level regression and you want objective="mse".

But in cross-sectional work the useful question is usually different: of the instruments available right now, which ones will outperform? That is a ranking problem within each date, and optimising squared error on the level is the wrong target for it — a model can have poor R² and excellent information coefficient, and for portfolio construction the second one is what pays.

What it is not

TideGBM is not “better than neural networks”, and we do not claim it beats the established boosting libraries on standard benchmarks where their assumptions hold. The documentation says so explicitly.

The target is narrower and more honest: a stronger gradient booster for tabular time and panel problems under purged evaluation. The comparison that matters is against another honestly-validated model, not against a random-split score that was never real.

Why we published it

Three reasons, in order of honesty.

First, it makes our claims checkable. We write on this site that we care about purged validation and look-ahead leaks. Anyone can now read the code and see whether that is true, without signing an NDA or taking our word for it.

Second, publishing changes how you write. Code that strangers will read gets tests, documentation and honest limitations sections. That discipline leaks back into the client work.

Third — and we would rather say this than pretend otherwise — an open repository under our own name is a durable, verifiable signal of what we do. It is worth more than any amount of copy on a services page, precisely because it can be checked.

If you want to look

pip install tidegbm, or read the source at github.com/Vizanix. Issues and criticism are welcome; a bug report on the leak lint is more useful to us than a star.

This article describes engineering practice. It is not investment advice. Vizanix develops software and does not promise trading returns.

Blog

Read next

Want this running for you?

We write about what we build. If you need it built, get in touch — scoping is free.

Brief

Get a project estimate

Four questions and your contact. No deposit required to talk — if the job is not a fit, we say so straight away.

01What do you need
02Exchange
03Market
04Strategy
05Contacts

Prefer to write directly? Telegram @vx_ceo

Discuss a system