SARIMA (Seasonal ARIMA) is one of the most widely used models for time series forecasting. However, choosing the right parameters (p,d,q) and seasonal parameters (P,D,Q,s) is often difficult and time-consuming.
Instead of manually testing combinations, we can use Hyperopt to automatically search for the best SARIMA parameters.
In this guide, you’ll learn how to finetune a SARIMA model using Hyperopt in Python step by step.
Why Use Hyperopt for SARIMA?
Hyperopt is a Python library for hyperparameter optimization. It uses smart search strategies like Tree-structured Parzen Estimators (TPE) to efficiently explore parameter space.
Using Hyperopt with SARIMA helps you:
- avoid manual trial and error
- find better forecasting models
- save time on parameter tuning
- improve prediction accuracy
Step 1: Install Required Libraries
Make sure you have the necessary libraries installed, including statsmodels for SARIMA modeling and hyperopt for hyperparameter optimization.
pip install statsmodels hyperopt import numpy as np import pandas as pd import statsmodels.api as sm from hyperopt import fmin, tpe, hp from sklearn.metrics import mean_squared_error
Step 2: Load and Prepare Time Series Data
Load and preprocess your time series data. Ensure that the data is in a suitable format for SARIMA modeling, such as a pandas DataFrame with a datetime index.
# Load your time series data
data = pd.read_csv('your_data.csv')
# Preprocess the data if needed (e.g., handle missing values, transform variables)
# Set the datetime index
data['datetime_column'] = pd.to_datetime(data['datetime_column'])
data.set_index('datetime_column', inplace=True)
# Split the data into training and validation sets
train_data = data.loc['start_date':'end_date']
val_data = data.loc['start_date':'end_date']Make sure your data has:
- a datetime index
- consistent frequency
- missing values handled
Step 3: Define the Objective Function
Create an objective function that takes SARIMA parameters as input, fits the model, and returns the performance metric (e.g., mean squared error) on the validation set. This function will be minimized by Hyperopt.
def sarima_objective(params):
order = params['order']
seasonal_order = params['seasonal_order']
# Fit SARIMA model
model = sm.tsa.SARIMAX(train_data, order=order, seasonal_order=seasonal_order)
fitted_model = model.fit(disp=False)
# Make predictions on the validation set
predictions = fitted_model.forecast(len(val_data))
# Calculate the mean squared error
mse = mean_squared_error(val_data, predictions)
return mseStep 4: Define SARIMA Search Space
Specify the search space for the SARIMA parameters that you want to tune using Hyperopt. For example, you can define ranges for p, d, q, P, D, Q, and s.
space = {
'order': hp.choice('order', [(p, d, q) for p in range(3) for d in range(3) for q in range(3)]),
'seasonal_order': hp.choice('seasonal_order', [((P, D, Q, s),) for P in range(3) for D in range(3) for Q in range(3) for s in [12]])
}Here:
(p,d,q)are non-seasonal parameters(P,D,Q,12)are seasonal parameters (12 for monthly seasonality)
Step 5: Run Hyperopt Optimization
Run the optimization process using the defined objective function and search space.
from hyperopt import fmin, tpe
best = fmin(
fn=sarima_objective,
space=space,
algo=tpe.suggest,
max_evals=50
)Increase max_evals for better results if your system allows.
Step 6: Retrieve Best SARIMA Parameters
Retrieve the best parameter combination found by Hyperopt.
from hyperopt import space_eval
best_params = space_eval(space, best)
print(best_params)
Output:
{'order': (1, 1, 1), 'seasonal_order': (1, 1, 0, 12)}Step 7: Train Final SARIMA Model
final_model = sm.tsa.SARIMAX(
data,
order=best_params["order"],
seasonal_order=best_params["seasonal_order"]
).fit()
forecast = final_model.forecast(steps=12)
print(forecast)
Now you have a finetuned SARIMA model optimized using Hyperopt.
Key Takeaways
- SARIMA performance strongly depends on parameters
- Hyperopt automates SARIMA hyperparameter tuning
- This approach saves time and improves accuracy
- Works well for real-world forecasting systems
Conclusion
Finetuning a SARIMA model using Hyperopt is a powerful way to build better time-series forecasts without manually testing dozens of combinations. This method is especially useful when working with business, finance, demand forecasting, or seasonal datasets.
Once you build this pipeline, you can reuse it across multiple projects.


