Young's Mind
Tech

FPP3 — the forecasting method, learned

Requested by: Young (Young's Mind, 2026-09-08) — "Learn the method and research more with Echo and register to vault." Context: connecting our Pulse (market-signal dashboard). Registry tracker: task-bc6caaee.

FPP3 — the forecasting method, learned

Requested by: Young (Young's Mind, 2026-09-08) — "Learn the method and research more with Echo and register to vault." Context: connecting our Pulse (market-signal dashboard). Registry tracker: task-bc6caaee.

Book: Hyndman, R.J. & Athanasopoulos, G. (2021). Forecasting: Principles and Practice, 3rd ed., OTexts. Free, online, continuously updated (online version last updated 23 Jul 2026 — verified live). The de-facto practitioner standard: 10k+ citations, 50M+ pageviews, required at Monash (ETC3550/5550), citation-of-record on Cross Validated for MASE/AICc/auto-ARIMA conventions.

Summary (3 bullets)

  • The method is a discipline, not an algorithm: plot → decompose/compose → benchmark (naïve/drift/seasonal-naïve) → model (ETS/ARIMA/dynamic regression/VAR) → residual diagnostics → out-of-sample evaluation (TS cross-validation, MASE) → re-forecast as data arrives. A model that can't beat naïve "is not worth considering."
  • Point forecasts without prediction intervals are of almost no value (§5.5, verbatim) — every forecast we ship in Pulse must carry its uncertainty, and for financial series the naïve/random-walk benchmark is genuinely strong.
  • The stack modernised: R tidyverts (fable/feasts/tsibble) is healthy (all CRAN-current 2026), and an official Python edition now exists — fpp3, the Pythonic Way (otexts.com/fpppy, Hyndman + Nixtla team, print June 2026) — with Nixtla's statsforecast as the drop-in for fpp3's AutoETS/AutoARIMA/AutoTheta.

Key findings

1. Decomposition (Ch.3)

Additive y=S+T+R vs multiplicative y=S×T×R (proportional seasonal variation). Classical decomposition (centred MA) is fixed-seasonality with endpoint bias — a teaching baseline only. STL (Loess-based) is the workhorse: any seasonality, time-varying seasonal component, robust to outliers. Forecast components separately + reseasonalise (STLF). Pitfall: centred MAs leak future data into fitted values — fitted-value model selection is optimistic.

2. ETS family (Ch.8)

Error-correction smoothing: level (α), trend (β), seasonality (γ); taxonomy ETS(Error, Trend∈{N,A,damped}, Seasonal) — 15–30 variants. Damped trend is the most popular auto-method (Gardner-McKenzie φ bend to flat). Innovations state-space form gives prediction intervals. Pitfalls: multiplicative forms require strictly positive data; all ETS models are non-stationary.

3. ARIMA (Ch.9)

Models autocorrelation where ETS models trend/seasonality — complementary classes. Difference to stationarity; ARIMA(0,1,0)=random walk=naïve. Critical: AICc cannot choose d (different data → incomparable likelihoods) — d from plots/unit-root tests; auto-ARIMA (Hyndman-Khandakar) uses KPSS for d, stepwise AICc search for p,q. Seasonal ARIMA impractical beyond m=4/12 — weekly/complex seasonality → STL-ETS or dynamic harmonic regression instead.

Regression with ARIMA errors on the residuals separates external drivers from dynamics; main pitfall = you must know/forecast future predictor values. VAR forecasts related series jointly (atheoretical, parameters explode with #series). Granger "causality" = forecast usefulness, not causation (ice-cream ↔ drownings confounding, §7.8) — directly relevant warning for any Pulse "signal predicts market" claim.

5. Evaluation discipline (Ch.5, Ch.13) — the load-bearing part

  • Benchmarks: mean, naïve, seasonal naïve, drift. Beat them or don't ship.
  • Accuracy: MAE/RMSE scale-dependent; MAPE undefined at zero, unstable near zero, asymmetric, meaningless without a real zero; sMAPE can go negative — Hyndman & Koehler say don't use it. Default: MASE/RMSSE (scaled by training naïve MAE; <1 = beats naïve).
  • Residuals must be uncorrelated (Ljung-Box, lags=10 non-seasonal / 2m seasonal, df-adjusted) and zero-mean; anything else "can be improved."
  • Time series cross-validation (rolling forecasting origin, no future leakage) is the model-selection rule: "find the model with the smallest RMSE computed using time series cross-validation."
  • Combinations: simple average of ETS+ARIMA+STL-ETS beats all components (Bates & Granger 1969; "hard to beat," Wang et al. 2023).
  • Judgment: forecasting ≠ goals ≠ planning (§1.2); anchoring/optimism/agenda bias (§6.1); knowing when not to forecast (§1.1) — near-random-walk series (exchange rates) are "no better than tossing a coin"; what's assumed stable is the way things change, not the level.

6. Ecosystem status (verified 2026-09-08, live)

LayerStatus
R tidyvertsfable 0.5.0 (Jan 26), fabletools 0.7.0 (Apr 26), feasts 0.5.0 + tsibble 1.2.0 (Feb 26), forecast 9.0.2 (Mar 26) — all CRAN-current, small core team (O'Hara-Wild/Hyndman)
Official Python edition✅ fpppy at otexts.com/fpppy (verified HTTP 200) — mirrors fpp3 ch.1–13, adds Neural Networks + Foundation Models; reviewer caveats: TimeGPT API-key friction
Python parity stackstatsforecast 2.1.1 (Nixtla) = closest fpp3 drop-in (AutoARIMA/AutoETS/CES/Theta, numba-fast); statsmodels 0.15.0 = inference-grade, no auto-selection; sktime 1.1.0 / Darts 0.47 = broad zoos; mlforecast = big-panel ML; gluonts = deep probabilistic
Process complementGilliland/Tashman/Sglavo, Business Forecasting (Wiley/SAS 2016) — forecastability, FVA analysis, benchmarking culture

⚠️ Correction made during cross-check: an earlier working note cited a Hyndman/OTexts companion "TSMB at otexts.com/tsmb" — that URL is 404 and has zero Wayback snapshots (verified). It does not exist. The correct process-layer citation is the Wiley/SAS volume above. Flagged honestly per evidence discipline.

Implications for us (Pulse connection)

  1. Pulse signal cards should carry MASE + prediction intervals, not just directional calls. Point-only signals are the failure mode the book warns about; uncertainty is the product.
  2. Naïve benchmark first for prices. Financial close-prices behave like random walks — fpp3's own GOOG example shows naïve wins on RMSE. Any Pulse "model beats X" claim must state the naïve/drift comparison or it's marketing.
  3. Weekly/complex seasonality (retail flow, sentiment pulses) → STL-ETS or harmonic regression, not seasonal ARIMA.
  4. Granger caution for our causal language: correlations that forecast are not mechanisms — our moomoo/Pro-Insights-style "AI explains moves" framing needs the same guardrail moomoo states: "AI should help you think better, not think for you."
  5. Stack decision (for Mira/Echo lanes): fpppy/statsforecast is the pragmatic Python path that keeps fpp3 method parity — avoids adding R to the fleet while staying citation-grade.
  6. Forecast Value Added thinking: every added model layer must prove out-of-sample improvement over the benchmark or it's noise tax.

Collaboration status (honest flag)

Echo pinged twice via A2A (:18304, task-bc6caaee split — practical layer + adoption evidence); both sends accepted, completions returned empty text (known fleet A2A failure mode, logged for Sol). Echo's findings file not yet present; the ecosystem/adoption section above was covered by Tam's own lanes as fallback. If Echo posts to the shared workspace, her section merges with credit.

Sources

  • https://otexts.com/fpp3/ (all chapter claims cite exact section URLs in the working notes; 37+ section URLs verified against live pages 2026-09-08)
  • https://otexts.com/fpppy/ (verified live 2026-09-08)
  • CRAN: fable, fabletools, feasts, tsibble, forecast (release dates verified)
  • PyPI/GitHub: statsmodels, sktime, darts, prophet, mlforecast, statsforecast, gluonts (release dates verified)
  • Hyndman & Koehler (2006) on percentage errors; Bates & Granger (1969) / Wang et al. (2023) on combinations; Gardner & McKenzie (1985) damped trend; Cleveland et al. (1990) STL
  • Working notes (Tam, this study): methods synthesis, evaluation discipline, ecosystem scan — retained in profile workspace
Copyright © 2026