Mistral AI has released Timestral, its first family of time series foundation models. Timestral is a set of 4 zero-shot forecasting models from Mistral AI, sized from 5M to 209M parameters. The largest checkpoint ranks first among pretrained, zero-shot models on GIFT-Eval, TIME and fev-bench. It does this without a GPU at inference. For developers, this Timestral time series foundation model means probabilistic forecasts on standard server CPUs, with open weights and inference code.
TL;DR
- Size: 4 models: 5M, 28M, 123M, 209M parameters (dense). Context up to 32,768 time steps.
- Runs on: Standard server CPU, no GPU needed. 209M weights are 837 MB in fp32. GPU optional.
- Performance: #1 among zero-shot pretrained models on GIFT-Eval, TIME and fev-bench (Mistral-reported).
- Best: fev-bench SQL skill score of 50.39, ahead of TimesFM-3 at 48.99.
- Worst: GIFT-Eval MASE of 0.658 leads t0-gamma (0.661) by only 0.003.
What is Timestral?
Timestral is a time series foundation model (TSFM). It is pretrained on a large, diverse corpus, then forecasts zero-shot on data it has never seen. Classical tools like ARIMA fit one series at a time. Deep models like PatchTST usually train from scratch on each dataset. Timestral transfers patterns across domains instead.
Each model outputs 21 quantiles per time step. It forecasts multivariate targets jointly. It accepts past-only, known-future and categorical covariates.
How does Timestral work?
Timestral is a causal, patch-based transformer with time attention and variate attention. The 209M model uses 24 layers and an embedding dimension of 768. Each patch covers 32 time steps. A single forward pass forecasts up to 1,024 steps. Longer horizons run block by block, feeding each block’s median back as context.
Mistral lists 4 technical contributions:
- Decoupled Horizon Forecasting (DHF): Learned forecast tokens read the full history. Observed values stay in context instead of being masked, unlike contiguous patch masking in Toto 2.0 and TimesFM-3.
- Covariate-aware attention: Each series is a target, past-only covariate or known-future covariate. Information flows only from covariates to targets, preventing future leakage.
- Synthetic-first data: Most training data is synthetic, with trends, seasonality, noise and nonlinear cross-series dependencies.
- Two-stage training: Pretraining on synthetic data at context 8,192, then post-training on mixed data with 4x longer context. The loss is pinball loss over 21 quantiles.
{h:’Each series gets a role’,p:’Targets stay causal. Past-only covariates feed history. Known-future covariates (calendars, weather forecasts) see the whole window. Information flows only from covariates to targets.’,svg:function(){return ‘‘}},
{h:’Decoupled Horizon Forecasting’,p:’Instead of masking future patches, learned forecast tokens read the full history. Every observed value is both a training target and context. Up to 1,024 steps per forward pass.’,svg:function(){var s=””;for(var i=0;i<8;i++){s+=’
{h:’21 non-crossing quantiles’,p:’The quantile head outputs levels from 0.01 to 0.99 per step. Training uses pinball loss over 21 quantiles, a discrete approximation of CRPS.’,svg:function(){return ‘‘}}
];
var si=0,stage=document.getElementById(‘stage’);
function show(i){si=(i+4)%4;stage.innerHTML=’
‘+S[si].h+’
‘+S[si].p+’
‘+S[si].svg();R.querySelectorAll(‘.steps .stp’).forEach(function(b,k){b.classList.toggle(‘on’,k===si)});setTimeout(post,60)}
R.querySelectorAll(‘.steps .stp’).forEach(function(b){b.onclick=function(){show(+b.dataset.s)}});
document.getElementById(‘nxt’).onclick=function(){show(si+1)};
document.getElementById(‘prv’).onclick=function(){show(si-1)};
show(0);
var names=[‘Timestral-209M’,’t0-gamma’,’TimesFM-3′,’Toto-2.0-2.5B’,’Chronos-2′];
var M=[[0.658,0.661,0.667,0.696,0.698],[0.446,0.452,0.456,0.476,0.485],[0.626,0.637,0.640,0.642,0.662],[0.522,0.534,0.536,0.539,0.556],[50.39,49.42,48.99,44.42,47.28]];
var lower=[1,1,1,1,0],cur=0;
function bench(m){cur=m;var v=M[m],mx=Math.max.apply(null,v),mn=Math.min.apply(null,v),h=””;
v.forEach(function(x,i){var w=lower[m]?(mn/x)*100:(x/mx)*100;h+=’
‘+names[i]+’
‘+(m===4?x.toFixed(2):x.toFixed(3))+’
‘});
document.getElementById(‘rows’).innerHTML=h;document.getElementById(‘mnote’).textContent=lower[m]?’Lower is better. Bar length shows relative accuracy (best = full bar).’:’Higher is better.’;
setTimeout(function(){R.querySelectorAll(‘#rows i’).forEach(function(i){i.style.width=i.dataset.w+’%’})},40);
R.querySelectorAll(‘#seg .stp’).forEach(function(b,k){b.classList.toggle(‘on’,k===m)});setTimeout(post,60)}
R.querySelectorAll(‘#seg .stp’).forEach(function(b){b.onclick=function(){bench(+b.dataset.m)}});
function cpu(){R.querySelectorAll(‘.track i’).forEach(function(i){i.style.transition=’none’;i.style.width=”0″;setTimeout(function(){i.style.transition=’width 1.2s cubic-bezier(.2,.8,.2,1)’;i.style.width=i.dataset.w+’%’},40)});
R.querySelectorAll(‘.cnt’).forEach(function(c){var to=+c.dataset.to,t0=null;function f(ts){if(!t0)t0=ts;var k=Math.min((ts-t0)/1200,1);c.textContent=Math.round(to*k);if(k<1)requestAnimationFrame(f)}requestAnimationFrame(f)})}
bars();
window.addEventListener(‘load’,post);window.addEventListener(‘resize’,post);setTimeout(post,300);
})();

