Problem.
Eine belastbare kurzfristige Punktprognose aus einer verrauschten, nicht-stationären Finanzzeitreihe zu bauen, ist ein Lehrbuchproblem mit viel Folklore drumherum. Die meisten öffentlichen Beispiele überspringen die Stationaritätstests, überspringen die Residuen-Diagnostik und berichten zu einem einzigen Modell. Dieses Projekt baut die end-to-end-Pipeline ordentlich: laden, validieren, diagnostizieren, transformieren, Kandidaten fitten, evaluieren, berichten.
Das eingecheckte Arbeitsbeispiel nutzt 5.124 Tagesbeobachtungen von NYSE-Ticker A von Dezember 1999 bis Mai 2023, mit Schlusskursen zwischen 7,76 USD und 113,70 USD.
Mein Beitrag.
Eigenständig, end-to-end:
- Schema-Validierung beim Daten-Load. Erwartete Spalten, Typen und chronologische Reihenfolge an der Grenze erzwungen.
- EDA: Verteilungs-Summary, Quantile, Series-Plot über die volle Stichprobe und STL-Decomposition-Strengths.
- Transformationen: optionaler Log, Differencing ganzzahliger Ordnung, alles konfigurierbar.
- Stationaritätstests. ADF und KPSS in eine einzige Entscheidungsregel überführt, statt jeden isoliert zu fahren und sich widersprechende Verdikte zu erhalten.
- Modell-Kandidaten registriert über ein
MODEL_REGISTRY-Pattern. ARIMA, saisonales ARIMA perauto.arima, ETS, naive Baseline. Neue Kandidaten lassen sich registrieren, indem man eine einzige Funktion hinzufügt, statt die Pipeline anzufassen. - Residuen-Diagnostik. Ljung-Box auf Autokorrelation, Shapiro-Wilk auf Normalität, Mittelwert- und Varianz-Checks im Summary.
- Forecast-Evaluation gegen die naive Baseline als Untergrenze. RMSE, MAE, MAPE.
- testthat-Suite mit synthetischer Series-Fixture, R-CMD-check-CI-Matrix über mehrere R-Versionen, lintr-Config gated CI.
Warum dieses Setup wichtig ist.
Finanzzeitreihen scheitern still. Ein Modell mit gutem RMSE auf den Trainingsdaten kann auf der Residuen-Ebene leise kaputt sein (Autokorrelation in den Residuen heißt, das Modell hat die Struktur nicht erfasst), und man merkt es erst, wenn die Live-Daten anfangen, sich schlecht zu benehmen. Der Ljung-Box- plus Shapiro-Wilk-Check auf der Residuen-Stufe ist die Diagnostik, die das abfängt, bevor man die Prognose ausliefert.
Das MODEL_REGISTRY-Pattern ist die architektonische Entscheidung, die die Pipeline tatsächlich wiederverwendbar macht. Einen neuen Kandidaten hinzufügen (Prophet, TBATS, neuronaler State Space) ist ein einziger Registrierungsaufruf. Der Evaluation-, Diagnostik- und Reporting-Code ändert sich nicht.
Architektur.
data-raw/A.csv
|
v
load_share_prices -> validate -> to_ts (daily freq, chronological)
|
v
eda + STL decomposition
|
v
transform (log, difference) if needed
|
v
stationarity (ADF + KPSS combined verdict)
|
v
MODEL_REGISTRY = {arima, sarima, ets, naive}
|
v
fit each on train, forecast horizon
|
v
diagnostics (Ljung-Box, Shapiro-Wilk)
|
v
evaluate vs naive baseline (RMSE, MAE, MAPE)
Stack.
R · forecast · tseries · ggplot2 · lubridate · testthat · lintr · GitHub Actions (R-CMD-check-CI-Matrix über mehrere R-Versionen)