Forecasting with Chronos¶
AutoGluon-TimeSeries (AG-TS) includes Chronos family of forecasting models. Chronos models are pretrained on a large collection of real & synthetic time series data, which enables them to make accurate forecasts on new data out of the box.
AG-TS provides a robust and easy way to use Chronos through the familiar TimeSeriesPredictor
API. This tutorial describes how to
Use Chronos models in zero-shot mode to make forecasts without any dataset-specific training
Fine-tune Chronos models on custom data to improve the accuracy
Handle covariates & static features by combining Chronos with a tabular regression model
Note
New in v1.2: AutoGluon now features Chronos-Bolt⚡️ — new, more accurate, and up to 250x faster Chronos models.
Getting started with Chronos¶
Being a pretrained model for zero-shot forecasting, Chronos is different from other models available in AG-TS.
Specifically, Chronos models do not really fit
time series data. However, when predict
is called, they carry out a relatively more expensive computation that scales linearly with the number of time series in the dataset. In this aspect, they behave like local statistical models such as ETS or ARIMA, where all computation happens during inference.
AutoGluon supports both the original Chronos models (e.g., chronos-t5-large
), as well as the new, more accurate and up to 250x faster Chronos-Bolt⚡ models (e.g., chronos-bolt-base
).
The easiest way to get started with Chronos is through the model-specific presets.
(recommended) The new, fast Chronos-Bolt️ models can be accessed using the
"bolt_tiny"
,"bolt_mini"
,"bolt_small"
and"bolt_base"
presets.The original Chronos models can be accessed using the
"chronos_tiny"
,"chronos_mini"
,"chronos_small"
,"chronos_base"
and"chronos_large"
presets.
Note that the original Chronos models of size small
and above require a GPU to run, while all Chronos-Bolt models can be run both on a CPU and a GPU.
Alternatively, Chronos can be combined with other time series models using presets "medium_quality"
, "high_quality"
and "best_quality"
. More details about these presets are available in the documentation for TimeSeriesPredictor.fit
.
Zero-shot forecasting¶
Let’s work with a subset of the Australian Electricity Demand dataset to see Chronos-Bolt in action.
First, we load the dataset as a TimeSeriesDataFrame.
from autogluon.timeseries import TimeSeriesDataFrame, TimeSeriesPredictor
data = TimeSeriesDataFrame.from_path(
"https://autogluon.s3.amazonaws.com/datasets/timeseries/australian_electricity_subset/test.csv"
)
data.head()
target | ||
---|---|---|
item_id | timestamp | |
T000000 | 2013-03-10 00:00:00 | 5207.959961 |
2013-03-10 00:30:00 | 5002.275879 | |
2013-03-10 01:00:00 | 4747.569824 | |
2013-03-10 01:30:00 | 4544.880859 | |
2013-03-10 02:00:00 | 4425.952148 |
Next, we create the TimeSeriesPredictor and select the "bolt_small"
presets to use the Chronos-Bolt (Small, 48M) model in zero-shot mode.
prediction_length = 48
train_data, test_data = data.train_test_split(prediction_length)
predictor = TimeSeriesPredictor(prediction_length=prediction_length).fit(
train_data, presets="bolt_small",
)
Sorting the dataframe index before generating the train/test split.
Beginning AutoGluon training...
AutoGluon will save models to '/home/ci/autogluon/docs/tutorials/timeseries/AutogluonModels/ag-20250718_212810'
=================== System Info ===================
AutoGluon Version: 1.3.2b20250718
Python Version: 3.12.10
Operating System: Linux
Platform Machine: x86_64
Platform Version: #1 SMP Wed Mar 12 14:53:59 UTC 2025
CPU Count: 8
GPU Count: 1
Memory Avail: 28.58 GB / 30.95 GB (92.3%)
Disk Space Avail: 206.79 GB / 255.99 GB (80.8%)
===================================================
Setting presets to: bolt_small
Fitting with arguments:
{'enable_ensemble': True,
'eval_metric': WQL,
'hyperparameters': {'Chronos': {'model_path': 'bolt_small'}},
'known_covariates_names': [],
'num_val_windows': 1,
'prediction_length': 48,
'quantile_levels': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
'random_seed': 123,
'refit_every_n_windows': 1,
'refit_full': False,
'skip_model_selection': True,
'target': 'target',
'verbosity': 2}
Inferred time series frequency: '30min'
Provided train_data has 172800 rows, 5 time series. Median time series length is 34560 (min=34560, max=34560).
Provided data contains following columns:
target: 'target'
AutoGluon will gauge predictive performance using evaluation metric: 'WQL'
This metric's sign has been flipped to adhere to being higher_is_better. The metric score can be multiplied by -1 to get the metric value.
===================================================
Starting training. Start time is 2025-07-18 21:28:10
Models that will be trained: ['Chronos[bolt_small]']
Training timeseries model Chronos[bolt_small].
2.35 s = Training runtime
Training complete. Models trained: ['Chronos[bolt_small]']
Total runtime: 2.53 s
Best model: Chronos[bolt_small]
As promised, Chronos does not take any time to fit
. The fit
call merely serves as a proxy for the TimeSeriesPredictor
to do some of its chores under the hood, such as inferring the frequency of time series and saving the predictor’s state to disk.
Let’s use the predict
method to generate forecasts, and the plot
method to visualize them.
predictions = predictor.predict(train_data)
predictor.plot(
data=data,
predictions=predictions,
item_ids=data.item_ids[:2],
max_history_length=200,
);
Model not specified in predict, will default to the model with the best validation score: Chronos[bolt_small]

