TimeSSM-2.5M
A 2.5M-parameter zero-shot time series forecaster built on a diagonal linear state space model (S4D), trained from scratch on 15.85 billion observations of public time series. It forecasts any horizon in one pass, outputs nine quantiles, and exposes its sampling interval as an inference-time knob: the same weights run a series at any rate.
It was trained by one person on three RTX 3090s, outside of any lab or company.
The animation is a lattice-Boltzmann flow past an obstacle shaped like the letters, 48 by 96 pixels, each pixel forecast as its own series 256 frames ahead from 1024 frames of context, with the sampling interval set from the shedding period. The red frame marks the end of the context. Mean absolute error over the horizon: 0.0094 against 0.0458 for freezing the last frame; empirical 80 % coverage 0.785.
GIFT-Eval results
97 configurations, zero-shot. MASE and CRPS are geometric means of the ratio to the official seasonal naive, as on the leaderboard. Lower is better. All numbers come from the released checkpoint, the last one of its training run; no checkpoint was picked on GIFT-Eval. The evaluation harness reproduces t0-beta's official per-configuration results on 97 of 97 configurations.
With inference-time backtest resampling
| MASE | CRPS | |
|---|---|---|
| TimeSSM-2.5M + backtest resampling | 0.7544 | 0.5128 |
The context is resampled at several rates (decimation by 2 to 48, upsampling by 2 to 4) and forecast at each; a causal backtest on the series' own past weights the candidates and the forecasts are mixed per quantile level, with sign-flip averaging. The quantile fan is widened by nine per-level factors calibrated on the training corpus. Nothing is fitted on GIFT-Eval data. It costs 20 to 40 forecasts per series instead of one.
Bare model
| MASE | CRPS | |
|---|---|---|
| TimeSSM-2.5M | 0.7985 | 0.5451 |
One forward pass per series, no averaging, no resampling, no calibration.
Where it stands
Among the models of the GIFT-Eval leaderboard under 10M parameters, sorted by CRPS (leaderboard numbers and parameter counts from its metadata; the two TimeSSM rows and the Chronos-Bolt rows from this harness):
| Model | Parameters | CRPS ratio |
|---|---|---|
| FlowState-9.1M | 9.1M | 0.502 |
| TimeSSM-2.5M + backtest resampling | 2.5M | 0.513 |
| TTM-R3 | 1.4M | 0.520 |
| Toto-2.0-4m | 4.1M | 0.524 |
| Chronos-Bolt tiny + the same resampling layer | 9M | 0.532 |
| TempoPFN | n/a | 0.533 |
| TinyCast | 0.1M | 0.545 |
| TimeSSM-2.5M | 2.5M | 0.545 |
| goia-forecast-nano | 4.7M | 0.553 |
| Kairos-10m | 9.9M | 0.554 |
| Metamorph-4.5M | n/a | 0.555 |
| Chronos-Bolt tiny | 9M | 0.601 |
| YingLong-6m | 7.3M | 0.609 |
TTM-R3 saw GIFT-Eval data in pretraining. Above 10M for scale: Chronos-Bolt small (48M) is at 0.564 bare and 0.515 with the same resampling layer; bare against bare, TimeSSM-2.5M beats it on both metrics.
Per configuration
Ratios to the official seasonal naive, released checkpoint, with backtest resampling and bare.
97 configurations
| Configuration | MASE (resampling) | CRPS (resampling) | MASE (bare) | CRPS (bare) |
|---|---|---|---|---|
| bitbrains_fast_storage/5T/long | 0.897 | 0.681 | 0.851 | 0.764 |
| bitbrains_fast_storage/5T/medium | 0.910 | 0.612 | 0.861 | 0.578 |
| bitbrains_fast_storage/5T/short | 0.714 | 0.350 | 0.683 | 0.339 |
| bitbrains_fast_storage/H/short | 0.935 | 0.658 | 0.890 | 0.671 |
| bitbrains_rnd/5T/long | 0.992 | 0.563 | 0.989 | 0.464 |
| bitbrains_rnd/5T/medium | 0.997 | 0.496 | 0.993 | 0.465 |
| bitbrains_rnd/5T/short | 0.933 | 0.400 | 0.899 | 0.377 |
| bitbrains_rnd/H/short | 1.001 | 0.472 | 0.988 | 0.441 |
| bizitobs_application/10S/long | 1.109 | 1.215 | 1.244 | 1.410 |
| bizitobs_application/10S/medium | 1.066 | 1.044 | 1.466 | 1.373 |
| bizitobs_application/10S/short | 0.868 | 0.491 | 0.859 | 0.579 |
| bizitobs_l2c/5T/long | 0.310 | 0.311 | 0.852 | 0.931 |
| bizitobs_l2c/5T/medium | 0.375 | 0.379 | 0.689 | 0.704 |
| bizitobs_l2c/5T/short | 0.291 | 0.293 | 0.358 | 0.377 |
| bizitobs_l2c/H/long | 0.376 | 0.262 | 0.390 | 0.272 |
| bizitobs_l2c/H/medium | 0.318 | 0.251 | 0.329 | 0.264 |
| bizitobs_l2c/H/short | 0.388 | 0.385 | 0.428 | 0.421 |
| bizitobs_service/10S/long | 0.999 | 0.969 | 1.771 | 1.324 |
| bizitobs_service/10S/medium | 0.892 | 0.621 | 1.773 | 1.187 |
| bizitobs_service/10S/short | 0.737 | 0.370 | 0.992 | 0.502 |
| car_parts/M/short | 0.783 | 0.622 | 0.698 | 0.560 |
| covid_deaths/D/short | 0.843 | 0.289 | 0.823 | 0.338 |
| electricity/15T/long | 0.787 | 0.689 | 0.806 | 0.713 |
| electricity/15T/medium | 0.779 | 0.707 | 0.786 | 0.714 |
| electricity/15T/short | 0.682 | 0.620 | 0.651 | 0.587 |
| electricity/D/short | 0.761 | 0.569 | 0.752 | 0.570 |
| electricity/H/long | 0.918 | 0.685 | 0.959 | 0.753 |
| electricity/H/medium | 0.826 | 0.641 | 0.842 | 0.686 |
| electricity/H/short | 0.711 | 0.635 | 0.731 | 0.658 |
| electricity/W/short | 0.673 | 0.484 | 0.703 | 0.532 |
| ett1/15T/long | 0.846 | 0.679 | 0.888 | 0.749 |
| ett1/15T/medium | 0.839 | 0.722 | 0.888 | 0.797 |
| ett1/15T/short | 0.766 | 0.689 | 0.796 | 0.724 |
| ett1/D/short | 0.945 | 0.676 | 0.952 | 0.679 |
| ett1/H/long | 0.926 | 0.580 | 0.947 | 0.629 |
| ett1/H/medium | 0.830 | 0.604 | 0.884 | 0.656 |
| ett1/H/short | 0.851 | 0.751 | 0.876 | 0.776 |
| ett1/W/short | 0.837 | 0.809 | 0.891 | 0.882 |
| ett2/15T/long | 0.898 | 0.720 | 0.954 | 0.757 |
| ett2/15T/medium | 0.845 | 0.737 | 0.914 | 0.806 |
| ett2/15T/short | 0.712 | 0.698 | 0.727 | 0.712 |
| ett2/D/short | 1.119 | 0.747 | 0.999 | 0.643 |
| ett2/H/long | 1.020 | 0.569 | 0.987 | 0.547 |
| ett2/H/medium | 0.913 | 0.607 | 0.897 | 0.608 |
| ett2/H/short | 0.853 | 0.793 | 0.872 | 0.811 |
| ett2/W/short | 1.165 | 0.738 | 1.309 | 0.845 |
| hierarchical_sales/D/short | 0.669 | 0.338 | 0.659 | 0.335 |
| hierarchical_sales/W/short | 0.700 | 0.407 | 0.692 | 0.399 |
| hospital/M/short | 0.860 | 0.878 | 0.880 | 0.895 |
| jena_weather/10T/long | 0.849 | 0.204 | 0.850 | 0.209 |
| jena_weather/10T/medium | 0.845 | 0.226 | 0.859 | 0.231 |
| jena_weather/10T/short | 0.387 | 0.174 | 0.408 | 0.191 |
| jena_weather/D/short | 0.693 | 0.220 | 0.683 | 0.230 |
| jena_weather/H/long | 0.808 | 0.140 | 0.838 | 0.146 |
| jena_weather/H/medium | 0.961 | 0.151 | 1.113 | 0.165 |
| jena_weather/H/short | 0.720 | 0.273 | 0.743 | 0.275 |
| kdd_cup_2018/D/short | 0.785 | 0.554 | 0.800 | 0.562 |
| kdd_cup_2018/H/long | 0.762 | 0.479 | 0.785 | 0.490 |
| kdd_cup_2018/H/medium | 0.732 | 0.563 | 0.746 | 0.573 |
| kdd_cup_2018/H/short | 0.713 | 0.699 | 0.729 | 0.719 |
| loop_seattle/5T/long | 0.652 | 0.572 | 0.805 | 0.719 |
| loop_seattle/5T/medium | 0.753 | 0.655 | 0.819 | 0.730 |
| loop_seattle/5T/short | 0.716 | 0.582 | 0.774 | 0.635 |
| loop_seattle/D/short | 0.517 | 0.421 | 0.517 | 0.430 |
| loop_seattle/H/long | 0.607 | 0.339 | 0.657 | 0.369 |
| loop_seattle/H/medium | 0.668 | 0.422 | 0.680 | 0.427 |
| loop_seattle/H/short | 0.675 | 0.588 | 0.701 | 0.609 |
| m4_daily/D/short | 1.114 | 1.008 | 1.189 | 1.060 |
| m4_hourly/H/short | 1.419 | 0.709 | 1.543 | 0.750 |
| m4_monthly/M/short | 0.827 | 0.828 | 0.840 | 0.846 |
| m4_quarterly/Q/short | 0.795 | 0.804 | 0.835 | 0.842 |
| m4_weekly/W/short | 0.909 | 0.659 | 0.994 | 0.696 |
| m4_yearly/A/short | 0.921 | 0.935 | 0.896 | 0.898 |
| m_dense/D/short | 0.432 | 0.307 | 0.424 | 0.301 |
| m_dense/H/long | 0.597 | 0.349 | 0.589 | 0.346 |
| m_dense/H/medium | 0.483 | 0.333 | 0.487 | 0.335 |
| m_dense/H/short | 0.558 | 0.502 | 0.581 | 0.520 |
| restaurant/D/short | 0.692 | 0.388 | 0.684 | 0.385 |
| saugeen/D/short | 0.836 | 0.581 | 0.927 | 0.660 |
| saugeen/M/short | 0.745 | 0.653 | 0.718 | 0.623 |
| saugeen/W/short | 0.583 | 0.477 | 0.591 | 0.490 |
| solar/10T/long | 1.031 | 0.514 | 1.101 | 0.546 |
| solar/10T/medium | 0.933 | 0.520 | 0.972 | 0.526 |
| solar/10T/short | 1.002 | 0.683 | 1.017 | 0.628 |
| solar/D/short | 0.881 | 0.523 | 0.927 | 0.530 |
| solar/H/long | 0.973 | 0.337 | 0.911 | 0.326 |
| solar/H/medium | 0.943 | 0.345 | 0.930 | 0.355 |
| solar/H/short | 0.911 | 0.559 | 0.899 | 0.552 |
| solar/W/short | 0.655 | 0.618 | 0.782 | 0.740 |
| sz_taxi/15T/long | 0.736 | 0.457 | 0.728 | 0.455 |
| sz_taxi/15T/medium | 0.761 | 0.537 | 0.752 | 0.534 |
| sz_taxi/15T/short | 0.717 | 0.655 | 0.719 | 0.660 |
| sz_taxi/H/short | 0.760 | 0.635 | 0.787 | 0.664 |
| temperature_rain/D/short | 0.672 | 0.437 | 0.669 | 0.438 |
| us_births/D/short | 0.255 | 0.209 | 0.294 | 0.239 |
| us_births/M/short | 1.110 | 1.071 | 0.910 | 0.875 |
| us_births/W/short | 0.764 | 0.745 | 0.707 | 0.645 |
How to read the numbers
- The model receives the declared sampling frequency of the series and sets its sampling interval to 24 / season (FlowState's convention). It was trained this way. Evaluated without the frequency it is not the model of this card.
- Zero-shot: the training corpus excludes the GIFT-Eval sources by construction.
- The harness recomputes the leaderboard metrics from the raw data with the official seasonal-naive denominators. Chronos-Bolt numbers are from chronos-forecasting 2.3.2, whose medium- and long-horizon results differ from the leaderboard's.
Model
Six gated S4D blocks (complex diagonal state, d_model 192, d_state 32), one token per time step, a learned future token for the horizon, a quantile head with cross-attention on the context. 2,525,771 parameters. Robust arcsinh scaling and instance normalization from the context. Any horizon, no autoregressive loop. Nine quantiles, 0.1 to 0.9.
Trained on three RTX 3090s with a pinball loss on the nine quantiles, on a corpus of 106 files (LOTSA subsets at a pinned revision, four Chronos datasets, synthetic families).
Limitations
- The bare model is a short-horizon model; the resampling layer carries the medium and long terms.
- Weakest groups: 10-second cloud-operations traces, hourly data with a weekly cycle (m4_hourly), low-frequency economic series (m4 weekly and yearly).
- The resampling layer multiplies inference cost by 20 to 40.
- Univariate. The frequency must be declared; there is no detector.
Inference
import torch
from timessm import from_pretrained, delta_scale
model = from_pretrained("IUseAMouse/timessm-2.5m") # or a local directory; device="cuda" to run there
context = torch.tensor(series, dtype=torch.float32).unsqueeze(0) # [1, length]
w = delta_scale(24, *model.delta_range) # hourly data with a daily cycle
with torch.no_grad():
out = model.forecast(context, 48, w=w)
quantiles = out["quantiles_denorm"][0] # [48, 9], levels 0.1 to 0.9; column 4 is the median
w is 24 divided by the season length of the declared frequency: 96 for 15-minute data,
24 for hourly, 7 for daily data with a weekly cycle, 12 for monthly. The backtest
resampling layer runs through the evaluation harness, see the repository.
Reproduction
Code, configs and the evaluation harness: github.com/IUseAMouse/TimeSSM. The model repository (TimeSSM) and the harness repository (TimeJEPA) contain the training configs, the inference config of the card's number, the calibration file, the frequency table and one command per row of this card.
Files and license
- Weights:
model.safetensorswithconfig.json(read bytimessm.from_pretrained), the calibration factors, the frequency table, and the original Lightning checkpointepoch00_valloss1.2814.ckptfor exact reproduction through the harness. - Code: TimeSSM (model, Apache-2.0) and TimeJEPA (harness, MIT).
- Weights license: Apache-2.0, the same as the code.
Citation
@misc{vincent2026timessm,
author = {Vincent, Yvann},
title = {TimeSSM: a state space forecaster with a rate knob},
year = {2026},
url = {https://github.com/IUseAMouse/TimeSSM}
}
- Downloads last month
- 17
