Skip to main content

Multi-Seasonal Models

AnoFox provides 7 multi-seasonal models across 3 algorithm families: TBATS (trigonometric seasonality with Box-Cox and ARMA errors), MSTL (Loess-based decomposition), and MFLES (median-based, outlier-robust). These models handle data with overlapping seasonal cycles -- for example, hourly data with daily (24), weekly (168), and yearly (8,760) periods simultaneously. MFLES is particularly robust to noisy real-world data, while MFLESX adds exogenous variable support for external predictors.

Multi-seasonal models are forecasting methods that can capture two or more overlapping seasonal cycles simultaneously, such as hourly data with both daily and weekly patterns.

ModelDescription
TBATSTrigonometric seasonality, Box-Cox, ARMA errors
AutoTBATSAutomatic TBATS with parameter selection
MSTLMultiple Seasonal-Trend decomposition using Loess
AutoMSTLAutomatic MSTL with period detection
MFLESMedian-based Feature-Logic Expert System
AutoMFLESAutomatic MFLES configuration
MFLESXMFLES with exogenous variables
Showing 7 of 7

TBATS​

Trigonometric seasonality, Box-Cox transformation, ARMA errors, Trend, and Seasonal components. TBATS is designed specifically for handling complex multiple seasonalities.

Parameters​

ParameterTypeRequiredDescription
seasonal_periodsINTEGER[]YesMultiple seasonal periods (e.g., [24, 168] for hourly data)

Example​

-- Hourly data with daily (24) and weekly (168) seasonality
SELECT * FROM ts_forecast_by(
'hourly_energy', NULL, timestamp, consumption,
'TBATS', 336, '1h',
MAP{'seasonal_periods': '[24, 168]'}
);

Best for: Multiple seasonal patterns, high-frequency data.


AutoTBATS​

Automatic TBATS with parameter selection.

Parameters​

ParameterTypeDefaultDescription
seasonal_periodsINTEGER[]autoMultiple seasonal periods

Example​

SELECT * FROM ts_forecast_by(
'complex_data', NULL, timestamp, value,
'AutoTBATS', 336, '1h',
MAP{}
);

Best for: Multiple seasonality with automatic configuration.


MSTL​

Multiple Seasonal-Trend decomposition using Loess, extending the STL method to handle multiple seasonal periods. Decomposes series into trend + multiple seasonal components + remainder.

Parameters​

ParameterTypeRequiredDescription
seasonal_periodsINTEGER[]YesMultiple seasonal periods

Example​

-- Daily data with weekly (7) and yearly (365) seasonality
SELECT * FROM ts_forecast_by(
'daily_sales', NULL, date, sales,
'MSTL', 90, '1d',
MAP{'seasonal_periods': '[7, 365]'}
);

Best for: Very complex seasonality, decomposition-based forecasting.


AutoMSTL​

Automatic MSTL with period detection.

Parameters​

ParameterTypeDefaultDescription
seasonal_periodsINTEGER[]autoMultiple seasonal periods

Example​

SELECT * FROM ts_forecast_by(
'hourly_data', NULL, timestamp, value,
'AutoMSTL', 168, '1h',
MAP{}
);

Best for: Complex seasonality with automatic period detection.


MFLES​

Median-based Feature-Logic Expert System. Robust to outliers and noise.

Parameters​

ParameterTypeDefaultDescription
seasonal_periodINTEGERautoPrimary seasonal period

Example​

SELECT * FROM ts_forecast_by(
'noisy_retail', NULL, date, sales,
'MFLES', 28, '1d',
MAP{'seasonal_period': '7'}
);

Best for: Noisy data, outliers, real-world messy time series.


AutoMFLES​

Automatic MFLES configuration.

Parameters​

ParameterTypeDefaultDescription
seasonal_periodINTEGERautoSeasonal period

Example​

SELECT * FROM ts_forecast_by(
'noisy_data', NULL, date, value,
'AutoMFLES', 28, '1d',
MAP{}
);

Best for: Noisy data with automatic robust forecasting.


Comparison​

ModelOutlier RobustSpeedSeasonality Handling
TBATSNoSlowTrigonometric
AutoTBATSNoSlowAuto trigonometric
MSTLModerateSlowLoess decomposition
AutoMSTLModerateSlowAuto decomposition
MFLESYesMediumMedian-based
AutoMFLESYesMediumAuto median-based

When to Use Multi-Seasonal Models​

Data PatternRecommended Model
Hourly + daily + weeklyAutoTBATS or AutoMSTL
Daily + weekly + yearlyAutoMSTL
Noisy with multiple patternsAutoMFLES
High-frequency (sub-hourly)AutoTBATS
Need decomposition outputMSTL

Common Seasonal Periods​

FrequencyCommon Periods
Hourly24 (daily), 168 (weekly), 8760 (yearly)
Daily7 (weekly), 30/31 (monthly), 365 (yearly)
Weekly52 (yearly)
Monthly12 (yearly)

MFLESX​

MFLES with exogenous (external) variables. Combines MFLES's robustness to outliers with external predictor support.

Parameters​

ParameterTypeDefaultDescription
seasonal_periodINTEGERautoPrimary seasonal period

Example​

-- Create future exogenous values
CREATE TABLE future_exog AS
SELECT * FROM (VALUES
('2024-01-08'::DATE, 22.0, 1),
('2024-01-09'::DATE, 20.0, 0),
('2024-01-10'::DATE, 21.0, 1)
) AS t(date, temperature, promotion);

-- Forecast noisy retail data with exogenous variables
SELECT * FROM ts_forecast_exog_by(
'noisy_retail', NULL, date, sales,
['temperature', 'promotion'],
'future_exog', date, ['temperature', 'promotion'],
'MFLESX', 3,
MAP{}, '1d'
);

Best for: Noisy data with external drivers, real-world messy time series with predictors.

For multi-seasonal data, the choice between TBATS, MSTL, and MFLES depends on data characteristics. TBATS uses trigonometric representations that handle high-frequency periods (e.g., 8,760 for yearly cycles in hourly data) efficiently. MSTL decomposes the series into separate seasonal components via Loess and is effective when you need the decomposition output itself. MFLES uses median-based estimation that resists outlier contamination -- making it the best default for real-world operational data where anomalous observations are common.

See Exogenous Variables for detailed usage


Frequently Asked Questions​

How do I determine which seasonal periods to use?

Run ts_detect_periods_by with method='multi' to detect multiple seasonal periods automatically. Common combinations are daily+weekly for hourly data ([24, 168]), weekly+yearly for daily data ([7, 365]), and quarterly+yearly for monthly data ([3, 12]). See the Common Seasonal Periods table for reference values by data frequency.

TBATS is slow on my data. What are faster alternatives?

TBATS can be slow because it searches over multiple model configurations including Box-Cox transformations and ARMA error orders. Try AutoMFLES as a faster alternative that is also more robust to outliers. If you need decomposition output, AutoMSTL is another option. Both run significantly faster than TBATS while handling multiple seasonal periods.

What makes MFLES "robust to outliers"?

MFLES uses median-based estimation instead of mean-based estimation. Medians are inherently resistant to extreme values because a single outlier cannot drag the estimate as far as it would with a mean. This makes MFLES particularly well-suited for real-world operational data where anomalous spikes and drops are common.

Can I use exogenous variables with multi-seasonal models?

Yes, via MFLESX. This variant combines MFLES's outlier robustness and multi-seasonal handling with external predictor support. Use ts_forecast_exog_by and pass your external variable columns. You must provide future values for all exogenous variables covering the full forecast horizon. See the MFLESX section above for a complete example.


🍪 Cookie Settings