25 — Practice & Tooling

Forecast Ensembles#

PracticeStatistical 1 min read
◆ The PatternCombining models for better accuracy

No single model wins everywhere. Ensemble forecasting combines diverse models — ARIMA, ETS, neural nets — for more robust predictions. The simplest approach (equal-weight average) is surprisingly hard to beat. More sophisticated methods include inverse-error weighting and stacking with a meta-learner.

// Interactive — ensemble vs individual forecasts
MethodApproachWhen
Simple AverageMean of all forecastsDefault baseline — often the best
Weighted AverageWeight by inverse validation errorWhen model quality varies
StackingTrain meta-model on forecastsWhen interaction effects exist
MedianMedian of all forecastsWhen outlier models are present
Pattern bridge: Forecast ensembling is the time-series version of ensemble methods from statistics. In markets, portfolio diversification applies exactly the same principle — combining uncorrelated assets (models) reduces risk (error).
Worked example

Two unbiased forecasts with equal error variance and an error correlation of 0.3. Each alone has a mean squared error of 1.00; their simple average has 0.65 — matching the theoretical (1 + ρ)/2. The less the forecasters’ errors are correlated, the more averaging helps, even when neither is better than the other.

Where it misleads
  • Estimated optimal weights usually do worse than a simple average out of sample — the “forecast combination puzzle” (Smith & Wallis 2009).
  • Averaging biased forecasts averages the biases; it does not remove them.
  • Highly correlated models add cost and little else; diversity is what an ensemble buys.
In code
rng = np.random.default_rng(15)
rho = 0.3
cov = [[1, rho], [rho, 1]]
e = rng.multivariate_normal([0, 0], cov, 100_000)     # errors of two unbiased forecasts
mse_single = (e[:, 0] ** 2).mean()
mse_avg = (e.mean(axis=1) ** 2).mean()
theory = (1 + rho) / 2
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet simulates or makes up its own series, as the comments say.

The same idea with a library
# Python — forecast ensemble
import numpy as np

# Simple average ensemble
forecasts = [arima_pred, ets_pred, lstm_pred]
ensemble = np.mean(forecasts, axis=0)

# Inverse-error weighted
errors = [mae_arima, mae_ets, mae_lstm]
weights = [1/e for e in errors]
w_sum = sum(weights)
ensemble_w = sum(f*w/w_sum for f,w in zip(forecasts, weights))
Sources
  • J. M. Bates & C. W. J. Granger, “The Combination of Forecasts”, Operational Research Quarterly 20(4), 1969
  • R. T. Clemen, “Combining Forecasts: A Review and Annotated Bibliography”, International Journal of Forecasting 5(4), 1989
  • J. Smith & K. F. Wallis, “A Simple Explanation of the Forecast Combination Puzzle”, Oxford Bulletin of Economics and Statistics 71(3), 2009

Last reviewed October 2026 · How this site checks its content · Report a mistake

Linked from 2
← Previous
Anomaly Detection
Open in the full reader, with the topic sidebar