# Forecasting Methods

> Forecasting theory and computation for the MGT4897 DXB report — moving averages, weighted moving averages, single and trend-adjusted exponential smoothing, least-squares trend, and associative regression; the CFE, MAD, MSE, MAPE and tracking-signal metrics the brief names; how to choose and defend a model; and how to handle the 2020–2022 COVID structural break. Use for task 3 and for any number that feeds the capacity gap analysis.

- Skill: `faaz17/forecasting-methods` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add faaz17/forecasting-methods`
- Raw SKILL.md: https://api.skillmd.com/api/skills/faaz17/forecasting-methods/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: Faaz17 (https://skillmd.com/u/faaz17)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/faaz17/forecasting-methods

---


# Forecasting — methods, metrics, and model choice

Task 3 carries **35 of 100 marks**. This skill covers the arithmetic and, more importantly,
the judgement the marks actually reward.

## Run the engine, do not hand-calculate

    py .claude/skills/forecasting-methods/scripts/forecast.py --markdown

Every method, every error metric, the 2026 forecast, the long-run projection and the
associative regression come out of one command. Useful variants:

| Command | Purpose |
|---|---|
| `--series passengers` | One series only |
| `--from 2013 --to 2019` | Pre-COVID fitting basis |
| `--from 2022` | Post-COVID fitting basis |
| `--long-to 2036` | Projection horizon (default 2036) |
| `--associative` | Only the passengers-on-movements regression |
| `--at 500000,550000,600000` | Movement levels for the associative forecast |
| `--alpha 0.1,0.2,0.3,0.5` | Smoothing constants to compare |
| `--plain` | Console-friendly output instead of markdown tables |

Numbers typed by hand into prose drift from the workbook and get caught. Generate, then
quote.

## The methods

### Naive
F(t+1) = A(t). Zero parameters. Its only role is as a **benchmark** — a sophisticated model
that cannot beat naive is not earning its complexity. Reporting that comparison is a mark of
a careful analyst.

### Simple moving average
F(t+1) = mean of the last *n* actuals. Smooths noise; **lags a trend**, and the lag grows
with *n*. On a rising series it under-forecasts systematically, which shows up as a positive
CFE and a rising tracking signal.

### Weighted moving average
Same, with declining weights on older periods — e.g. 0.5 / 0.3 / 0.2 with the largest weight
on the most recent year. Weights must sum to 1 (the script normalises). Responds faster than
a simple MA, still lags a trend. **Justify the weights**; arbitrary weights invite the
question "why those?".

### Single exponential smoothing
F(t+1) = F(t) + α(A(t) − F(t)), with 0 < α < 1.

α is the responsiveness dial: high α tracks recent movement and reacts to noise; low α is
stable and slow. Compare at least two or three values. **Single exponential smoothing has no
trend term** — on a series with a persistent trend it lags permanently, which is exactly what
the DXB data shows.

### Trend-adjusted (Holt's) exponential smoothing
Smooths level and trend separately:

    L(t) = α·A(t) + (1−α)·(L(t−1) + T(t−1))
    T(t) = β·(L(t) − L(t−1)) + (1−β)·T(t−1)
    F(t+1) = L(t) + T(t)

Appropriate where a trend is present and the analyst wants recent trend weighted more
heavily than a straight line does. On the short post-COVID window it extrapolates recovery
momentum aggressively — note that rather than quoting it flat.

### Least-squares linear trend
y = a + b·x fitted on the year index. Uses the whole window, gives an interpretable slope
("about b additional passengers per year"), and reports **r²** — the share of variation
explained. It is also the only method here that is straightforwardly extendable to 2036.

### Associative (causal) regression — task 3(c)
Passengers regressed on flight movements, not on time:

    passengers = a + b · movements

This is a **different kind of model** from everything above, and the report must say so.
Time-series methods project the past forward; an associative model predicts one variable
from another. The brief asks for expected passenger traffic at 500,000, 550,000 and 600,000
movements — that is this model, not the trend line.

The slope has a physical meaning: **passengers per aircraft movement**, a function of average
aircraft size and load factor. Interpreting it that way, and asking whether it can hold at
higher movement volumes, is the analysis the marks are for.

## The error metrics — what each one actually detects

Let e(t) = A(t) − F(t), over the *n* periods where a forecast exists.

| Metric | Formula | Detects | Watch for |
|---|---|---|---|
| **CFE** | Σ e(t) | Cumulative bias | Large positive = persistent under-forecasting. On a capacity decision, that is the dangerous direction |
| **MAD** | Σ\|e(t)\| / n | Average error size, in original units | Same units as the data, so it is the one to quote to a COO |
| **MSE** | Σ e(t)² / n | Average squared error | Penalises large misses heavily — the right lens when one bad year is costlier than several small ones |
| **MAPE** | (Σ \|e(t)/A(t)\| / n) × 100 | Average error as a percentage | Unit-free, so it compares across the two series. Distorted by small denominators — the 2020 collapse inflates it |
| **TS** | CFE / MAD | Bias relative to typical error | **Outside ±4 = the model is out of control.** MAPE will not tell you this |

**Compare models on more than one metric.** The classic error is ranking by MAPE alone and
recommending a model with a tracking signal of 3.5 — accurate on average, but wrong in the
same direction nearly every year. Say which metric drove the recommendation and why.

The metrics must be computed over a **common comparison window** where possible. A 3-year
moving average produces fewer forecasts than a naive model, so their metrics are not
computed over identical periods; the script reports *n* for each so the report can
acknowledge it. Acknowledging it is worth more than hiding it.

## The COVID structural break — the analytical crux

DXB fell from 86.4m passengers in 2019 to 25.8m in 2020, and recovered past 2019 by 2023.
This is not noise. It is a **structural break**, and how it is handled separates a
competent report from a distinction.

Fitting a least-squares trend across the whole 2013–2025 series gives **r² ≈ 0.006** — the
line explains essentially none of the variation, and projects 2035 *below* the 2025 actual.
Quoting that number as a forecast would be indefensible. Run it, show it, and explain why it
is rejected. Demonstrating that a model fails is evidence of judgement.

Three defensible bases, each with a different answer:

| Basis | Fitting window | r² | Character |
|---|---|---|---|
| Full series | 2013–2025 | ~0.006 | Break dominates; unusable for projection |
| Pre-COVID | 2013–2019 | ~0.85 | Mature-growth trajectory, ignores the recovery |
| Post-COVID | 2022–2025 | ~0.82 | Steep, but part of that slope is recovery, not growth |

Run all three (`--from` / `--to`), report them, and **argue for one** — or for a blended
view with a stated range. A capacity decision on a 20-year asset should not rest on a
four-observation recovery trend, and saying so is the argument.

Other legitimate treatments worth naming: excluding 2020–2021 as outliers; using a dummy
variable for the break; forecasting from 2023 onward once recovery completed. Each has a
cost. Name it.

## Choosing and defending a model — the marks are here

The brief says *"recommend the most suitable model"*. A recommendation needs four things:

1. **The metric comparison**, laid out honestly
2. **The metric that decided it**, and why that metric fits this decision — MAD for
   operational staffing, MSE where a single large miss is costly, TS where sustained bias
   would compound into an infrastructure error
3. **The behaviour of the series** — trend present? break present? seasonality? (annual data
   hides seasonality, which is itself worth a sentence, since airport operations are acutely
   seasonal and the annual series conceals it)
4. **The decision the forecast serves** — a 2026 staffing plan and a 2036 capacity decision
   do not need the same model, and saying so explicitly is exactly the kind of judgement
   task 2 asks for

It is entirely defensible to recommend **different models for different horizons**: a
responsive short-term method for 2026, a trend model on a stated basis for 2036. That reads
as an analyst thinking, not a student ticking a box.

## Sanity checks before any number reaches the report

- Does the 2026 forecast sit in a plausible band against 95.2m in 2025?
- Does the 2035/2036 figure imply a growth rate you would defend out loud?
- Is the associative forecast an **extrapolation** beyond the observed movement range
  (max 454,800 in 2025)? Say so — all three of the brief's levels are.
- Does passengers ÷ movements stay plausible at the forecast levels (roughly 209 in 2025)?
- Do the two series stay consistent with each other?
- Are the units right — passengers in millions vs absolute; movements in thousands?

## Reporting conventions

- Round in prose, keep full precision in the workbook: "approximately 112.3 million",
  not "112,292,354"
- State the fitting window every time a forecast is quoted
- Give the regression equation, r and r² whenever a regression is used
- Number every table and figure and refer to each in the text
- Put full method-by-method workings in the **appendices**; the main text carries the
  comparison summary and the interpretation

## Citing the theory

Forecasting method claims should carry a textbook or journal citation. Standard operations
management texts covering exactly this material:

- Heizer, Render and Munson — *Operations Management*
- Slack, Brandon-Jones and Burgess — *Operations Management*
- Krajewski, Malhotra and Ritzman — *Operations Management: Processes and Supply Chains*
- Stevenson — *Operations Management*

For the **five journal articles** the brief requires, air transport demand forecasting is a
well-served literature — see `aviation-data-sources` for the journals to search. Verify
every reference; never invent a DOI.

