ES
← Back to Portfolio
Scientific Machine Learning July 2026

ChronoScope — Univariate Forecasting Atlas with a Foundation-Model Tier

A univariate time-series forecasting atlas: 15 diagnostic cases (4 real, licensed + 11 seeded synthetic), each forecast by the same 19-method ladder with backtested MASE/sMAPE/coverage, from classical baselines through ML and deep nets to four zero-shot foundation models (Chronos-Bolt, Chronos-2, TimesFM-2.5, TiRex-2). A 10-module statistical analysis suite runs alongside. Everything is baked offline and replayed in a static SPA; a Pyodide live lane forecasts a bring-your-own-series with a numpy core. Honest by design: the foundation models are offline-only, and on real M4-hourly a plain SeasonalNaive beats TimesFM-2.5.

Cases
15 diagnostic cases: 4 real licensed (UCI Electricity, UCI Beijing PM2.5, Monash/M4 hourly + daily, CC-BY-4.0) + 11 seeded synthetic (seasonal, trend, intermittent, random walk, white-noise control, level shift, GARCH, fractional, Mackey-Glass, exogenous)
Method ladder
8 classical (SeasonalNaive, SES, Holt, HoltWinters, Theta, AutoETS, AutoTheta, AutoARIMA) · 1 ML (LightGBM) · 6 deep (NHITS, DLinear, NLinear) · 4 foundation (Chronos-Bolt, Chronos-2, TimesFM-2.5, TiRex-2)
Benchmark (real)
Backtested MASE on real M4-hourly: TiRex-2 0.476 (best) · Chronos-2 0.589 · SeasonalNaive 0.641 · TimesFM-2.5 0.729. FM backtest windows are capped for speed, so the FM tier rests on fewer windows than the classical tier
Analysis suite
10 modules: stationarity, autocorrelation, seasonality, filters (HP/CF/EMD/scalogram), changepoints (PELT/CUSUM/Markov), volatility (ARCH-LM/GARCH), distribution (KDE/QQ/catch22), fractal (Hurst/ARFIMA), nonlinear, causality
Data governance
Licence-gated provenance registry with an enforced export guard: non-redistributable sources (M5, Stooq) run locally but cannot leak derived artifacts into the public repo. 163 Python tests, 56 docs pages
Compute
Offline lane bakes all numbers (Python, seeded, GPU + a WSL2 sub-lane for TiRex-2); the SPA replays them. Live lane: a Pyodide numpy core forecasts a user series in the browser (no foundation models in the browser). Static on GitHub Pages
ChronoScope — Univariate Forecasting Atlas with a Foundation-Model Tier — Architecture
#scientific-ml #time-series #forecasting #foundation-models #chronos #timesfm #tirex #statsforecast #onnx #pyodide #benchmark

Business Context

Anyone who has to pick a forecasting method for a real signal (load, demand, air quality, a sensor stream) faces the same trap: adopt the newest tier because it is newest, or stay with a baseline out of habit, with no evidence for either on the series in front of them. ChronoScope is the evidence. It shows, per behaviour type, where each tier earns its complexity and where it does not, so the choice is made against backtested error and calibrated coverage rather than a vendor claim. It also carries a licence-gated data provenance registry: non-redistributable sources can run in the private pipeline but a testable export guard stops their derived artifacts from ever leaking into the public repo.

Strategic Value

The differentiator is real licensed data plus published limit results, not a leaderboard. The foundation-model tier genuinely runs (four models, zero-shot from local checkpoints, including a hard cross-OS lane for TiRex-2), and its best real-case result is strong: MASE 0.476 (TiRex-2 on M4-hourly) against 0.641 for SeasonalNaive. But ChronoScope refuses the blanket claim: on that same real case a one-line SeasonalNaive (0.641) beats TimesFM-2.5 (0.729), and dedicated white-noise and random-walk cases exist precisely as honesty controls where no method should win. Interval coverage is reported next to point error, exposing deep methods whose 80%-nominal bands cover far less. The foundation models are offline-only; the live browser lane is the numpy core, and the card says so. It is a reusable pattern for method selection made on backtested evidence with the negative results left in.

The Challenge

Univariate forecasting has a crowded method space (exponential smoothing, ARIMA, gradient boosting, deep nets, and now pretrained time-series foundation models) and a marketing problem: each new tier arrives claimed as a general winner. The useful questions are quieter. On which kind of series does a given method actually help, is a pretrained foundation model worth its cost against a one-line seasonal baseline, and is the prediction interval it reports anywhere near its nominal coverage. Most demos answer none of these because they run one method on one flattering series.

Our Approach

