Forecasting with Chronos

Open In Colab Open In SageMaker Studio Lab

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]
../../_images/107494aeaeae3f9b24eb2bf9384668d6a52cf2fa2f8c5cab9c5a47f2f8b3c47a.png

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 a target_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.

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.