Financial Models in Practice · Part 16 of 16
Time-Series Forecasting Models: ARIMA and Holt-Winters for Finance Analysts
STATUS: Detailed Outline — Ready to Draft
Word target: 2,000–2,400 words Who this is for: Students with some Python experience (or willingness to learn) who want to move beyond Excel-based forecasting; junior analysts in FP&A, data science for finance, or quant-adjacent roles; MSc Finance / Financial Data Science students. Real-world question this post answers: “We have 36 months of revenue data with a clear trend and seasonal pattern. Instead of drawing a straight line from last year’s actuals, how do we build a statistically grounded forecast that captures trend, seasonality, and uncertainty?” Prerequisites: Helpful but not required: basic statistics (mean, variance, autocorrelation). All examples use pseudocode and Excel.
Learning Objectives
- Decompose a time series into trend, seasonality, and residual components
- Understand the intuition behind moving averages and exponential smoothing
- Build a Holt-Winters model for a seasonal time series (Excel or any tool)
- Understand what ARIMA is and when to use it
- Evaluate forecast accuracy using MAE, RMSE, and MAPE
- Visualise the forecast with confidence intervals
Post Outline
Introduction (~200 words)
- Hook: most financial forecasts are built by taking last year’s numbers and adding a growth percentage. This works when trends are stable and business conditions are predictable. But what about a retail business with clear Christmas seasonality? A SaaS business whose monthly revenue has a trend plus monthly noise? A manufacturing business whose costs are correlated with commodity price cycles?
- Statistical time-series models are purpose-built for these situations. They read the historical pattern, decompose it into structural components, and project forward with explicit uncertainty bounds.
- This post uses ForecastCo — a UK-based subscription e-commerce business — with 36 months of monthly revenue data.
Section 1: What Is a Time Series? (~200 words)
- Definition: a sequence of observations ordered in time, typically at equal intervals
- The four components of a time series:
- Trend (T): the long-run direction (upward, downward, or flat)
- Seasonality (S): a regular, repeating pattern tied to the calendar (monthly, quarterly, annual)
- Cyclicality (C): longer irregular patterns not tied to the calendar (economic cycles)
- Residual / Noise (R): random variation unexplained by the above
- Additive vs multiplicative decomposition:
- Additive: Y = T + S + R (use when seasonal amplitude is roughly constant)
- Multiplicative: Y = T × S × R (use when seasonal amplitude grows with the level)
Section 2: Decomposing the Time Series (~250 words)
Decomposition algorithm — multiplicative model:
LOAD monthly revenue data (date column as index)
DECOMPOSE revenue series:
model = multiplicative (use when seasonal swings grow with the level)
period = 12 (monthly data → annual seasonal cycle)
EXTRACT components:
trend ← smoothed line showing long-run direction
seasonal ← repeating monthly multiplier (e.g. Dec ≈ 1.6×, Jan ≈ 0.7×)
residual ← remaining unexplained noise
PLOT four panels stacked vertically:
Row 1: Observed Row 2: Trend
Row 3: Seasonal Row 4: Residual
Y-axis label on each: "Revenue (£000)"
Interpreting the decomposition:
- Trend: ForecastCo is growing at ~12% annually
- Seasonal: December spike ~1.6× the average; January trough ~0.7× (post-Christmas decline)
- Residual: mostly noise, no obvious structural pattern → good
Section 3: Holt-Winters (Exponential Smoothing) (~400 words)
Why Holt-Winters before ARIMA:
- Intuitive to explain to non-technical stakeholders
- Works very well for trended + seasonal data
- No need to understand ARIMA parameter selection
The three smoothing parameters:
- α (alpha): controls how quickly the model responds to changes in level (0 = slow; 1 = fast)
- β (beta): controls the responsiveness of the trend component
- γ (gamma): controls the responsiveness of the seasonal component
Holt-Winters algorithm — step by step:
SPLIT data:
train ← first 30 months
test ← last 6 months (holdout for honest evaluation)
FIT Holt-Winters model on train:
trend = additive
seasonal = multiplicative (amplitude grows with the level)
periods = 12
FORECAST 12 months ahead
EVALUATE model on holdout:
MAE = average( |forecast − actual| )
MAPE = average( |forecast − actual| / actual ) × 100
RMSE = sqrt( average( (forecast − actual)² ) )
PLOT:
─── Historical (solid)
- - Actual holdout (dashed)
─── Forecast (red)
░░░ Approx. 80% confidence band (±10% of forecast)
Evaluating the model on the holdout:
- MAE (Mean Absolute Error): average absolute error in £
- MAPE (Mean Absolute Percentage Error): % error — easier to communicate to non-technical stakeholders
- RMSE: penalises large errors more heavily than MAE
Section 4: ARIMA — When and Why (~400 words)
ARIMA stands for AutoRegressive Integrated Moving Average. It is a flexible family of models for stationary time series.
Three parameters: p (AR order), d (differencing), q (MA order)
- AR(p): current value depends on the previous p values
- I(d): differencing the series d times to achieve stationarity
- MA(q): current value depends on the previous q forecast errors
When to use ARIMA over Holt-Winters:
- Series without clear regular seasonality
- Series where autocorrelation structure is complex
- When you want statistically rigorous confidence intervals
Step-by-step ARIMA:
- Check stationarity: ADF test (
from statsmodels.tsa.stattools import adfuller) - If non-stationary: apply differencing (d = 1 usually sufficient for financial series)
- Inspect ACF and PACF plots to choose p and q
- Fit the model:
from statsmodels.tsa.arima.model import ARIMA - Auto-select ARIMA parameters using an information criterion:
AUTO-SELECT ARIMA parameters:
seasonal = true
m = 12 (monthly data)
criterion = AIC (penalises unnecessary complexity)
method = stepwise search
OUTPUT:
Selected order: (p, d, q)(P, D, Q)[12]
model summary with AIC score
12-period forecast with confidence intervals
Section 5: Choosing Between Models and Presenting Results (~200 words)
Model selection guide:
| Situation | Recommended model |
|---|---|
| Clear trend + regular seasonality | Holt-Winters |
| No clear seasonality, autocorrelated | ARIMA |
| Seasonal + complex autocorrelation | SARIMA or Facebook Prophet |
| Uncertainty quantification important | Any model + Monte Carlo (see Monte Carlo DCF post) |
Presenting forecasts to non-technical stakeholders:
- Always show the historical data alongside the forecast (context is everything)
- Always show a confidence interval — a single-line forecast implies false precision
- Accompany with a plain-English narrative: “The model expects revenue to grow from £X to £Y over the next 12 months, with the main uncertainty driven by the seasonal amplitude in Q4”
Key Takeaways
- Decompose the series first: understanding trend and seasonality before modelling is not optional
- Holt-Winters is the go-to for trended + seasonal financial series — intuitive and robust
- ARIMA is more flexible and statistically rigorous but requires more careful parameter selection
- Always evaluate on a holdout sample; never judge a forecast model on its fit to training data
- Communicate uncertainty explicitly — a point forecast without a confidence interval is not a forecast
Practice Suggestion
Download the ForecastCo dataset (36 months of monthly revenue). Fit both a Holt-Winters and an ARIMA model using the first 30 months as training data. Evaluate both on the last 6 months (holdout). Which model has the lower MAPE? Plot both forecasts alongside the actual holdout data.
CTAs
- Inline: Download the ForecastCo dataset and worked Excel template
- End: Book a session if you are building statistical forecasting into an FP&A or analytics role
SEO & Internal Linking Notes
- Internal links: ← Monte Carlo DCF; → P&L Planning; → Budget Model
- Diagram: Time series decomposition chart (4 panels) + Holt-Winters forecast with confidence interval
- Table: Model selection guide + forecast accuracy metrics comparison
Topics
Related posts
A step-by-step guide to building a structured P&L planning model — from revenue drivers through to EBITDA and net profit — used by FP&A teams to set financial targets and communicate the plan to leadership.
FP&A & Budgeting Budget Model: How Finance Teams Build and Manage the Annual BudgetA practical guide to building an annual budget model from scratch — covering the budgeting process, zero-based vs incremental approaches, and how to build a flexible model that survives contact with actuals.
Python & Quant Models Monte Carlo DCF: Adding Probability and Uncertainty to Your ValuationLevel up your DCF model by running a Monte Carlo simulation — replacing single-point assumptions with probability distributions to produce a realistic range of outcomes and their likelihood.