Fine-tuning¶
We have seen above how Chronos models can produce forecasts in zero-shot mode. AutoGluon also makes it easy to fine-tune Chronos models on a specific dataset to maximize the predictive accuracy.
The following snippet specifies two settings for the Chronos-Bolt ️(Small) model: zero-shot and fine-tuned. TimeSeriesPredictor
will perform a lightweight fine-tuning of the pretrained model on the provided training data. We add name suffixes to easily identify the zero-shot and fine-tuned versions of the model.
predictor = TimeSeriesPredictor(prediction_length=prediction_length).fit(
train_data=train_data,
hyperparameters={
"Chronos": [
{"model_path": "bolt_small", "ag_args": {"name_suffix": "ZeroShot"}},
{"model_path": "bolt_small", "fine_tune": True, "ag_args": {"name_suffix": "FineTuned"}},
]
},
time_limit=60, # time limit in seconds
enable_ensemble=False,
)
Beginning AutoGluon training... Time limit = 60s
AutoGluon will save models to '/home/ci/autogluon/docs/tutorials/timeseries/AutogluonModels/ag-20250718_212814'
=================== System Info ===================
AutoGluon Version: 1.3.2b20250718
Python Version: 3.12.10
Operating System: Linux
Platform Machine: x86_64
Platform Version: #1 SMP Wed Mar 12 14:53:59 UTC 2025
CPU Count: 8
GPU Count: 1
Memory Avail: 27.92 GB / 30.95 GB (90.2%)
Disk Space Avail: 206.79 GB / 255.99 GB (80.8%)
===================================================
Fitting with arguments:
{'enable_ensemble': False,
'eval_metric': WQL,
'hyperparameters': {'Chronos': [{'ag_args': {'name_suffix': 'ZeroShot'},
'model_path': 'bolt_small'},
{'ag_args': {'name_suffix': 'FineTuned'},
'fine_tune': True,
'model_path': 'bolt_small'}]},
'known_covariates_names': [],
'num_val_windows': 1,
'prediction_length': 48,
'quantile_levels': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
'random_seed': 123,
'refit_every_n_windows': 1,
'refit_full': False,
'skip_model_selection': False,
'target': 'target',
'time_limit': 60,
'verbosity': 2}
Inferred time series frequency: '30min'
Provided train_data has 172800 rows, 5 time series. Median time series length is 34560 (min=34560, max=34560).
Provided data contains following columns:
target: 'target'
AutoGluon will gauge predictive performance using evaluation metric: 'WQL'
This metric's sign has been flipped to adhere to being higher_is_better. The metric score can be multiplied by -1 to get the metric value.
===================================================
Starting training. Start time is 2025-07-18 21:28:14
Models that will be trained: ['ChronosZeroShot[bolt_small]', 'ChronosFineTuned[bolt_small]']
Training timeseries model ChronosZeroShot[bolt_small]. Training for up to 30.0s of the 60.0s of remaining time.
-0.0417 = Validation score (-WQL)
0.03 s = Training runtime
0.48 s = Validation (prediction) runtime
Training timeseries model ChronosFineTuned[bolt_small]. Training for up to 59.4s of the 59.4s of remaining time.
Detected kernel version 4.14.355, which is below the recommended minimum of 5.5.0; this can cause the process to hang. It is recommended to upgrade the kernel to the minimum version or higher.
Saving fine-tuned model to /home/ci/autogluon/docs/tutorials/timeseries/AutogluonModels/ag-20250718_212814/models/ChronosFineTuned[bolt_small]/W0/fine-tuned-ckpt
-0.0290 = Validation score (-WQL)
48.83 s = Training runtime
0.03 s = Validation (prediction) runtime
Training complete. Models trained: ['ChronosZeroShot[bolt_small]', 'ChronosFineTuned[bolt_small]']
Total runtime: 49.39 s
Best model: ChronosFineTuned[bolt_small]
Best model score: -0.0290
Here we used the default fine-tuning configuration for Chronos by only specifying "fine_tune": True
. However, AutoGluon makes it easy to change other parameters for fine-tuning such as the number of steps or learning rate.
predictor.fit(
...,
hyperparameters={"Chronos": {"fine_tune": True, "fine_tune_lr": 1e-4, "fine_tune_steps": 2000}},
)
For the full list of fine-tuning options, see the Chronos documentation in Forecasting Model Zoo.
After fitting, we can evaluate the two model variants on the test data and generate a leaderboard.
predictor.leaderboard(test_data)
Additional data provided, testing on additional data. Resulting leaderboard will be sorted according to test score (`score_test`).
model | score_test | score_val | pred_time_test | pred_time_val | fit_time_marginal | fit_order | |
---|---|---|---|---|---|---|---|
0 | ChronosFineTuned[bolt_small] | -0.033450 | -0.029033 | 0.408892 | 0.034290 | 48.827784 | 2 |
1 | ChronosZeroShot[bolt_small] | -0.041446 | -0.041720 | 0.552868 | 0.483076 | 0.028201 | 1 |
Fine-tuning resulted in a more accurate model, as shown by the better score_test
on the test set.
Note that all AutoGluon-TimeSeries models report scores in a “higher is better” format, meaning that most forecasting error metrics like WQL are multiplied by -1 when reported.
Incorporating the covariates¶
Chronos️ is a univariate model, meaning it relies solely on the historical data of the target time series for making predictions. However, in real-world scenarios, additional exogenous information related to the target series (e.g., holidays, promotions) is often available. Leveraging this information when making predictions can improve forecast accuracy.
AG-TS now features covariate regressors that can be combined with univariate models like Chronos-Bolt to incorporate exogenous information.
A covariate_regressor
in AG-TS is a tabular regression model that is fit on the known covariates and static features to predict the target column at the each time step. The predictions of the covariate regressor are subtracted from the target column, and the univariate model then forecasts the residuals.
data = TimeSeriesDataFrame.from_path(
"https://autogluon.s3.amazonaws.com/datasets/timeseries/grocery_sales/test.csv",
)
data.head()
scaled_price | promotion_email | promotion_homepage | unit_sales | ||
---|---|---|---|---|---|
item_id | timestamp | ||||
1062_101 | 2018-01-01 | 0.879130 | 0.0 | 0.0 | 636.0 |
2018-01-08 | 0.994517 | 0.0 | 0.0 | 123.0 | |
2018-01-15 | 1.005513 | 0.0 | 0.0 | 391.0 | |
2018-01-22 | 1.000000 | 0.0 | 0.0 | 339.0 | |
2018-01-29 | 0.883309 | 0.0 | 0.0 | 661.0 |
We use a grocery sales dataset to demonstrate how Chronos-Bolt can be combined with a covariate regressor. This dataset includes 3 known covariates: scaled_price
, promotion_email
and promotion_homepage
and the task is to forecast the unit_sales
.
prediction_length = 8
train_data, test_data = data.train_test_split(prediction_length=prediction_length)
The following code fits a TimeSeriesPredictor to forecast unit_sales
for the next 8 weeks.
Note that we have specified the target column we are interested in forecasting and the names of known covariates while constructing the TimeSeriesPredictor.
We define two configurations for Chronos-Bolt:
zero-shot configuration that uses only the historical values of
unit_sales
without considering the covariates;a configuration with a CatBoost regression model as the
covariate_regressor
. Note that we recommend to apply atarget_scaler
when using a covariate regressor. Target scaler ensures that all time series have comparable scales, often leading to better accuracy.
Like before, we add suffixes to model names to more easily distinguish them in the leaderboard.
predictor = TimeSeriesPredictor(
prediction_length=prediction_length,
target="unit_sales",
known_covariates_names=["scaled_price", "promotion_email", "promotion_homepage"],
).fit(
train_data,
hyperparameters={
"Chronos": [
# Zero-shot model WITHOUT covariates
{
"model_path": "bolt_small",
"ag_args": {"name_suffix": "ZeroShot"},
},
# Chronos-Bolt (Small) combined with CatBoost on covariates
{
"model_path": "bolt_small",
"covariate_regressor": "CAT",
"target_scaler": "standard",
"ag_args": {"name_suffix": "WithRegressor"},
},
],
},
enable_ensemble=False,
time_limit=60,
)
Beginning AutoGluon training... Time limit = 60s
AutoGluon will save models to '/home/ci/autogluon/docs/tutorials/timeseries/AutogluonModels/ag-20250718_212905'
=================== System Info ===================
AutoGluon Version: 1.3.2b20250718
Python Version: 3.12.10
Operating System: Linux
Platform Machine: x86_64
Platform Version: #1 SMP Wed Mar 12 14:53:59 UTC 2025
CPU Count: 8
GPU Count: 1
Memory Avail: 27.66 GB / 30.95 GB (89.4%)
Disk Space Avail: 206.60 GB / 255.99 GB (80.7%)
===================================================
Fitting with arguments:
{'enable_ensemble': False,
'eval_metric': WQL,
'hyperparameters': {'Chronos': [{'ag_args': {'name_suffix': 'ZeroShot'},
'model_path': 'bolt_small'},
{'ag_args': {'name_suffix': 'WithRegressor'},
'covariate_regressor': 'CAT',
'model_path': 'bolt_small',
'target_scaler': 'standard'}]},
'known_covariates_names': ['scaled_price',
'promotion_email',
'promotion_homepage'],
'num_val_windows': 1,
'prediction_length': 8,
'quantile_levels': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
'random_seed': 123,
'refit_every_n_windows': 1,
'refit_full': False,
'skip_model_selection': False,
'target': 'unit_sales',
'time_limit': 60,
'verbosity': 2}
Inferred time series frequency: 'W-MON'
Provided train_data has 7337 rows (NaN fraction=6.6%), 319 time series. Median time series length is 23 (min=23, max=23).
Provided data contains following columns:
target: 'unit_sales'
known_covariates:
categorical: []
continuous (float): ['scaled_price', 'promotion_email', 'promotion_homepage']
To learn how to fix incorrectly inferred types, please see documentation for TimeSeriesPredictor.fit
AutoGluon will gauge predictive performance using evaluation metric: 'WQL'
This metric's sign has been flipped to adhere to being higher_is_better. The metric score can be multiplied by -1 to get the metric value.
===================================================
Starting training. Start time is 2025-07-18 21:29:06
Models that will be trained: ['ChronosZeroShot[bolt_small]', 'ChronosWithRegressor[bolt_small]']
Training timeseries model ChronosZeroShot[bolt_small]. Training for up to 30.0s of the 59.9s of remaining time.
-0.4523 = Validation score (-WQL)
0.02 s = Training runtime
0.51 s = Validation (prediction) runtime
Training timeseries model ChronosWithRegressor[bolt_small]. Training for up to 59.4s of the 59.4s of remaining time.
-0.3460 = Validation score (-WQL)
0.47 s = Training runtime
0.52 s = Validation (prediction) runtime
Training complete. Models trained: ['ChronosZeroShot[bolt_small]', 'ChronosWithRegressor[bolt_small]']
Total runtime: 1.55 s
Best model: ChronosWithRegressor[bolt_small]
Best model score: -0.3460
Once the predictor has been fit, we can evaluate it on the test dataset and generate the leaderboard. We see that the model that utilizes the covariates produces a more accurate forecast on the test set.
predictor.leaderboard(test_data)
Additional data provided, testing on additional data. Resulting leaderboard will be sorted according to test score (`score_test`).
model | score_test | score_val | pred_time_test | pred_time_val | fit_time_marginal | fit_order | |
---|---|---|---|---|---|---|---|
0 | ChronosWithRegressor[bolt_small] | -0.272757 | -0.346044 | 0.574655 | 0.522433 | 0.471951 | 2 |
1 | ChronosZeroShot[bolt_small] | -0.318562 | -0.452296 | 0.507294 | 0.514747 | 0.021260 | 1 |
Note that the covariates may not always be useful — for some datasets, the zero-shot model may achieve better accuracy. Therefore, it’s always important to try out multiple models and select the one that achieves the best accuracy on held-out data. This is done automatically in AutoGluon’s "high_quality"
and "best_quality"
presets.
FAQ¶
How accurate is Chronos?¶
In several independent evaluations we found Chronos to be effective in zero-shot forecasting.
The accuracy of Chronos-Bolt (base) often exceeds statistical baseline models, and is often comparable to deep learning
models such as TemporalFusionTransformer
or PatchTST
.
What is the recommended hardware for running Chronos models?¶
For fine-tuning and inference with larger Chronos and Chronos-Bolt models, we tested the AWS g5.2xlarge
and p3.2xlarge
instances that feature NVIDIA A10G and V100 GPUs, with at least 16GiB of GPU memory and 32GiB of main memory.
Chronos-Bolt models can also be used on CPU machines, but this will typically result in a longer runtime.
Where can I ask specific questions on Chronos?¶
The AutoGluon team are among the core developers of Chronos. So you can ask Chronos-related questions on AutoGluon channels such as the Discord server, or GitHub. You can also join the discussion on the Chronos GitHub page.