ChronoScope fixes the axis and varies the method. Fifteen diagnostic cases each isolate one time-series behaviour: four are real and licensed (UCI Electricity, UCI Beijing PM2.5, Monash/M4 hourly and daily, all CC-BY-4.0), eleven are seeded, deterministic synthetics with their own generators (seasonal, trend, intermittent demand, random walk, white-noise control, level shift, GARCH volatility, fractional memory, chaotic Mackey-Glass, exogenous promo). Every case is forecast by the same 19-method ladder: eight classical/statistical (SeasonalNaive, SES, Holt, HoltWinters, Theta, AutoETS, AutoTheta, AutoARIMA), one ML (LightGBM), six deep (NHITS, DLinear, NLinear via neuralforecast and an in-house engine), and four zero-shot foundation models (Chronos-Bolt, Chronos-2, TimesFM-2.5, TiRex-2, the last via a purpose-built cross-OS WSL2/CUDA lane because its dependencies have no Windows wheels). Each method-case pair carries backtested MASE, sMAPE and interval coverage, plus a 10-module statistical analysis suite (stationarity, autocorrelation, seasonality, filters, changepoints, volatility, distribution, fractal, nonlinear, causality). The heavy work is offline and committed; the SPA replays it, and a Pyodide worker forecasts a user-pasted series with a pure-numpy core.

Key Performance Indicators

KPIBaselineResultImpact
Coverage of the method spaceOne method on one flattering series19-method ladder across 15 diagnostic cases (285 method-case backtests), classical to ML to deep to 4 foundation modelsSee per-behaviour where each tier earns its complexity
Foundation models, run not claimedA pinned dependency nobody executes4 zero-shot FMs baked for all 15 cases (Chronos-Bolt, Chronos-2, TimesFM-2.5, TiRex-2); TiRex-2 via a cross-OS WSL2/CUDA laneOffline-only; the live browser lane is the numpy core
Best real-case accuracySeasonalNaive MASE 0.641 (M4-hourly)TiRex-2 MASE 0.476 on real M4-hourly (backtested)A real gain, on a licensed real series, not a synthetic one
Honesty controls"Newest tier always wins"SeasonalNaive 0.641 beats TimesFM-2.5 0.729 on the same case; white-noise + random-walk null cases baked inThe foundation tier is not a blanket win, and the app shows it

Architecture

chronoscope pipeline

chronoscope pipeline

Fix the series, vary the method

ChronoScope is a univariate forecasting atlas. Instead of running one method on one series, it fixes 15 diagnostic cases (each isolating one time-series behaviour) and runs the same 19-method ladder on every one, with backtested MASE, sMAPE and interval coverage baked for all 285 method-case pairs. Live at chronoscope.fasl-work.com.

The ladder, and where each tier stops helping

The ladder climbs from 8 classical/statistical methods (SeasonalNaive, SES, Holt, HoltWinters, Theta, AutoETS, AutoTheta, AutoARIMA) through LightGBM and 6 deep nets (NHITS, DLinear, NLinear) to 4 zero-shot foundation models (Chronos-Bolt, Chronos-2, TimesFM-2.5, TiRex-2). The foundation tier is real: all four run zero-shot from local checkpoints, TiRex-2 through a purpose-built cross-OS WSL2/CUDA lane because its dependencies have no Windows wheels. Their numbers are committed for all 15 cases, not aspirational.

Real data, and a licence guard around it

Four cases are real and licensed (UCI Electricity, UCI Beijing PM2.5, Monash/M4 hourly and daily, all CC-BY-4.0); eleven are seeded synthetics with their own generators. A licence-gated provenance registry with an enforced export guard lets non-redistributable sources (M5, Stooq) run in the private pipeline while their derived artifacts can never leak into the public repo. This is a testable honesty mechanism, not a policy sentence.

Honest about the foundation tier

On real M4-hourly, TiRex-2 gives the best backtested error (MASE 0.476 vs SeasonalNaive’s 0.641), a genuine gain on a licensed real series. But the foundation tier is not a blanket win: on the same case a one-line SeasonalNaive (0.641) beats TimesFM-2.5 (0.729), and dedicated white-noise and random-walk control cases exist precisely where no method should win. Interval coverage is reported next to point error, exposing deep methods whose 80%-nominal bands cover far less. The foundation-tier backtest windows are capped for speed, so those numbers rest on fewer windows than the classical tier, and the app states it. The foundation models are offline-only: the live browser lane is a Pyodide numpy core, never an in-browser foundation model.

Live demo · Source on GitHub

Technology Stack

Python statsforecast neuralforecast LightGBM Chronos TimesFM TiRex Pyodide TypeScript React Vite KaTeX

In action

A short tour of the live app — the real interface, recorded from the deployed site.

ChronoScope — Univariate Forecasting Atlas with a Foundation-Model Tier in action

Application Screenshots

ChronoScope — Univariate Forecasting Atlas with a Foundation-Model Tier
ChronoScope — Univariate Forecasting Atlas with a Foundation-Model Tier