WP46 paper: literature, taxonomy, data, design sections
22 changed files +852 −5
added
model_cards/cgarch11.md
+43 −0
@@ -0,0 +1,43 @@ | ||
| 1 | +# Model card — `cgarch11` (Component GARCH, Engle–Lee) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `cgarch11` · **family:** component · **tier:** A · **status:** implemented · **impl:** custom (`src/wp46/models/custom.py::CGARCH11`) | |
| 5 | +- **Label:** Component GARCH (Engle-Lee) · **distributions:** normal, t, ged, skewt | |
| 6 | +- **Seminal citation:** `engle1999long` ("A long-run and short-run component model of stock return volatility", Engle & Lee 1999) | |
| 7 | +- **Other references:** `engle2008spline` (deterministic low-frequency component, out of scope), `engle2013stock` (GARCH-MIDAS, unsupported), `ding1996modeling`; literature-matrix caveat #5 (two equivalent parameterisations: Engle–Lee vs rugarch `csGARCH`; forecasts coincide, constraints written differently). | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +$$r_t = \mu + \varepsilon_t,\ \varepsilon_t = \sigma_t z_t,$$ | |
| 11 | +$$q_t = \omega + \rho\,q_{t-1} + \phi\,(\varepsilon_{t-1}^2 - \sigma_{t-1}^2),\qquad \sigma_t^2 = q_t + \alpha\,(\varepsilon_{t-1}^2 - q_{t-1}) + \beta\,(\sigma_{t-1}^2 - q_{t-1}) ,$$ | |
| 12 | +`rec_cgarch` with $q_0 = \sigma_0^2 = s_0$ (backcast) and floors $q_t, \sigma_t^2 \ge 10^{-12}$. Permanent component $q_t$ (unconditional level $\omega/(1-\rho)$), transitory component $\sigma_t^2 - q_t$ with persistence $\alpha + \beta$. Innovations: normal, t, GED, Hansen skew-t. | |
| 13 | + | |
| 14 | +## 3. Parameter space and admissibility | |
| 15 | +- Parameters: `mu, omega, rho, phi, alpha, beta` (+ distribution). | |
| 16 | +- Reparameterisation: $\omega = e^{\theta_0}$, $\rho = \sigma(\theta_1)$, $\alpha + \beta = \rho\,\sigma(\theta_2)$ (so $\alpha+\beta < \rho$), $\alpha = (\alpha+\beta)\,\sigma(\theta_3)$, $\phi = \min(\alpha, \beta)\,\sigma(\theta_4)$ (so $0 < \phi < \min(\alpha,\beta)$). | |
| 17 | +- Admissibility flag: $\omega > 0$, $0 < \alpha + \beta < \rho < 1$, $0 < \phi < \min(\alpha, \beta)$ — Engle & Lee's sufficient conditions for positivity and stationarity as stated in the class docstring (the code enforces $\phi < \min(\alpha,\beta)$, i.e. both $\beta > \phi$ and $\alpha > \phi$). | |
| 18 | + | |
| 19 | +## 4. Nesting and relations | |
| 20 | +Reduces to GARCH(1,1) when the transitory component vanishes; on the GJR-t cross-check fixture the CGARCH optimum has the same log-likelihood as GARCH(1,1) to 1e-4 (−3379.4617 vs −3379.4618), i.e. the component structure is not identified on data without it. Reduced form is a restricted GARCH(2,2). Related to `figarch11` (long memory via two components) and to `garch_midas` (unsupported). | |
| 21 | + | |
| 22 | +## 5. Estimation | |
| 23 | +Custom MLE (`CustomModel.fit`): L-BFGS-B on θ from three starts (ω, ρ, φ, α, β) ∈ {(0.01v, 0.99, 0.02, 0.05, 0.85), (0.005v, 0.995, 0.03, 0.08, 0.80), (0.02v, 0.98, 0.01, 0.04, 0.90)}, Nelder–Mead polish on failure; μ start = sample mean; backcast $s_0$ arch-style (used for both $q_0$ and $\sigma_0^2$). Point estimates only. | |
| 24 | + | |
| 25 | +## 6. Forecasting | |
| 26 | +`CGARCH11.step_forecast` re-runs the recursion with fixed parameters, then | |
| 27 | +$$\hat q_{t+1} = \omega + \rho q_t + \phi(\varepsilon_t^2 - \sigma_t^2),\quad \hat\sigma^2_{t+1|t} = \hat q_{t+1} + \alpha(\varepsilon_t^2 - q_t) + \beta(\sigma_t^2 - q_t),$$ | |
| 28 | +$$\hat q_{t+k} = \omega + \rho\,\hat q_{t+k-1},\qquad (\hat\sigma^2 - \hat q)_{t+k} = (\alpha+\beta)\,(\hat\sigma^2 - \hat q)_{t+k-1},\qquad \hat\sigma^2_{t+k|t} = \max(\hat q_{t+k} + (\hat\sigma^2-\hat q)_{t+k},\ 10^{-12}),$$ | |
| 29 | +exact under $E[\varepsilon_{t+j}^2 - \sigma_{t+j}^2 \mid \mathcal F_t] = 0$. Cumulative = sum over k ≤ h. Method: `analytic`. | |
| 30 | + | |
| 31 | +## 7. Implementation | |
| 32 | +- `src/wp46/models/custom.py::CGARCH11` (numba `rec_cgarch`). | |
| 33 | +- Cross-check (`results/metrics/rugarch_crosscheck.json`, rugarch `csGARCH`, t): −3379.4617 (ours) vs −3379.7619 (rugarch), **difference +0.3002** (ours higher — rugarch converged to a lower optimum on the fixture). | |
| 34 | +- Tests: `tests/replication/test_rugarch.py` (assert ours ≥ rugarch − 1); `tests/unit/test_custom_models.py::test_nesting_and_admissibility[CGARCH11]`, `test_no_lookahead_in_forecasts`. No simulation-recovery test for CGARCH. | |
| 35 | + | |
| 36 | +## 8. Known limitations / failure modes | |
| 37 | +Weak identification of the two components when $\rho \approx \alpha + \beta$ (likelihood ridge; the sigmoid chain keeps $\alpha+\beta < \rho$ but the optimum can sit at $\phi \to 0$, i.e. GARCH(1,1)); ρ very close to 1 makes the permanent component a near-random walk; the 1e-12 floors mask negativity silently; the sufficient constraints exclude admissible parameter sets (literature-matrix caveat #5). | |
| 38 | + | |
| 39 | +## 9. Computational footprint | |
| 40 | +Analytic; 6–8 parameters; two coupled recursions. Not in the pilot; cost order of `nagarch11`. | |
| 41 | + | |
| 42 | +## 10. Literature expectations | |
| 43 | +`engle1999long` report better long-horizon fit for the component model on S&P 500; `hansen2005forecast` do not single it out; H4 (persistence structure) predicts gains, if any, at h = 22 and no gain at h = 1. The matrix groups it with FIGARCH and MS-GARCH as "persistence structure" models. | |
added
model_cards/fiaparch11.md
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +# Model card — `fiaparch11` (FIAPARCH) — UNSUPPORTED, not scored | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `fiaparch11` · **family:** fractional · **tier:** A · **status:** unsupported · **impl:** none · **distributions:** [] (registry note: "no vetted implementation; not scored") | |
| 5 | +- **Seminal citation:** `tse1998conditional` (Tse 1998). Related: `ding1993long` (APARCH), `baillie1996fractionally` (FIGARCH). | |
| 6 | + | |
| 7 | +## 2. Definition (literature) | |
| 8 | +Fractionally integrated APARCH: $\sigma_t^\delta = \omega + \big[1 - (1-\beta L)^{-1}(1-\phi L)(1-L)^d\big]\,(|\varepsilon_t| - \gamma\varepsilon_t)^\delta$, combining the FIGARCH ARCH(∞) truncation with the APARCH power/asymmetry transform. | |
| 9 | + | |
| 10 | +## 3–6. Parameter space, estimation, forecasting | |
| 11 | +Not implemented in WP46. Would require the FIGARCH truncated weights on $(|\varepsilon| - \gamma\varepsilon)^\delta$ and simulation-based multi-step forecasts (δ ≠ 2). | |
| 12 | + | |
| 13 | +## 7. Implementation / why not scored | |
| 14 | +Not in arch 8.0.0 (its `FIGARCH(power=…)` is a symmetric power FIGARCH, not FIAPARCH) nor in rugarch 1.5-6; no authoritative cross-check available → `unsupported` (D-11). Reported as unsupported for every distribution. | |
| 15 | + | |
| 16 | +## 8–9. Limitations / footprint | |
| 17 | +Not applicable. The matrix notes it is "heavy to estimate". | |
| 18 | + | |
| 19 | +## 10. Literature expectations | |
| 20 | +`tse1998conditional` applied it to the yen–dollar rate; no cross-asset benchmark evidence in the literature matrix. | |
added
model_cards/fiegarch11.md
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +# Model card — `fiegarch11` (FIEGARCH) — UNSUPPORTED, not scored | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `fiegarch11` · **family:** fractional · **tier:** A · **status:** unsupported · **impl:** none · **distributions:** [] (registry note: "no vetted implementation in arch 8.0.0 / rugarch 1.5-6; not scored") | |
| 5 | +- **Seminal citation:** `bollerslev1996modeling` (Bollerslev & Mikkelsen 1996). Related: `nelson1991conditional` (EGARCH), `baillie1996fractionally` (FIGARCH). | |
| 6 | + | |
| 7 | +## 2. Definition (literature) | |
| 8 | +Fractionally integrated EGARCH: $\ln\sigma_t^2 = \omega + \phi(L)^{-1}(1-L)^{-d}\,[1+\psi(L)]\,g(z_{t-1})$ with $g(z) = \theta z + \gamma(|z| - E|z|)$, $0 < d < 1$; the log-variance has long memory (stationary for $d < 1/2$). | |
| 9 | + | |
| 10 | +## 3–6. Parameter space, estimation, forecasting | |
| 11 | +Not implemented; no parameter space, estimation or forecast recursion is defined in WP46. Multi-step variance forecasts would require simulation (literature matrix §a.3). | |
| 12 | + | |
| 13 | +## 7. Implementation / why not scored | |
| 14 | +No implementation in arch 8.0.0 or rugarch 1.5-6; a custom implementation without an authoritative cross-check would violate CLAUDE.md rule 6 / D-11 (`docs/methodology_decisions.md`). Recorded in the registry as `unsupported`; every FIEGARCH × distribution pair is reported as "unsupported", not as a failure (rule 5). | |
| 15 | + | |
| 16 | +## 8–9. Limitations / footprint | |
| 17 | +Not applicable (not run). The literature matrix lists it as "custom (phase 3, optional)". | |
| 18 | + | |
| 19 | +## 10. Literature expectations | |
| 20 | +`bollerslev1996modeling` report long memory in equity log-volatility; no large-scale forecasting evidence in the matrix; FIGARCH results (`hansen2005forecast`) suggest limited gains at h = 1. | |
modified
model_cards/figarch11.md
+1 −1
@@ -17,7 +17,7 @@ Lags beyond the available sample use the backcast (`figarch_recursion`: $\sigma_ | ||
| 17 | 17 | - Admissibility flag (`ArchModel.fit`): $0 \le d \le 1$. FIGARCH is strictly but not covariance stationary for d > 0 (infinite unconditional variance), so no $\alpha+\beta<1$-type flag applies. |
| 18 | 18 | |
| 19 | 19 | ## 4. Nesting and relations |
| 20 | −d = 0 gives GARCH(1,1) with $\alpha = \phi - \beta$ (…) and d = 1 the IGARCH-type unit root; `igarch11` and `garch11` are the end points. `rm2006` and HAR are non-estimated / regression analogues of hyperbolic memory. FIEGARCH/FIAPARCH/HYGARCH (unsupported) are its extensions. | |
| 20 | +d = 0 gives GARCH(1,1) with $\alpha = \phi - \beta$ (geometric ARCH(∞) weights $\alpha\beta^{j-1}$), and d = 1 the IGARCH-type unit root; `igarch11` and `garch11` are the end points. `rm2006` and HAR are non-estimated / regression analogues of hyperbolic memory. FIEGARCH/FIAPARCH/HYGARCH (unsupported) are its extensions. | |
| 21 | 21 | |
| 22 | 22 | ## 5. Estimation |
| 23 | 23 | arch `ConstantMean` + `FIGARCH(1,1)` + distribution; SLSQP (`maxiter` 1000) with the bounds/constraints of §3; starting values from arch's grid d ∈ {0.2, 0.5, 0.7} × φ-ratio ∈ {0.2, 0.5, 0.8} × β-ratio ∈ {0.1, 0.5, 0.9}, $\omega = (1-\beta)\,\overline{\varepsilon^2}\,(1 - \sum_i\lambda_i)$, best Gaussian log-likelihood; backcast = exponentially weighted mean of the first 75 squared residuals; ≤ 2 restarts (`ArchModel.fit`). Point estimates only. Each likelihood evaluation convolves 1,000 weights over the 1,000-day window. |
added
model_cards/garch_midas.md
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +# Model card — `garch_midas` (GARCH-MIDAS) — UNSUPPORTED, not scored | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `garch_midas` · **family:** component · **tier:** A · **status:** unsupported · **impl:** none · **distributions:** [] (registry note: "requires a low-frequency explanatory series outside the pre-registered information set; not scored") | |
| 5 | +- **Seminal citation:** `engle2013stock` (Engle, Ghysels & Sohn 2013). Related: `ghysels2006predicting`, `ghysels2007midas` (MIDAS regressions), `engle1999long` (component GARCH, scored as `cgarch11`). | |
| 6 | + | |
| 7 | +## 2. Definition (literature) | |
| 8 | +$r_t = \mu + \sqrt{\tau_t g_t}\,z_t$ with a short-run unit-mean GARCH(1,1) component $g_t = (1-\alpha-\beta) + \alpha\,\varepsilon_{t-1}^2/\tau_{t-1} + \beta g_{t-1}$ and a long-run component $\tau_t = m + \theta\sum_{k=1}^{K}\varphi_k(w)\,X_{t-k}$ driven by a low-frequency variable $X$ (monthly realized variance or macro series) through Beta-lag MIDAS weights. | |
| 9 | + | |
| 10 | +## 3–6. Parameter space, estimation, forecasting | |
| 11 | +Not implemented. Note that arch's `MIDASHyperbolic` is a MIDAS-weighted ARCH on daily squared returns, **not** GARCH-MIDAS (literature matrix §a.4). | |
| 12 | + | |
| 13 | +## 7. Implementation / why not scored | |
| 14 | +The long-run component needs an explanatory series outside the pre-registered Tier A/B information sets (daily returns; lagged realized measure); D-11 and the registry note exclude it. A realized-variance MIDAS variant was considered "conditional on data" in the matrix and not adopted. | |
| 15 | + | |
| 16 | +## 8–9. Limitations / footprint | |
| 17 | +Not applicable. | |
| 18 | + | |
| 19 | +## 10. Literature expectations | |
| 20 | +`engle2013stock` report that macro-driven long-run components improve long-horizon volatility forecasts; this is outside WP46's pre-registered design, so no expectation is tested. | |
added
model_cards/garchx_rv11.md
+41 −0
@@ -0,0 +1,41 @@ | ||
| 1 | +# Model card — `garchx_rv11` (GARCH-X(1,1) with the lagged realized measure) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `garchx_rv11` · **family:** realized (Tier B) · **tier:** B · **status:** implemented · **impl:** custom (`src/wp46/models/custom.py::GARCHXRV11`, subclass of `HEAVY11`) | |
| 5 | +- **Label:** GARCH-X(1,1) with lagged realized measure · **distributions:** normal, t | |
| 6 | +- **Seminal citation:** `engle2002new` (GARCH-X with realized regressors, "New frontiers for ARCH models") | |
| 7 | +- **Other references:** `shephard2010realising` (HEAVY; the RM equation reused here), `hansen2012realized`, `bollerslev1986generalized`; rugarch `external.regressors` in the variance equation (literature matrix) — not run. | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +$$r_t = \mu + \varepsilon_t,\ \varepsilon_t = \sigma_t z_t,\qquad \sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \gamma\,RM_{t-1} + \beta\,\sigma_{t-1}^2,$$ | |
| 11 | +with the auxiliary HEAVY-RM equation $\mu_t = \omega_R + \alpha_R RM_{t-1} + \beta_R\mu_{t-1}$ used only to forecast $RM$ beyond t (the auxiliary equation is the code's choice; `engle2002new` does not specify it). `rec_garchx`: $\sigma_0^2 = s_0$ (backcast). Innovations: normal, t(ν). | |
| 12 | + | |
| 13 | +## 3. Parameter space and admissibility | |
| 14 | +- Parameters: `mu, omega, alpha, gamma, beta, omega_r, alpha_r, beta_r` (+ `nu`). | |
| 15 | +- Reparameterisation: $\omega = e^{\theta}$, $\alpha+\beta = \sigma(\theta)$, $\alpha = (\alpha+\beta)\sigma(\theta')$, $\gamma = e^{\theta}$ (positive, unbounded), $\omega_R = e^{\theta}$, $\alpha_R+\beta_R = \sigma(\theta)$, $\alpha_R = (\alpha_R+\beta_R)\sigma(\theta')$. | |
| 16 | +- Admissibility flag: $\omega > 0$, $\alpha, \gamma, \beta \ge 0$, $\alpha + \beta < 1$ (stationarity given a stationary RM), $\omega_R > 0$, $\alpha_R + \beta_R < 1$. | |
| 17 | + | |
| 18 | +## 4. Nesting and relations | |
| 19 | +Nests `garch11` (γ = 0) and HEAVY-r (α = 0: $\sigma_t^2 = \omega + \gamma RM_{t-1} + \beta\sigma_{t-1}^2$); the "matched-information" bridge between Tier A and Tier B in the design. | |
| 20 | + | |
| 21 | +## 5. Estimation | |
| 22 | +As `heavy11`: joint QL = return log-likelihood (normal/t) + multiplicative-error QL of the RM equation, one L-BFGS-B run (maxiter 2000) from three starts (ω, α, γ, β, ω_R, α_R, β_R) ∈ {(0.05 m, 0.03, 0.3, 0.6, 0.05 m, 0.4, 0.55), (0.1 m, 0.05, 0.2, 0.7, 0.1 m, 0.3, 0.6), (0.02 m, 0.1, 0.4, 0.45, 0.02 m, 0.5, 0.48)}, Nelder–Mead polish on failure; backcast $s_0$ arch-style; μ_0 of the RM equation = mean of the first 75 RM. Point estimates only; reported `loglik` is the joint QL. | |
| 23 | + | |
| 24 | +## 6. Forecasting | |
| 25 | +`GARCHXRV11.step_forecast`: $\hat\sigma^2_{t+1|t} = \omega + \alpha\varepsilon_t^2 + \gamma RM_t + \beta\sigma_t^2$, $\hat\mu_{t+1} = \omega_R + \alpha_R RM_t + \beta_R\mu_t$; for $k \ge 2$, | |
| 26 | +$$\hat\sigma^2_{t+k|t} = \omega + (\alpha+\beta)\,\hat\sigma^2_{t+k-1|t} + \gamma\,\hat\mu_{t+k-1},\qquad \hat\mu_{t+k} = \omega_R + (\alpha_R+\beta_R)\,\hat\mu_{t+k-1},$$ | |
| 27 | +exact under $E[\varepsilon^2_{t+j}\mid\mathcal F_t] = \hat\sigma^2_{t+j|t}$ and the RM equation. Cumulative = sum over k ≤ h. Method: `analytic`. | |
| 28 | + | |
| 29 | +## 7. Implementation | |
| 30 | +- `src/wp46/models/custom.py::GARCHXRV11` (numba `rec_garchx`, `rec_heavy_r`). | |
| 31 | +- Cross-check: **none against a library** (not in `results/metrics/rugarch_crosscheck.json`). | |
| 32 | +- Tests: `tests/unit/test_custom_models.py::test_realized_models_fit_on_synthetic_measure` (converged, positive finite 22-step forecasts). No simulation-recovery test, no rugarch test (gap vs CLAUDE.md rule 6, recorded in `_discrepancies.md`). | |
| 33 | + | |
| 34 | +## 8. Known limitations / failure modes | |
| 35 | +α and γ compete for the same information (realized measure vs squared return): α often → 0, γ dominates (then the model is HEAVY-r); γ unbounded above; the sigmoid persistence $\alpha+\beta < 1$ ignores the extra persistence transmitted through the RM equation (the reduced-form persistence is larger); imputed $r^2$ on invalid sessions; the auxiliary RM forecast drives h = 22 results. | |
| 36 | + | |
| 37 | +## 9. Computational footprint | |
| 38 | +Analytic; 8–9 parameters; two recursions per evaluation. Not in the pilot. | |
| 39 | + | |
| 40 | +## 10. Literature expectations | |
| 41 | +`engle2002new` proposes realized regressors in GARCH; `shephard2010realising` show that once $RM_{t-1}$ is included the $\varepsilon^2$ term adds little (HEAVY-r); `hansen2012realized` find similar. Expectation: performance close to HEAVY at h = 1 (H3), with the information-set comparison to `garch11` being the design's main use of this model. | |
added
model_cards/gas_t11.md
+40 −0
@@ -0,0 +1,40 @@ | ||
| 1 | +# Model card — `gas_t11` (GAS-t(1,1) / Beta-t-GARCH, score-driven non-GARCH comparator) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `gas_t11` · **family:** score-driven (non-GARCH) · **tier:** A · **status:** implemented · **impl:** custom (`src/wp46/models/custom.py::GAST11`) | |
| 5 | +- **Label:** GAS-t(1,1) / Beta-t-GARCH (non-GARCH comparator) · **distributions:** t only | |
| 6 | +- **Seminal citation:** `creal2013generalized` | |
| 7 | +- **Other references:** `harvey2013dynamic`, `harvey2008beta` (Beta-t-GARCH / DCS), `harvey2014egarch` (Beta-t-EGARCH, not implemented), `blasques2015information` (information-theoretic optimality of score updates), `ardia2019generalized` (GAS R package, not run). | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +$$r_t = \mu + \varepsilon_t,\ \varepsilon_t = \sqrt{f_t}\,z_t,\ z_t \sim t_\nu\ \text{(unit variance)},\qquad f_t = \omega + \alpha\,s_{t-1} + \beta\,f_{t-1},$$ | |
| 11 | +$$s_t = \frac{\nu+3}{\nu}\left[\frac{(\nu+1)\,f_t\,\varepsilon_t^2}{(\nu-2)\,f_t + \varepsilon_t^2} - f_t\right]$$ | |
| 12 | +— the score of the Student-t log-density with respect to the variance $f_t$ scaled by the **inverse Fisher information** ($\mathcal I_t^{-1} = 2f_t^2(\nu+3)/\nu$), i.e. Creal–Koopman–Lucas GAS(1,1) in the variance parameterisation; the update is bounded in $\varepsilon_t^2$ (outlier-robust). `rec_gas_t`: $f_0 = s_0$ (backcast), floor $f_t \ge 10^{-12}$; if ν > 10⁶ the score degenerates to $\varepsilon_t^2 - f_t$ (GARCH). Innovation law: standardised Student-t only (the model is defined by its density). | |
| 13 | + | |
| 14 | +## 3. Parameter space and admissibility | |
| 15 | +- Parameters: `mu, omega, alpha, beta, nu`. | |
| 16 | +- Reparameterisation: $\omega = e^{\theta_0}$, $\alpha = e^{\theta_1}$ (any positive value), $\beta = \sigma(\theta_2) \in (0,1)$, $\nu = 2.05 + e^{\theta_3}$. | |
| 17 | +- Admissibility flag: $\omega > 0$, $\alpha \ge 0$, $0 \le \beta < 1$ (stationarity of the linear recursion; $E[s_t] = 0$ under correct specification). | |
| 18 | + | |
| 19 | +## 4. Nesting and relations | |
| 20 | +Not a GARCH model (updates by the scaled score). As $\nu \to \infty$, $s_t = \varepsilon_t^2 - f_t$ and $f_t = \omega + \alpha\varepsilon_{t-1}^2 + (\beta - \alpha) f_{t-1}$: GARCH(1,1) with $\alpha_G = \alpha$, $\beta_G = \beta - \alpha$. Equivalent to Harvey's Beta-t-GARCH up to parameterisation (variance level, not log). The Beta-t-EGARCH (log-variance, leverage) is not in the registry. | |
| 21 | + | |
| 22 | +## 5. Estimation | |
| 23 | +Custom MLE (`GAST11._negll`): $-\sum_t[\log f_{t_\nu}(z_t) - \tfrac12\log f_t]$; L-BFGS-B on θ (maxiter 2000) from three starts (ω, α, β) ∈ {(0.03v, 0.05, 0.97), (0.01v, 0.08, 0.99), (0.1v, 0.03, 0.9)}, ν start 6, Nelder–Mead polish on failure; μ start = sample mean; backcast $f_0$ arch-style. Point estimates only. (Note: `GAST11.sigma2` uses an attribute `_nu` set only by `filter`; `fit`/`forecast` bypass it through their own code paths.) | |
| 24 | + | |
| 25 | +## 6. Forecasting | |
| 26 | +`GAST11.forecast`: $\hat f_{t+1|t} = \omega + \alpha s_t + \beta f_t$ with $s_t$ computed from the last observation; $\hat f_{t+k|t} = \omega + \beta\,\hat f_{t+k-1|t}$ for $k \ge 2$ (uses $E[s_{t+j}\mid\mathcal F_t] = 0$; exact if the t-density is correctly specified). Cumulative = sum over k ≤ h. Method: `analytic`. | |
| 27 | + | |
| 28 | +## 7. Implementation | |
| 29 | +- `src/wp46/models/custom.py::GAST11` (numba `rec_gas_t`). | |
| 30 | +- Cross-check: **none against a library** (GAS R package not run; no arch/rugarch counterpart; not in `results/metrics/rugarch_crosscheck.json`). | |
| 31 | +- Tests: `tests/unit/test_custom_models.py::test_nesting_and_admissibility[GAST11]` (converged, admissible, positive finite 22-step forecasts; excluded from the GARCH-nesting log-likelihood assertion). No simulation-recovery test. | |
| 32 | + | |
| 33 | +## 8. Known limitations / failure modes | |
| 34 | +β near 1 (near-integrated score recursion) and small ν give very different dynamics from GARCH (bounded news impact); when the data are close to Gaussian the model is only identified through the GARCH limit and ν runs to large values; the zero-mean score assumption makes multi-step forecasts revert at rate β (faster than GARCH's α+β for equal fits); only the t law is available (no skewness). | |
| 35 | + | |
| 36 | +## 9. Computational footprint | |
| 37 | +Analytic; 5 parameters; one numba recursion with a rational function per step. Not in the pilot; cost order of `garch11` custom. | |
| 38 | + | |
| 39 | +## 10. Literature expectations | |
| 40 | +`creal2013generalized` and `harvey2013dynamic` motivate the score update by robustness to outliers; `blasques2015information` show information-theoretic optimality of score updates. The literature matrix labels it "non-GARCH adjacent". Expectation: close to GARCH(1,1)-t at h = 1 with better behaviour after extreme returns (COVID/tariff episodes, H6); no claim of superiority at h = 22. | |
added
model_cards/har_rv.md
+43 −0
@@ -0,0 +1,43 @@ | ||
| 1 | +# Model card — `har_rv` (HAR-RV, direct projections per horizon, levels) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `har_rv` · **family:** realized (Tier B) · **tier:** B · **status:** implemented · **impl:** ols (`src/wp46/models/baselines.py::HARRV(log=False)`) | |
| 5 | +- **Label:** HAR-RV (direct, levels) · **distributions:** empirical | |
| 6 | +- **Seminal citation:** `corsi2009simple` | |
| 7 | +- **Other references:** `andersen2007roughing` (HAR-CJ), `patton2015good` (HAR-RS), `bollerslev2016exploiting` (HARQ), `clements2021practical`, `branco2024forecasting`, `lyocsa2021stock`, `christensen2023machine`, `brini2026forecasting` (HAR as the realized benchmark); direct vs iterated multi-step: reference to be added (see `_missing_references.md`). | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +With $y_t$ the full-day variance proxy (`rv5ss_on`, percent², observed at the close of t) and regressors at origin t | |
| 11 | +$$\mathbf x_t = \big[1,\ y_t,\ \tfrac15\textstyle\sum_{i=0}^{4}y_{t-i},\ \tfrac1{22}\sum_{i=0}^{21}y_{t-i}\big]$$ | |
| 12 | +(daily, weekly, monthly averages ending at t; undefined for t < 21), one **direct** OLS projection per horizon $h \in \{1, 5, 22\}$ of the average daily variance over the next h days: | |
| 13 | +$$\frac1h\sum_{k=1}^{h} y_{t+k} = \mathbf x_t'\boldsymbol\beta^{(h)} + e^{(h)}_{t+h} .$$ | |
| 14 | +No innovation law (empirical standardised returns for VaR); `mu` = mean of the last 250 returns. | |
| 15 | + | |
| 16 | +## 3. Parameter space and admissibility | |
| 17 | +- Parameters: `b{h}_{c,d,w,m}` for h = 1, 5, 22 (12 coefficients). Unconstrained OLS (`np.linalg.lstsq`); no positivity constraint on coefficients; forecasts floored at 1e-8 percent². | |
| 18 | +- `converged = admissible = True` iff every horizon has ≥ 50 complete rows in the 1,000-day window; otherwise the fit is recorded as failed (`ok = False`, NaN coefficients). | |
| 19 | + | |
| 20 | +## 4. Nesting and relations | |
| 21 | +Restricted ARCH-type regression on realized measures (22 lags with step weights); nests `rm_rw` ($\beta_d = 1$, others 0). `loghar_rv` is the log version with smearing. HEAVY and Realized GARCH are the likelihood-based Tier B relatives. | |
| 22 | + | |
| 23 | +## 5. Estimation | |
| 24 | +OLS by `np.linalg.lstsq` on the rows of the 1,000-day window where the regressors and the h-step target are complete (the last h rows have no target). No optimizer, no starting values, no retries, no initial variance. Standard errors are not computed; point estimates only. Re-estimated every 5 days like every model; `filter` uses the h = 1 coefficients. | |
| 25 | + | |
| 26 | +## 6. Forecasting | |
| 27 | +`HARRV.forecast` computes the direct forecasts $\hat f_h = \mathbf x_t'\hat{\boldsymbol\beta}^{(h)}$ for h = 1, 5, 22, converts them to cumulative variances $C_h = \max(\hat f_h, 10^{-8})\,h$ and distributes the increments evenly across per-step variances: | |
| 28 | +$$\hat\sigma^2_{t+1|t} = C_1,\quad \hat\sigma^2_{t+k|t} = \frac{\max(C_5 - C_1,\ 4\cdot10^{-8})}{4}\ (k = 2..5),\quad \hat\sigma^2_{t+k|t} = \frac{\max(C_{22} - C_5,\ 17\cdot10^{-8})}{17}\ (k = 6..22),$$ | |
| 29 | +so that the sums over k ≤ 1, 5, 22 equal the direct forecasts (monotonicity of the cumulative variance enforced by the floors). Method: `direct`. | |
| 30 | + | |
| 31 | +## 7. Implementation | |
| 32 | +- `src/wp46/models/baselines.py::HARRV`, `_har_X` (cumulative sums); dispatched by `make_model("har_rv")`. | |
| 33 | +- Cross-check: none against a library (`highfrequency::HARmodel` not run); OLS is deterministic. | |
| 34 | +- Tests: `tests/integration/test_rolling_driver.py::test_driver_tier_b_and_failure_flags` (`har_rv` with Tier B input); pilot `har_rv__empirical`: 207/207 refits `ok`, 1,032/1,032 forecasts `ok` on CL. No unit test of `_har_X`. | |
| 35 | + | |
| 36 | +## 8. Known limitations / failure modes | |
| 37 | +Negative or explosive forecasts are possible in levels (floored at 1e-8); OLS in levels is sensitive to outliers in the realized measure (COVID days); the direct h = 22 regression uses only T − 22 rows with overlapping targets; imputed $r_t^2$ on invalid sessions enters both regressors and targets (flagged); crypto Tier B only from 2022 (D-06). | |
| 38 | + | |
| 39 | +## 9. Computational footprint | |
| 40 | +Three least-squares fits of 1,000 × 4 per refit: pilot median fit time 0.0008 s (CL) / 0.0009 s (EURUSD) — the cheapest Tier B model. | |
| 41 | + | |
| 42 | +## 10. Literature expectations | |
| 43 | +`corsi2009simple`, `kourtis2016international`, `lyocsa2021stock`, `branco2024forecasting` ("nothing beats linear models"), `brini2026forecasting`: HAR is the realized-measure benchmark that is hard to beat at h = 1, 5, 22; `christensen2023machine` find ML gains only with extra predictors. Pre-registered H3: Tier B models beat the best Tier A model at h = 1 with a shrinking advantage at h = 22. | |
added
model_cards/heavy11.md
+43 −0
@@ -0,0 +1,43 @@ | ||
| 1 | +# Model card — `heavy11` (HEAVY(1,1), Shephard–Sheppard) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `heavy11` · **family:** realized (Tier B) · **tier:** B · **status:** implemented · **impl:** custom (`src/wp46/models/custom.py::HEAVY11`) | |
| 5 | +- **Label:** HEAVY(1,1) · **distributions:** normal, t (return equation) | |
| 6 | +- **Seminal citation:** `shephard2010realising` | |
| 7 | +- **Other references:** `noureldin2012multivariate` (multivariate HEAVY), `engle2002new` (GARCH-X), `engle2006multiple` (MEM, the model class of the RM equation), `hansen2012realized`; `boudt2012highfrequency` (`HEAVYmodel` in R, not run). | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +With $RM_t = x_t$ (`rv5ss_on`, percent², end of day t): | |
| 11 | +$$r_t = \mu + \varepsilon_t,\ \varepsilon_t = \sqrt{h_t}\,z_t,\qquad h_t = \omega + \alpha\,RM_{t-1} + \beta\,h_{t-1}\quad(\text{HEAVY-r: } \operatorname{Var}[r_t\mid\mathcal F_{t-1}]),$$ | |
| 12 | +$$\mu_t = \omega_R + \alpha_R\,RM_{t-1} + \beta_R\,\mu_{t-1}\quad(\text{HEAVY-RM: } E[RM_t\mid\mathcal F_{t-1}]) .$$ | |
| 13 | +The return-variance equation uses the lagged realized measure, **not** $\varepsilon_{t-1}^2$ (literature-matrix caveat #7). `rec_heavy_r`: $h_0 = s_0$ (backcast of $\varepsilon^2$), $\mu_0$ = mean of the first min(75, T) realized measures. Innovations: $z_t$ normal or standardised t(ν); the RM equation has no distributional assumption beyond the multiplicative-error QL. | |
| 14 | + | |
| 15 | +## 3. Parameter space and admissibility | |
| 16 | +- Parameters: `mu, omega, alpha, beta, omega_r, alpha_r, beta_r` (+ `nu`). | |
| 17 | +- Reparameterisation: $\omega = e^{\theta}$, $\alpha = e^{\theta}$ (unbounded above), $\beta = \sigma(\theta) \in (0,1)$, $\omega_R = e^{\theta}$, $\alpha_R + \beta_R = \sigma(\theta) \in (0,1)$, $\alpha_R = (\alpha_R+\beta_R)\sigma(\theta')$. | |
| 18 | +- Admissibility flag: $\omega > 0$, $\alpha \ge 0$, $0 \le \beta < 1$, $\omega_R > 0$, $\alpha_R \ge 0$, $\alpha_R + \beta_R < 1$ (stationarity of the RM equation; stationarity of $h_t$ given stationary $RM$). | |
| 19 | + | |
| 20 | +## 4. Nesting and relations | |
| 21 | +Nests `rm_rw` in the return equation ($\alpha = 1$, $\omega = \beta = 0$); GARCH-X adds $\alpha_G\varepsilon_{t-1}^2$ to HEAVY-r (`garchx_rv11` reuses the HEAVY-RM equation); Realized GARCH is the log-linear relative with a measurement equation; the HEAVY-RM equation is a MEM(1,1) for the realized measure (`engle2006multiple`). | |
| 22 | + | |
| 23 | +## 5. Estimation | |
| 24 | +Quasi-maximum likelihood (`CustomModel.fit` with `extra_loglik`): objective $= -\sum_t\big[\log f_z(\varepsilon_t/\sqrt{h_t}) - \tfrac12\log h_t\big] + \sum_t\big[\log\mu_t + RM_t/\mu_t\big]$ — Gaussian (or t) QL for returns plus the multiplicative-error (exponential/Gamma, QLIKE-type) QL for the realized measure; the two equations share no parameters, so the joint maximisation is equivalent to the separate estimation described by Shephard & Sheppard, but the code performs it in **one** L-BFGS-B run (maxiter 2000) over all seven (eight) parameters from three starts (ω, α, β, ω_R, α_R, β_R) ∈ {(0.05 m, 0.4, 0.6, 0.05 m, 0.4, 0.55), (0.1 m, 0.3, 0.65, 0.1 m, 0.3, 0.6), (0.02 m, 0.5, 0.5, 0.02 m, 0.5, 0.48)} with $m$ = mean RM; Nelder–Mead polish on failure; μ start = sample mean. Point estimates only; the reported `loglik` is the joint QL (not comparable with GARCH). | |
| 25 | + | |
| 26 | +## 6. Forecasting | |
| 27 | +`HEAVY11.step_forecast` (closed form, as in `shephard2010realising`): | |
| 28 | +$$\hat h_{t+1} = \omega + \alpha RM_t + \beta h_t,\quad \hat\mu_{t+1} = \omega_R + \alpha_R RM_t + \beta_R\mu_t,\qquad \hat h_{t+k} = \omega + \alpha\,\hat\mu_{t+k-1} + \beta\,\hat h_{t+k-1},\quad \hat\mu_{t+k} = \omega_R + (\alpha_R + \beta_R)\,\hat\mu_{t+k-1},\ k \ge 2 .$$ | |
| 29 | +Cumulative = sum over k ≤ h. Method: `analytic`. | |
| 30 | + | |
| 31 | +## 7. Implementation | |
| 32 | +- `src/wp46/models/custom.py::HEAVY11` (numba `rec_heavy_r` for both equations). | |
| 33 | +- Cross-check: **none against a library** (not in `results/metrics/rugarch_crosscheck.json`; `highfrequency::HEAVYmodel` not run). | |
| 34 | +- Tests: `tests/simulation/test_recovery.py::test_heavy_recovery` (T = 4,000, Gamma(4, 0.25) multiplicative RM noise; α, β, α_R within 0.1 of (0.4, 0.55, 0.45)); `tests/unit/test_custom_models.py::test_realized_models_fit_on_synthetic_measure`; `tests/integration/test_rolling_driver.py::test_driver_tier_b_and_failure_flags` (`heavy11`, normal, Tier B input and failure flags). | |
| 35 | + | |
| 36 | +## 8. Known limitations / failure modes | |
| 37 | +The return equation has no $\varepsilon^2$ term, so on days with invalid realized measures the imputed $r^2$ drives $h_t$ directly; α is unbounded above (large α with small β is admissible); μ_0 initialised by a 75-day mean of RM (not a backcast of the same form as $h_0$); the RM equation's multiplicative-error QL is consistent for $E[RM_t\mid\mathcal F_{t-1}]$ but the t option affects only the return equation; near-unit $\alpha_R + \beta_R$ makes long-horizon RM forecasts slow to revert. | |
| 38 | + | |
| 39 | +## 9. Computational footprint | |
| 40 | +Analytic; 7–8 parameters; two cheap recursions per evaluation. Not in the pilot; cost order of `garch11` custom to `nagarch11`. | |
| 41 | + | |
| 42 | +## 10. Literature expectations | |
| 43 | +`shephard2010realising`: HEAVY beats GARCH in-sample and out-of-sample at short horizons and adapts faster after level shifts, with the gain decaying as the horizon grows (their multi-step results); `noureldin2012multivariate` extend this to covariances. Pre-registered H3 applies; the matrix lists HEAVY among the three likelihood-based Tier B models. | |
added
model_cards/hygarch11.md
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +# Model card — `hygarch11` (HYGARCH) — UNSUPPORTED, not scored | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `hygarch11` · **family:** fractional · **tier:** A · **status:** unsupported · **impl:** none · **distributions:** [] (registry note: "no vetted implementation; not scored") | |
| 5 | +- **Seminal citation:** `davidson2004moment`. Related: `baillie1996fractionally`, `conrad2006inequality` (positivity; Conrad 2007 on HYGARCH constraints is not in the .bib — literature matrix). | |
| 6 | + | |
| 7 | +## 2. Definition (literature) | |
| 8 | +Hyperbolic GARCH: $\sigma_t^2 = \omega + \big[1 - (1-\beta L)^{-1}(1-\phi L)\{1 + \alpha[(1-L)^d - 1]\}\big]\varepsilon_t^2$; the amplitude parameter α nests GARCH (α = 0) and FIGARCH (α = 1). | |
| 9 | + | |
| 10 | +## 3–6. Parameter space, estimation, forecasting | |
| 11 | +Not implemented in WP46; positivity constraints are non-trivial (matrix §a.3). | |
| 12 | + | |
| 13 | +## 7. Implementation / why not scored | |
| 14 | +Not in arch 8.0.0 or rugarch 1.5-6; no authoritative cross-check → `unsupported` (D-11). | |
| 15 | + | |
| 16 | +## 8–9. Limitations / footprint | |
| 17 | +Not applicable. | |
| 18 | + | |
| 19 | +## 10. Literature expectations | |
| 20 | +`davidson2004moment` introduced it for Asian-crisis exchange rates; no large-scale forecasting evidence in the matrix. The FIGARCH/GARCH end points are scored (`figarch11`, `garch11`). | |
added
model_cards/loghar_rv.md
+37 −0
@@ -0,0 +1,37 @@ | ||
| 1 | +# Model card — `loghar_rv` (log-HAR-RV, direct projections with smearing) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `loghar_rv` · **family:** realized (Tier B) · **tier:** B · **status:** implemented · **impl:** ols (`src/wp46/models/baselines.py::HARRV(log=True)`) | |
| 5 | +- **Label:** log-HAR-RV (direct, smearing) · **distributions:** empirical | |
| 6 | +- **Seminal citation:** `corsi2009simple` (log-HAR variant discussed there) | |
| 7 | +- **Other references:** `andersen2001distribution`/`andersen2001distributionstock` (log-RV ≈ Gaussian), `andersen2003modeling`; Duan (1983) smearing estimator: **reference to be added** (`_missing_references.md`); `clements2021practical`, `branco2024forecasting`. | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +Same regressors as `har_rv` but built from $\log y_t$ (y floored at 1e-8): $\mathbf x_t = [1, \log y_t, \tfrac15\sum_{i<5}\log y_{t-i}, \tfrac1{22}\sum_{i<22}\log y_{t-i}]$; direct regressions per horizon on the log of the average future variance: | |
| 11 | +$$\log\Big(\frac1h\sum_{k=1}^{h}y_{t+k}\Big) = \mathbf x_t'\boldsymbol\beta^{(h)} + e^{(h)}_{t+h},\qquad \hat f_h = \exp(\mathbf x_t'\hat{\boldsymbol\beta}^{(h)})\cdot \hat S_h,\quad \hat S_h = \frac1{n_h}\sum \exp(\hat e^{(h)})$$ | |
| 12 | +(Duan smearing factor = mean of the exponentiated OLS residuals, one per horizon). No innovation law. | |
| 13 | + | |
| 14 | +## 3. Parameter space and admissibility | |
| 15 | +As `har_rv` (12 OLS coefficients + 3 smearing factors in `aux["smear"]`); forecasts positive by construction; `converged` iff ≥ 50 complete rows per horizon. | |
| 16 | + | |
| 17 | +## 4. Nesting and relations | |
| 18 | +Log version of `har_rv`; related to the log-linear Realized GARCH measurement equation and to the Gaussianity of log-RV. | |
| 19 | + | |
| 20 | +## 5. Estimation | |
| 21 | +OLS (`np.linalg.lstsq`) in logs, residual-based smearing factor; no optimizer, no retries, point estimates only. | |
| 22 | + | |
| 23 | +## 6. Forecasting | |
| 24 | +As `har_rv` after back-transformation: $C_h = \max(\hat f_h, 10^{-8})\,h$ for h = 1, 5, 22; per-step variances by even allocation of the increments $C_1$, $C_5 - C_1$ (4 days), $C_{22} - C_5$ (17 days), with floors; sums over k ≤ 1, 5, 22 equal the direct forecasts. Method: `direct`. | |
| 25 | + | |
| 26 | +## 7. Implementation | |
| 27 | +- `src/wp46/models/baselines.py::HARRV(log=True)`; `make_model("loghar_rv")`. | |
| 28 | +- Cross-check: none (deterministic OLS). Tests: none dedicated (the integration test and pilot use `har_rv` only). | |
| 29 | + | |
| 30 | +## 8. Known limitations / failure modes | |
| 31 | +The smearing correction assumes homoskedastic residuals (a single factor per horizon); under heteroskedastic log-residuals the back-transformed forecasts are biased; the log floor 1e-8 affects zero-variance sessions; overlapping h = 22 targets. | |
| 32 | + | |
| 33 | +## 9. Computational footprint | |
| 34 | +As `har_rv` (three least-squares fits per refit, negligible). | |
| 35 | + | |
| 36 | +## 10. Literature expectations | |
| 37 | +Log-HAR is often preferred for its approximately Gaussian residuals (`andersen2001distribution`, `corsi2009simple`); comparisons in `clements2021practical` and `branco2024forecasting` report small differences between level and log HAR under QLIKE once the retransformation bias is corrected. Expectation: close to `har_rv`, more robust to outliers in levels, slightly worse under MSE at h = 1. | |
added
model_cards/msgarch2.md
+43 −0
@@ -0,0 +1,43 @@ | ||
| 1 | +# Model card — `msgarch2` (two-regime Markov-switching GARCH, Haas–Mittnik–Paolella) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `msgarch2` · **family:** regime-switching · **tier:** A · **status:** implemented · **impl:** custom (`src/wp46/models/custom.py::MSGARCH2`) | |
| 5 | +- **Label:** MS-GARCH(2) (Haas-Mittnik-Paolella) · **distributions:** normal, t (common ν across regimes) · registry note: "regimes ordered by unconditional variance" | |
| 6 | +- **Seminal citation:** `haas2004new` | |
| 7 | +- **Other references:** `hamilton1989new` (filter), `gray1996modeling`, `klaassen2002improving` (collapsing MS-GARCH — different likelihoods, not implemented), `bauwens2010theory`, `augustyniak2014maximum` (path-dependent MS-GARCH, out of scope), `ardia2019markov`/`ardia2016msgarch` (MSGARCH R package implementing the HMP form), `ardia2018forecasting`, `marcucci2005forecasting` (benchmarks). | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +Regime $S_t \in \{1,2\}$, first-order Markov chain with $P(S_t = 1 \mid S_{t-1} = 1) = p_{11}$, $P(S_t = 2 \mid S_{t-1} = 2) = p_{22}$; two parallel GARCH(1,1) variances driven by the common innovation: | |
| 11 | +$$r_t = \mu + \varepsilon_t,\qquad \sigma_{k,t}^2 = \omega_k + \alpha_k\,\varepsilon_{t-1}^2 + \beta_k\,\sigma_{k,t-1}^2,\ k = 1,2,\qquad \varepsilon_t \mid S_t = k,\ \mathcal F_{t-1} \sim \sigma_{k,t} z_t ,$$ | |
| 12 | +$z_t$ N(0,1) or standardised Student-t with a **common** ν. `hamilton_msgarch`: $\sigma_{k,0}^2 = s_0$ (backcast) for both regimes, prior $P(S_0 = 1) = \pi_1 = (1-p_{22})/(2 - p_{11} - p_{22})$ (ergodic distribution), Hamilton filter with log-sum-exp; the log-likelihood is $\sum_t \log\big[\sum_k P(S_t = k\mid\mathcal F_{t-1})\,f_k(\varepsilon_t)\big]$. Identification: regime 1 = lower unconditional variance $u_k = \omega_k/(1-\alpha_k-\beta_k)$. | |
| 13 | + | |
| 14 | +## 3. Parameter space and admissibility | |
| 15 | +- Parameters: `mu, p11, p22, omega1, alpha1, beta1, omega2, alpha2, beta2` (+ `nu`). | |
| 16 | +- Reparameterisation: $p_{11}, p_{22} = \sigma(\theta)$; per regime $\omega_k = e^{\theta}$, $\alpha_k + \beta_k = \sigma(\theta) \in (0,1)$, $\alpha_k = (\alpha_k+\beta_k)\,\sigma(\theta')$ — so each regime is covariance stationary by construction. | |
| 17 | +- Identification constraint $u_1 \le u_2$ enforced by a **soft penalty** added to the negative log-likelihood: $50\,(\ln u_1 - \ln u_2)$ when $u_1 > u_2$ (the reported `loglik` = −objective therefore includes the penalty if it is active at the optimum). | |
| 18 | +- Admissibility flag: $\omega_1, \omega_2 > 0$, $0 < p_{11}, p_{22} < 1$. The HMP stationarity condition for the mixture (spectral radius of the regime-weighted persistence matrix < 1) is not computed; per-regime $\alpha_k + \beta_k < 1$ is sufficient for it. | |
| 19 | + | |
| 20 | +## 4. Nesting and relations | |
| 21 | +Collapses to `garch11` when the two regimes have identical parameters or when $p_{11} \to 1$ (absorbing). HMP form: regime variances depend only on past $\varepsilon^2$ (no path dependence), unlike Gray/Klaassen (collapsing) or `bauwens2010theory` (path-dependent) — literature-matrix caveat #6. `stgarch` (unsupported) is the smooth-transition analogue. | |
| 22 | + | |
| 23 | +## 5. Estimation | |
| 24 | +Custom MLE (`CustomModel.fit` with `MSGARCH2._negll`): L-BFGS-B on θ (maxiter 2000) from three starts: (p11, p22, ω1, α1, β1, ω2, α2, β2) ∈ {(0.98, 0.97, 0.04v, 0.03, 0.90, 0.30v, 0.10, 0.80), (0.95, 0.95, 0.03v, 0.05, 0.85, 0.30v, 0.15, 0.75), (0.99, 0.99, 0.035v, 0.02, 0.93, 0.15v, 0.08, 0.85)} with $v = \operatorname{var}(r)$; Nelder–Mead polish on failure; μ start = sample mean, ν start 6; backcast $s_0$ arch-style. Point estimates only. `filter` returns the one-step predictive mixture variance $E[\sigma_t^2 \mid \mathcal F_{t-1}] = \pi_{1,t|t-1}\sigma_{1,t}^2 + (1-\pi_{1,t|t-1})\sigma_{2,t}^2$. | |
| 25 | + | |
| 26 | +## 6. Forecasting | |
| 27 | +`MSGARCH2.forecast` (documented in the class as the HMP recursion): with $\boldsymbol\pi_t = (P(S_t=1\mid\mathcal F_t), P(S_t=2\mid\mathcal F_t))$ from the filter, $\mathbf P$ the transition matrix, and $\sigma_{k,t+1}^2 = \omega_k + \alpha_k\varepsilon_t^2 + \beta_k\sigma_{k,t}^2$, | |
| 28 | +$$\boldsymbol\pi_{t+j|t} = \boldsymbol\pi_t\mathbf P^{j},\qquad \hat\sigma^2_{t+j|t} = \sum_k \pi_{k,t+j|t}\,\hat\sigma^2_{k,t+j},\qquad \hat\sigma^2_{k,t+j+1} = \omega_k + \alpha_k\,\hat\sigma^2_{t+j|t} + \beta_k\,\hat\sigma^2_{k,t+j},$$ | |
| 29 | +for $j = 1..22$ (`e2f = out[j]` feeds both regime recursions). The code treats $E[\varepsilon^2_{t+j}\mid\mathcal F_t]$ as the marginal-probability mixture of the regime variances; whether this coincides with the exact HMP multi-step expression (which conditions the future regime and the regime variances jointly) is **not verified here** — recorded in `_discrepancies.md`. Cumulative = sum over j ≤ h. Method: `analytic`. The forecast object also carries `regime_probs` ($\boldsymbol\pi_{t+22|t}$) and `regime_var`. | |
| 30 | + | |
| 31 | +## 7. Implementation | |
| 32 | +- `src/wp46/models/custom.py::MSGARCH2` (numba `hamilton_msgarch`). | |
| 33 | +- Cross-check: **none against a library** (MSGARCH R package not run; not in `results/metrics/rugarch_crosscheck.json`). | |
| 34 | +- Tests: `tests/unit/test_custom_models.py::test_msgarch_two_regimes_ordered_and_forecast_positive` (converged, $u_1 \le 1.01\,u_2$, positive 22-step forecasts), `test_no_lookahead_in_forecasts` (normal); `tests/simulation/test_recovery.py::test_msgarch_recovery_regime_separation` (T = 6,000, P = [[0.98, 0.02],[0.03, 0.97]], regimes (0.02, 0.03, 0.90)/(0.3, 0.10, 0.80): recovers $p_{11}, p_{22} > 0.9$ and $u_2/u_1 > 3$). | |
| 35 | + | |
| 36 | +## 8. Known limitations / failure modes | |
| 37 | +Multimodal likelihood (label switching handled by the soft penalty, which can bias the reported log-likelihood when active); a regime can degenerate (p_kk → 1 or ω_k → 0) → flat likelihood, slow convergence, boundary optima; common ν only; no stationarity flag for the mixture; the Hamilton filter costs a full pass with two GARCH recursions per likelihood evaluation; multi-step recursion caveat above. | |
| 38 | + | |
| 39 | +## 9. Computational footprint | |
| 40 | +Analytic forecasts; 9–10 parameters; Hamilton filter per evaluation (≈ 3× the cost of a GARCH(1,1) evaluation plus more iterations). Not in the pilot; expected to be among the slowest Tier A estimations with `figarch11` and `aparch11`. | |
| 41 | + | |
| 42 | +## 10. Literature expectations | |
| 43 | +`marcucci2005forecasting`: MS-GARCH beats single-regime GARCH at short horizons only on S&P 100; `ardia2018forecasting` (426 assets): MS-GARCH improves VaR/ES and density forecasts rather than point variance accuracy; `haas2004new` show the analytic tractability of the parallel-process form. Expectation (H4, H6): gains concentrated at h = 1 in regime transitions and in tail-risk evaluation, with higher failure rates (H5). | |
added
model_cards/realegarch11.md
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +# Model card — `realegarch11` (Realized EGARCH) — UNSUPPORTED, not scored | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `realegarch11` · **family:** realized (Tier B) · **tier:** B · **status:** unsupported · **impl:** none · **distributions:** [] (registry note: "not implemented in this version (deferred)") | |
| 5 | +- **Seminal citation:** registry gives `hansen2016realized`, **which is not a key of `paper/references.bib`**; the verified key is `hansen2016exponential` (Hansen & Huang 2016, JBES 34(2)) — see `_discrepancies.md`. Related: `hansen2012realized` (Realized GARCH, scored as `realgarch11`), `nelson1991conditional`. | |
| 6 | + | |
| 7 | +## 2. Definition (literature) | |
| 8 | +$r_t = \mu + \sigma_t z_t$; $\log\sigma_t^2 = \omega + \beta\log\sigma_{t-1}^2 + \tau(z_{t-1}) + \gamma\,u_{t-1}$; measurement $\log x_t = \xi + \varphi\log\sigma_t^2 + \delta(z_t) + u_t$, with leverage functions $\tau(\cdot), \delta(\cdot)$ (quadratic in z) and possibly several realized measures; the measurement error $u_t$ feeds back into the log-variance. | |
| 9 | + | |
| 10 | +## 3–6. Parameter space, estimation, forecasting | |
| 11 | +Not implemented in WP46. | |
| 12 | + | |
| 13 | +## 7. Implementation / why not scored | |
| 14 | +No implementation in arch 8.0.0 or rugarch 1.5-6; deferred (registry, D-11). The log-linear Realized GARCH is the scored representative of the family. | |
| 15 | + | |
| 16 | +## 8–9. Limitations / footprint | |
| 17 | +Not applicable. | |
| 18 | + | |
| 19 | +## 10. Literature expectations | |
| 20 | +`hansen2016exponential` report improvements over Realized GARCH in-sample and in forecasting on US equities; no large cross-asset benchmark in the matrix. | |
added
model_cards/realgarch11.md
+40 −0
@@ -0,0 +1,40 @@ | ||
| 1 | +# Model card — `realgarch11` (Realized GARCH(1,1), log-linear, Hansen–Huang–Shek) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `realgarch11` · **family:** realized (Tier B) · **tier:** B · **status:** implemented · **impl:** custom (`src/wp46/models/custom.py::RealGARCH11`) | |
| 5 | +- **Label:** Realized GARCH(1,1), log-linear · **distributions:** normal, t (for $z_t$; the measurement error $u_t$ is always Gaussian) | |
| 6 | +- **Seminal citation:** `hansen2012realized` | |
| 7 | +- **Other references:** `hansen2016exponential` (Realized EGARCH, unsupported), `hansen2014realized` (Realized Beta GARCH), `shephard2010realising` (HEAVY), `engle2002new` (GARCH-X); literature-matrix caveat #7 (the measurement equation is part of the likelihood → in-sample log-likelihoods are not comparable with GARCH). | |
| 8 | + | |
| 9 | +## 2. Definition | |
| 10 | +With $x_t$ the realized measure (`rv5ss_on`, percent², observed at the **end** of day t; only $x_{t-1}$ enters $\sigma_t^2$): | |
| 11 | +$$r_t = \mu + \sigma_t z_t,\qquad \log\sigma_t^2 = \omega + \beta\,\log\sigma_{t-1}^2 + \gamma\,\log x_{t-1},$$ | |
| 12 | +$$\log x_t = \xi + \varphi\,\log\sigma_t^2 + \tau_1 z_t + \tau_2\,(z_t^2 - 1) + u_t,\qquad u_t \sim \text{N}(0, \sigma_u^2) .$$ | |
| 13 | +`rec_realgarch`: $\log\sigma_0^2 = \log s_0$ (backcast), $x$ floored at 1e-8 before the log; the fit fails (`FloatingPointError` → objective 1e10) if $|\log\sigma_t^2| > 50$. Joint log-likelihood $\ell = \sum_t\big[\log f_z(z_t) - \tfrac12\log\sigma_t^2\big] + \sum_t\big[-\tfrac12\log(2\pi\sigma_u^2) - u_t^2/(2\sigma_u^2)\big]$. Innovations $z_t$: normal or standardised t(ν). | |
| 14 | + | |
| 15 | +## 3. Parameter space and admissibility | |
| 16 | +- Parameters: `mu, omega, beta, gamma, xi, phi, tau1, tau2, log_sigma_u` (+ `nu`). All unconstrained in the optimizer (identity transform; $\sigma_u = e^{\texttt{log\_sigma\_u}}$). | |
| 17 | +- Admissibility flag: $|\beta + \varphi\gamma| < 1$ (stationarity of the reduced-form AR(1) for $\log\sigma_t^2$ obtained by substituting the measurement equation). No positivity constraints are needed (log specification). | |
| 18 | + | |
| 19 | +## 4. Nesting and relations | |
| 20 | +Realized GARCH reduces to a GARCH-type model when the measurement equation is dropped; in log-linear form with $\gamma = 0$ it is a log-GARCH without ARCH term. HEAVY uses $x_{t-1}$ in levels without a measurement equation; GARCH-X adds $x_{t-1}$ to a GARCH(1,1). Realized EGARCH (unsupported) generalises the leverage function and allows several measures. | |
| 21 | + | |
| 22 | +## 5. Estimation | |
| 23 | +Custom MLE (`CustomModel.fit` with `extra_loglik` adding the measurement-equation terms): L-BFGS-B on the 8 + 1 (+1) raw parameters (maxiter 3000, ftol 1e-10, gtol 1e-6) from three starts (ω, β, γ, ξ, φ, τ₁, τ₂, log σ_u) ∈ {(0.04 ℓ̄, 0.55, 0.41, −0.1, 1.0, −0.07, 0.07, log 0.4), (0.1 ℓ̄, 0.7, 0.28, 0, 0.95, −0.05, 0.05, log 0.5), (0.02 ℓ̄, 0.4, 0.55, −0.2, 1.05, −0.1, 0.1, log 0.35)} with $\bar\ell$ = mean of $\log x$, Nelder–Mead polish on failure; μ start = sample mean, ν start 6; backcast $s_0$ arch-style on the demeaned returns. Point estimates only; the reported `loglik` is the **joint** return + measurement log-likelihood. | |
| 24 | + | |
| 25 | +## 6. Forecasting | |
| 26 | +`RealGARCH11.step_forecast`: h = 1 analytic, $\log\hat\sigma^2_{t+1|t} = \omega + \beta\log\sigma_t^2 + \gamma\log x_t$. **h > 1 by simulation** (`analytic_multistep = False`): 2,000 paths; for k = 2..22 draw $z \sim f_z$ (fitted law, `distributions.rvs`) and $u \sim$ N(0, σ_u²) with `np.random.default_rng(46 + origin)` (seeded), set $\log x_{t+k-1} = \xi + \varphi\log\sigma^2_{t+k-1} + \tau_1 z + \tau_2(z^2-1) + u$, then $\log\sigma^2_{t+k} = \omega + \beta\log\sigma^2_{t+k-1} + \gamma\log x_{t+k-1}$, clipped to ±30; $\hat\sigma^2_{t+k|t}$ = path mean of $\exp(\log\sigma^2_{t+k})$. Cumulative = sum over k ≤ h. Method: `simulation`. (The class docstring mentions a VAR-type recursion; the code simulates.) | |
| 27 | + | |
| 28 | +## 7. Implementation | |
| 29 | +- `src/wp46/models/custom.py::RealGARCH11` (numba `rec_realgarch`). | |
| 30 | +- Cross-check: attempted against rugarch `realGARCH` (normal, `realizedVol = sqrt(x)`) on the shared fixture, but **rugarch did not converge** (`results/metrics/rugarch_crosscheck.json["rugarch"]["realgarch11_n"] = {"converged": false}`), so `comparison.realgarch11_n.diff = null`; ours: joint log-likelihood −4989.2126, converged. No library cross-check is therefore available. | |
| 31 | +- Tests: `tests/simulation/test_recovery.py::test_realgarch_recovery` (T = 4,000, normal, truth (0.06, 0.55, 0.40, −0.2, 1.0, −0.07, 0.07, 0.4): β, γ, φ within 0.1, σ_u within 0.05); `tests/unit/test_custom_models.py::test_realized_models_fit_on_synthetic_measure` (converged, positive finite forecasts); pilot `realgarch11__normal`: 207/207 refits `ok`, 1,032/1,032 forecasts `ok` on CL. | |
| 32 | + | |
| 33 | +## 8. Known limitations / failure modes | |
| 34 | +No parameter constraints → the optimizer can leave the stationary region (flag `admissible = False`); the simulation step compounds $\exp(\cdot)$ of Gaussian-like paths (mean of log-normal paths grows with the simulated variance, sensitive to τ₂ and σ_u); $x_{t-1}$ imputed by $r_{t-1}^2$ on invalid sessions and floored at 1e-8 (log of a tiny number); the joint likelihood is dominated by the measurement equation (not comparable with GARCH); the t option applies to $z_t$ only. | |
| 35 | + | |
| 36 | +## 9. Computational footprint | |
| 37 | +Estimation: 9–10 free parameters, one numba pass per evaluation; pilot median fit time per refit (normal) 0.0269 s (CL) / 0.0279 s (EURUSD) — the second most expensive pilot model after `aparch11`. Forecasting by simulation (21 × 2,000 draws of z and u per origin). | |
| 38 | + | |
| 39 | +## 10. Literature expectations | |
| 40 | +`hansen2012realized` report substantial likelihood and forecast gains over GARCH when a realized measure is available; `lyocsa2021stock` and `kourtis2016international` confirm the information advantage of intraday data at h = 1 that decays with the horizon. Pre-registered H3: Tier B beats Tier A at h = 1 (pooled ratio < 0.9), advantage shrinking at h = 22; the matrix lists Realized GARCH together with HEAVY and HAR as the Tier B contenders. | |
added
model_cards/rm_rw.md
+36 −0
@@ -0,0 +1,36 @@ | ||
| 1 | +# Model card — `rm_rw` (realized-measure random walk) | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `rm_rw` · **family:** realized (Tier B) · **tier:** B · **status:** implemented · **impl:** ols (parameter-free, `src/wp46/models/baselines.py::RMRandomWalk`) | |
| 5 | +- **Label:** Realized-measure random walk · **distributions:** empirical | |
| 6 | +- **Seminal citation:** none (registry `ref: null`); the "last realized variance" benchmark appears in `andersen2003modeling`, `corsi2009simple` and the realized-volatility benchmarks (`liu2015does`, `brini2026forecasting`). | |
| 7 | + | |
| 8 | +## 2. Definition | |
| 9 | +Let $x_t$ be the Tier B input (full-day variance proxy `rv5ss_on` = subsampled 5-min RV + squared overnight return, percent², observed at the close of day t; invalid days imputed by $r_t^2$ in the driver, D-07). Then | |
| 10 | +$$\hat\sigma^2_{t+k|t} = x_t,\qquad k = 1..22 .$$ | |
| 11 | +No mean equation (reported `mu` = mean of the last 250 returns); no innovation law (empirical standardised returns for VaR). | |
| 12 | + | |
| 13 | +## 3. Parameter space and admissibility | |
| 14 | +None. `fit` is a no-op (`loglik = nan`, `converged = True`, `admissible = True`). Requires $x_t > 0$ (driver floors the input at 1e-8). | |
| 15 | + | |
| 16 | +## 4. Nesting and relations | |
| 17 | +Martingale forecast of the realized measure: HAR-RV with $\beta_d = 1$ and all other coefficients zero; HEAVY with $\alpha = 1$, $\omega = \beta = 0$ (return equation). The Tier B floor, analogous to `histvar22`/`ewma094` in Tier A. | |
| 18 | + | |
| 19 | +## 5. Estimation | |
| 20 | +None (`time_s ≈ 0`). `filter` returns $x_{t-1}$ for day t (first value $x_0$). | |
| 21 | + | |
| 22 | +## 6. Forecasting | |
| 23 | +Flat at $x_t$ for all horizons; cumulative $h$-day variance $= h\,x_t$. Method: `direct`. | |
| 24 | + | |
| 25 | +## 7. Implementation | |
| 26 | +- `src/wp46/models/baselines.py::RMRandomWalk` (`needs_rm = True`); input built by `src/wp46/scoring/proxies.py::proxy_series("rv5ss_on")` and imputed in `src/wp46/estimation/rolling.py`. | |
| 27 | +- Cross-check: none needed (identity map). Tests: none dedicated (not in the pilot, not in the integration tests). | |
| 28 | + | |
| 29 | +## 8. Known limitations / failure modes | |
| 30 | +Transmits the full measurement noise of a single day's realized measure; no mean reversion → poor at h = 22; invalid-session imputation by $r_t^2$ (flagged) enters the forecast directly on those days; crypto realized measures are invalid before 2022 (D-06). | |
| 31 | + | |
| 32 | +## 9. Computational footprint | |
| 33 | +Negligible. | |
| 34 | + | |
| 35 | +## 10. Literature expectations | |
| 36 | +`corsi2009simple` and `andersen2003modeling` show that even simple RV-based forecasts beat daily GARCH at h = 1 when intraday data are available; `liu2015does` and `brini2026forecasting` use the random walk as the baseline that all HAR-type models beat. Expectation: better than Tier A models at h = 1 on liquid equities (H3), clearly worse than HAR at h = 5, 22. | |
added
model_cards/stgarch.md
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +# Model card — `stgarch` (smooth-transition GARCH) — UNSUPPORTED, not scored | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `stgarch` · **family:** regime-switching · **tier:** A · **status:** unsupported · **impl:** none · **distributions:** [] (registry note: "not implemented (no vetted library; deferred)") | |
| 5 | +- **Seminal citation:** registry gives `gonzalez1998smooth`, **which is not a key of `paper/references.bib`**; the verified key is `gonzalezrivera1998smooth` (González-Rivera 1998) — see `_discrepancies.md`. Related: `hagerud1997smooth` (ST-ARCH), `haas2004new` (MS-GARCH, the discrete-regime model that is scored). | |
| 6 | + | |
| 7 | +## 2. Definition (literature) | |
| 8 | +$\sigma_t^2 = \omega + \alpha_1\varepsilon_{t-1}^2 + \alpha_2\varepsilon_{t-1}^2\,F(\varepsilon_{t-1}; \gamma, c) + \beta\sigma_{t-1}^2$ with a logistic transition $F(x) = [1 + \exp(-\gamma(x - c))]^{-1}$ (other transition functions exist, e.g. exponential); GJR is the limit γ → ∞, c = 0. | |
| 9 | + | |
| 10 | +## 3–6. Parameter space, estimation, forecasting | |
| 11 | +Not implemented. Multi-step forecasts would need numerical integration or simulation of the transition. | |
| 12 | + | |
| 13 | +## 7. Implementation / why not scored | |
| 14 | +Not in arch 8.0.0 or rugarch 1.5-6; no authoritative cross-check → `unsupported` (D-11), deferred. | |
| 15 | + | |
| 16 | +## 8–9. Limitations / footprint | |
| 17 | +Not applicable. | |
| 18 | + | |
| 19 | +## 10. Literature expectations | |
| 20 | +`gonzalezrivera1998smooth` and `hagerud1997smooth` document smooth asymmetry; the matrix lists several ST forms and no large-scale forecasting benchmark; `msgarch2` covers the regime block in WP46. | |
added
model_cards/sv.md
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +# Model card — `sv` (stochastic volatility) — UNSUPPORTED, not scored | |
| 2 | + | |
| 3 | +## 1. Identity | |
| 4 | +- **model_id:** `sv` · **family:** score-driven (non-GARCH) in the registry grouping · **tier:** A · **status:** unsupported · **impl:** none · **distributions:** [] (registry note: "simulation-based estimation not feasible at the rolling re-estimation cadence of this benchmark; not scored") | |
| 5 | +- **Seminal citation:** `kim1998stochastic` (Kim, Shephard & Chib 1998). Related: `taylor1994modeling`, `taylor2008modelling` (origin), `jacquier1994bayesian` (Bayesian SV), `harvey1994multivariate` (QML via the Kalman filter). | |
| 6 | + | |
| 7 | +## 2. Definition (literature) | |
| 8 | +Log-SV: $r_t = \mu + \exp(h_t/2)\,z_t$, $h_t = \alpha + \phi\,h_{t-1} + \sigma_\eta\,\eta_t$, $(z_t, \eta_t)$ i.i.d. Gaussian (possibly correlated for leverage); the variance is latent, so the likelihood is an integral over the volatility path. | |
| 9 | + | |
| 10 | +## 3–6. Parameter space, estimation, forecasting | |
| 11 | +Not implemented. Estimation requires MCMC/particle filtering or QML on $\log r_t^2$ (`harvey1994multivariate`), and forecasts require filtering the latent state. | |
| 12 | + | |
| 13 | +## 7. Implementation / why not scored | |
| 14 | +Rolling re-estimation every 5 days over ≈ 42 instruments × 3,700 origins makes simulation-based estimation infeasible within the compute budget (registry note, D-11); no version-locked library in the stack. Listed in the matrix as "extension (optional, 'if feasible')". | |
| 15 | + | |
| 16 | +## 8–9. Limitations / footprint | |
| 17 | +Not applicable; compute class "simulation/Bayesian" (brief). | |
| 18 | + | |
| 19 | +## 10. Literature expectations | |
| 20 | +`kim1998stochastic` compare SV with GARCH and find SV competitive in likelihood terms; no cross-asset multi-horizon forecasting benchmark in the matrix. | |
modified
paper/sections/data.tex
+73 −1
@@ -1 +1,73 @@ | ||
| 1 | −% data — generated draft placeholder (to be written after the benchmark) | |
| 1 | +\section{Data, market coverage and realized variance measurement}\label{sec:data} | |
| 2 | + | |
| 3 | +\paragraph{Source and licence.} All prices come from FinData OS, the author's private lakehouse of FirstRate Data | |
| 4 | +one-minute and daily bars, accessed through its documented REST interface (OpenAPI 3.1, \texttt{findata.spboucher.ai/api/v1}). | |
| 5 | +The audit script of the replication package records, for every instrument, the dataset identifiers, the dataset | |
| 6 | +version numbers (snapshots are immutable and versioned on the server), the SHA-256 of every exported file, the row counts and | |
| 7 | +the licence text; the vendor licence permits private research use and the publication of derived statistics but not the | |
| 8 | +redistribution of bars, so the package ships code, manifests, checksums, aggregate forecasts and losses, and a synthetic | |
| 9 | +fixture rather than the raw data (Appendix~\ref{app:provenance}). | |
| 10 | + | |
| 11 | +\paragraph{Universe.} The pre-registered universe (frozen before any test-period loss was computed) holds | |
| 12 | +\NInstruments{} instruments in five classes: fifteen liquid ETFs (SPY, QQQ, IWM, DIA, EEM, EFA, XLF, XLE, TLT, IEF, HYG, LQD, | |
| 13 | +GLD, SLV, USO), ten large-capitalization stocks (AAPL, MSFT, AMZN, NVDA, JPM, XOM, JNJ, PG, KO, WMT), nine continuous | |
| 14 | +futures (ES, NQ, CL, NG, GC, SI, HG, ZN, ZC), six spot exchange rates (EURUSD, USDJPY, GBPUSD, AUDUSD, USDCAD, USDCHF) | |
| 15 | +and two cryptocurrencies (BTC, ETH). Daily histories start in 2000 (ETFs and stocks, except later listings), | |
| 16 | +2008 (futures), 2010 (FX), 2013 (BTC) and 2016 (ETH) and end on 2026-10-30 (Figure~\ref{fig:coverage}). All instruments are | |
| 17 | +alive at the end of the sample: the universe therefore describes liquid, surviving benchmarks, a selection we disclose rather | |
| 18 | +than correct, since the question is about model comparison on exactly such series rather than about the cross-section. | |
| 19 | + | |
| 20 | +\paragraph{Sessions and calendars.} Vendor timestamps are bar-open times in UTC. We define, per asset class, the session | |
| 21 | +window over which both the daily return and the realized measures are computed: for ETFs and stocks the XNYS trading day | |
| 22 | +09:30--16:00 ET including the closing print, with official early closes (13:00 ET) taken from the exchange calendar and the | |
| 23 | +overnight segment from the previous close to the open; for futures the CME trading day from 18:00 ET of the previous | |
| 24 | +calendar day to 17:00 ET, with the 17:00--18:00 maintenance break treated as the ``overnight'' segment; for FX the | |
| 25 | +17:00--17:00 ET New York day, and for crypto the UTC calendar day. This matters because the vendor's own session date for | |
| 26 | +futures and FX is an ET calendar day, which would split the overnight part of a trading day across two dates; the audit shows | |
| 27 | +1{,}380 (ES), 1{,}440 (EURUSD) and 1{,}440 (BTC) one-minute bars on a full session and 391 for SPY in regular hours. | |
| 28 | +Zero-volume minutes are absent from the source and are never filled. | |
| 29 | + | |
| 30 | +\paragraph{Returns.} Daily returns are $r_t=100\log(C_t/C_{t-1})$ in percent. For ETFs and stocks, $C_t$ is the vendor's | |
| 31 | +split- and dividend-adjusted daily close (a price-return series with dividends reinvested at the ex-date, verified on the | |
| 32 | +AAPL 4:1 split of 2020-08-31 and the SPY ex-dividend date of 2024-03-15), and the overnight return $r^{on}_t=100\log(O_t/C_{t-1})$ | |
| 33 | +uses the same series. For futures the continuous series is the vendor's ratio-back-adjusted splice, whose log returns are | |
| 34 | +free of roll jumps by construction (the ratio between adjusted and unadjusted closes is piecewise constant across the | |
| 35 | +March~2024 ES roll in the audit); the roll dates themselves are fixed by the vendor and not documented per contract, so | |
| 36 | +realized measures on roll days span two contracts, a limitation we note. FX and crypto returns are built from the last | |
| 37 | +one-minute bar of each session; FX bars are mid quotes aggregated from four money-center banks, and crypto bars are an | |
| 38 | +exchange aggregate. | |
| 39 | + | |
| 40 | +\paragraph{Realized measures.} Within each session we compute, from one-minute closes, the one-minute realized variance, | |
| 41 | +the five-minute calendar-time realized variance (previous-tick sampling on a grid anchored at the window start), its | |
| 42 | +subsampled version averaged over the five one-minute grid offsets \citep{zhang2005tale}, bipower variation | |
| 43 | +\citep{barndorff2004power}, realized semivariances \citep{barndorff2010measuring} and the median realized variance, all in | |
| 44 | +percent$^2$. A session is \emph{valid} for realized measures when it contains at least 60\% of the instrument's modal | |
| 45 | +number of one-minute bars (391 or 211 for equities by calendar; the modal count for the other classes, which ranges from | |
| 46 | +780 for corn futures to 1{,}440 for FX and crypto). The overnight component is kept separate and added back when the model | |
| 47 | +target is the close-to-close variance: the primary proxy is | |
| 48 | +$y_t=\RV^{5m,ss}_t+(r^{on}_t)^2$, so that intraday realized variance is never presented as a measure of the full-day | |
| 49 | +variance \citep{hansen2005realized}. Over valid sessions, the ratio of the mean primary proxy to the mean squared daily | |
| 50 | +return lies between 0.93 and 1.17 for every ETF, stock, futures and FX instrument---the signature of an approximately | |
| 51 | +unbiased full-day proxy. Cryptocurrencies are the exception: the vendor's one-minute aggregate exhibits severe cross-venue | |
| 52 | +bounce before 2022 (the one-minute realized variance of BTC exceeds the squared daily return by one to two orders of | |
| 53 | +magnitude in 2013--2019 and by a factor of 1.3--3 in 2020--2021), so crypto realized measures are declared invalid before | |
| 54 | +2022-01-01 and crypto forecasts are scored on 2022--2026 only; this decision was taken on the audit, before the protocol | |
| 55 | +freeze. Secondary proxies for sensitivity analysis are the five-minute, one-minute, bipower and median variants with the | |
| 56 | +overnight term, the squared daily return, and the whole-day scaling of \citet{hansen2005realized} with a scaling constant | |
| 57 | +estimated on the estimation window at each origin. | |
| 58 | + | |
| 59 | +\paragraph{Regime variables.} Regimes are defined without look-ahead: terciles of the 22-day trailing realized variance of | |
| 60 | +each instrument at the forecast origin, with thresholds fixed on the validation period; the sign of the previous day's | |
| 61 | +return; and three calendar episodes fixed in the protocol (COVID, 2020-02-20 to 2020-06-30; the 2022 rate shock; the April--May | |
| 62 | +2025 tariff shock). The VIX is retained for descriptive purposes only. | |
| 63 | + | |
| 64 | +\begin{figure}[tp]\centering | |
| 65 | +\includegraphics[width=\textwidth]{figures/fig_coverage.pdf} | |
| 66 | +\caption{Sample coverage of the 42 instruments (daily panels). The number at the right of each bar is the share of sessions | |
| 67 | +with valid realized measures. Dashed lines mark the start of the validation (2012) and test (2016) periods.}\label{fig:coverage} | |
| 68 | +\end{figure} | |
| 69 | +\begin{figure}[tp]\centering | |
| 70 | +\includegraphics[width=\textwidth]{figures/fig_volseries.pdf} | |
| 71 | +\caption{Twenty-two-day moving averages of annualized full-day realized volatility for one instrument per class | |
| 72 | +(SPY, CL, EURUSD, BTC). Shaded bands are the pre-registered calendar episodes.}\label{fig:volseries} | |
| 73 | +\end{figure} | |
modified
paper/sections/design.tex
+75 −1
@@ -1 +1,75 @@ | ||
| 1 | −% design — generated draft placeholder (to be written after the benchmark) | |
| 1 | +\section{Experimental design, estimation, forecasting and inference}\label{sec:design} | |
| 2 | + | |
| 3 | +\paragraph{Pre-registration.} The protocol---universe, periods, model registry, estimation scheme, losses, proxies, | |
| 4 | +bootstrap settings, regime definitions and hypotheses---was written after the data audit and a validation-period pilot and | |
| 5 | +frozen in the repository (git tag \texttt{prereg-frozen}) before any loss on the test period was computed. Everything not in | |
| 6 | +the protocol is labelled exploratory. The protocol lists six hypotheses: H1, asymmetric models beat GARCH(1,1) at $h=1$ on | |
| 7 | +equities; H2, non-Gaussian innovations leave variance-forecast rankings materially unchanged but improve 1\% VaR coverage; | |
| 8 | +H3, realized-measure models beat the best daily model at $h=1$ with an advantage that shrinks with the horizon; H4, | |
| 9 | +long-memory, component and regime models help, if at all, only at $h=22$; H5, complex models fail more often and cost more, | |
| 10 | +which reduces their advantage on the failure-adjusted sample; H6, rankings differ across trailing-volatility terciles. Each | |
| 11 | +is tied to the primary loss, proxy and sample, with ``materially'' defined as a pooled loss ratio outside $1\pm0.02$. | |
| 12 | + | |
| 13 | +\paragraph{Information tiers.} Tier~A models use daily returns only. Tier~B models additionally use the lagged primary | |
| 14 | +realized proxy $y_{t-1}$, observed at the close of day $t-1$; they are compared with the Tier~A models on the same origins but | |
| 15 | +always with the information-set difference stated, and the realized random walk, HAR and log-HAR provide strong | |
| 16 | +realized-only baselines. Tier~C models forecast one-step covariance matrices of two ETF baskets (SPY, QQQ, IWM, DIA; and | |
| 17 | +SPY, TLT, GLD, USO, EEM) and are scored on their own. | |
| 18 | + | |
| 19 | +\paragraph{Rolling scheme.} For every instrument and specification, parameters are estimated on a rolling window of the | |
| 20 | +last 1{,}000 trading days ending at the origin $t$ and re-estimated every five trading days; between re-estimations the | |
| 21 | +conditional variance is filtered daily with the last estimated parameters, so that the forecast at every origin uses | |
| 22 | +$\F_t$ and nothing later. Expanding windows, a 2{,}000-day window and a 22-day re-estimation cadence are robustness | |
| 23 | +variants. At each origin the model produces per-step variance forecasts $\sigma^2_{t+k|t}$, $k=1,\dots,22$, by its own exact | |
| 24 | +conditional-expectation recursion where one exists (GARCH, GJR with $\kappa$, NAGARCH, QGARCH, CGARCH, IGARCH, GAS, | |
| 25 | +HEAVY, GARCH-X, FIGARCH, MS-GARCH) or by simulation with 2{,}000 paths and a fixed seed otherwise (EGARCH, APARCH, TGARCH, | |
| 26 | +AVGARCH, Realized GARCH); HAR forecasts are direct projections. The cumulative forecast $\sum_{k=1}^h\sigma^2_{t+k|t}$ is | |
| 27 | +matched to the cumulative proxy $\sum_{k=1}^hy_{t+k}$ for $h\in\{1,5,22\}$, so that forecasts and targets share units | |
| 28 | +(percent$^2$) and horizon. The validation period 2012-01-03 to 2015-12-31 served for design checks only; all confirmatory | |
| 29 | +results use the test period 2016-01-04 to 2026-10-30, which instruments enter when their window allows. | |
| 30 | + | |
| 31 | +\paragraph{Estimation and failures.} Models in the arch package \citep{sheppard2025arch} are estimated by its | |
| 32 | +quasi-maximum-likelihood routines; the custom models maximize their exact likelihoods with L-BFGS-B on smooth | |
| 33 | +reparameterizations that enforce the admissibility domain (persistence as a logistic share, positivity by exponentials), three | |
| 34 | +starting values and a Nelder--Mead polish, with the initial variance set by the same exponentially weighted backcast as the | |
| 35 | +arch package so that likelihoods are comparable. A re-estimation that raises or fails to converge is logged as a failure; | |
| 36 | +the specification then keeps its last successful parameter vector (flagged) if one exists and produces no forecast otherwise. | |
| 37 | +A converged estimate outside the admissibility region (for instance $\alpha+\beta\ge1$) is kept and flagged. No forecast is | |
| 38 | +ever replaced by another model's. We record, per re-estimation, wall time, iterations, restarts and status, and per job the | |
| 39 | +CPU time and peak memory, which feed the complexity--accuracy--robustness analysis of Section~\ref{sec:frontier}. | |
| 40 | + | |
| 41 | +\paragraph{Verification.} Every implementation passes unit tests of the recursion, likelihood, admissibility, multi-step | |
| 42 | +forecasts and absence of look-ahead (perturbing post-origin data leaves all forecasts of a job unchanged), seeded Monte Carlo | |
| 43 | +recovery tests, and a cross-check against \texttt{rugarch} 1.5-6 \citep{galanos2011rugarch} on a shared synthetic fixture: | |
| 44 | +the custom GARCH(1,1) reproduces the arch recursion to $10^{-9}$ and its analytic forecasts to machine precision, and every | |
| 45 | +scored architecture available in both packages attains a log-likelihood within 0.3 of the \texttt{rugarch} optimum (FIGARCH: | |
| 46 | +arch is 1.47 below, a documented truncation difference). Appendix~\ref{app:verification} reports the details. | |
| 47 | + | |
| 48 | +\paragraph{Losses and samples.} The primary loss is QLIKE, | |
| 49 | +$\QLIKE(y,h)=y/h-\log(y/h)-1$ for $y,h>0$, computed in the zero-safe form $\log h+y/h-(\log y+1)$ which coincides with QLIKE | |
| 50 | +on the support and remains finite when $y=0$ \citep{patton2011volatility}; forecasts are floored at $10^{-8}$ before any | |
| 51 | +logarithm. MSE, MAE and the mean squared error on the standard-deviation scale are secondary losses, the latter reported only | |
| 52 | +as a sensitivity because it is not robust to proxy noise. For each instrument and horizon we report three samples: the | |
| 53 | +\emph{pairwise} sample of origins on which both the specification and the GARCH(1,1)-normal benchmark have valid forecasts | |
| 54 | +and the target is valid (used for loss ratios and Diebold--Mariano tests); the \emph{common-success} sample on which every | |
| 55 | +specification of the tier with at least 90\% coverage has a valid forecast (used for the model confidence set and the SPA | |
| 56 | +test); and each model's \emph{own} sample with its coverage rate (the operational view). | |
| 57 | + | |
| 58 | +\paragraph{Inference.} Pairwise tests are Diebold--Mariano statistics with Newey--West variances (Bartlett kernel, bandwidth | |
| 59 | +$h-1+\lfloor4(n/100)^{2/9}\rfloor$) and the Harvey--Leybourne--Newbold correction. Within each instrument, horizon and tier we | |
| 60 | +compute the 90\% model confidence set of \citet{hansen2011model} with the range statistic and a stationary bootstrap of | |
| 61 | +expected block length 22 days and 2{,}000 replications, and the SPA test of \citet{hansen2005test} with GARCH(1,1) as the | |
| 62 | +benchmark. Across instruments we report, for each specification and horizon, the equally weighted mean of instrument-level | |
| 63 | +loss ratios together with a stationary block bootstrap over dates that resamples all instruments jointly---so that | |
| 64 | +cross-sectional dependence is preserved---and the number of instruments on which the specification significantly beats or | |
| 65 | +loses to the benchmark after a Holm adjustment across the 42 instruments. Statistical significance is reported next to the | |
| 66 | +economic threshold of the protocol: a pooled ratio within $1\pm0.02$ is ``no material difference'' whatever its $p$-value. | |
| 67 | + | |
| 68 | +\paragraph{Tail risk and covariance.} One-day 1\% and 5\% VaR and expected shortfall are formed from each model's own | |
| 69 | +innovation law (empirical standardized residual quantiles of the estimation window for distribution-free models) and | |
| 70 | +backtested with the unconditional coverage test of \citet{kupiec1995techniques}, the conditional coverage test of | |
| 71 | +\citet{christoffersen1998evaluating}, the dynamic quantile test of \citet{engle2004caviar} with four lags and the joint | |
| 72 | +VaR--ES scoring function FZ0 of \citet{fissler2016higher} in the parameterization of \citet{patton2019dynamic}. Covariance | |
| 73 | +forecasts are scored against the five-minute realized covariance plus the overnight outer product with the Frobenius loss, the | |
| 74 | +multivariate QLIKE of \citet{laurent2013loss} and the QLIKE of the equally weighted portfolio variance, after verifying | |
| 75 | +positive definiteness. | |
modified
paper/sections/literature.tex
+85 −1
@@ -1 +1,85 @@ | ||
| 1 | −% literature — generated draft placeholder (to be written after the benchmark) | |
| 1 | +\section{Related literature}\label{sec:literature} | |
| 2 | + | |
| 3 | +\paragraph{From ARCH to the GARCH family.} | |
| 4 | +Conditional heteroskedasticity entered econometrics with \citet{engle1982autoregressive}, whose ARCH($q$) model lets the | |
| 5 | +conditional variance of a return be a linear function of $q$ lagged squared innovations. \citet{bollerslev1986generalized} | |
| 6 | +added lagged conditional variances, producing the GARCH($p,q$) recursion whose (1,1) member has since become the | |
| 7 | +reference specification of the field. The decade that followed produced most of the architectures benchmarked here: | |
| 8 | +the integrated GARCH of \citet{engle1986modelling}, the in-mean specification of \citet{engle1987estimating}, the | |
| 9 | +exponential GARCH of \citet{nelson1991conditional}, the threshold models of \citet{glosten1993relation} and | |
| 10 | +\citet{zakoian1994threshold}---which differ in whether the asymmetry acts on the variance or on the standard deviation---the | |
| 11 | +power ARCH of \citet{ding1993long} that nests the absolute-value models of \citet{taylor2008modelling} and | |
| 12 | +\citet{schwert1989why}, the nonlinear asymmetric GARCH of \citet{engle1993measuring} (building on \citealp{higgins1992class}), | |
| 13 | +the quadratic GARCH of \citet{sentana1995quadratic}, and the fractionally integrated GARCH of | |
| 14 | +\citet{baillie1996fractionally}, later extended to the exponential and power families by \citet{bollerslev1996modeling} and | |
| 15 | +\citet{tse1998conditional}, and generalized by \citet{davidson2004moment}. \citet{engle1999long} decomposed the conditional | |
| 16 | +variance into permanent and transitory components; Markov-switching variants were proposed by \citet{hamilton1994autoregressive}, | |
| 17 | +\citet{cai1994markov}, \citet{gray1996modeling} and \citet{klaassen2002improving}, and given a tractable form with | |
| 18 | +regime-specific recursions by \citet{haas2004new}, whose specification is the one estimated by the \texttt{MSGARCH} | |
| 19 | +package of \citet{ardia2019markov}. Smooth-transition \citep{gonzalezrivera1998smooth,hagerud1997smooth} and mixed-frequency | |
| 20 | +\citep{engle2013stock} extensions complete the taxonomy of Section~\ref{sec:taxonomy}. Surveys by | |
| 21 | +\citet{bollerslev1992arch}, \citet{bollerslev1994arch}, \citet{terasvirta2009introduction}, \citet{bollerslev2010glossary} and | |
| 22 | +the monograph of \citet{francq2019garch} document the nomenclature inconsistencies that the model cards of this paper | |
| 23 | +resolve explicitly. | |
| 24 | + | |
| 25 | +\paragraph{Innovation laws and estimation.} | |
| 26 | +Fat-tailed and skewed standardized innovations were introduced by \citet{bollerslev1987conditionally} (Student-$t$), | |
| 27 | +\citet{nelson1991conditional} (generalized error distribution) and \citet{hansen1994autoregressive} | |
| 28 | +(skewed Student-$t$; see also \citealp{fernandez1998bayesian}). Quasi-maximum-likelihood theory for GARCH is due to | |
| 29 | +\citet{bollerslev1992quasi}, \citet{lee1994asymptotic}, \citet{lumsdaine1996consistency}, \citet{jensen2004asymptotic}, | |
| 30 | +\citet{francq2004maximum} and \citet{straumann2006quasi}; strict and weak stationarity conditions to | |
| 31 | +\citet{nelson1990stationarity} and \citet{bougerol1992stationarity}; moment conditions to \citet{he1999properties} and | |
| 32 | +\citet{ling2002stationarity}; positivity constraints to \citet{nelson1992inequality} and, for FIGARCH, to | |
| 33 | +\citet{conrad2006inequality}. The score-driven models of \citet{creal2013generalized} and \citet{harvey2013dynamic} | |
| 34 | +provide a non-GARCH observation-driven alternative in which the variance is updated by the scaled score of the | |
| 35 | +conditional density; stochastic-volatility models \citep{taylor1994modeling,kim1998stochastic,jacquier1994bayesian} | |
| 36 | +are the parameter-driven counterpart. | |
| 37 | + | |
| 38 | +\paragraph{Realized measures and realized-measure models.} | |
| 39 | +High-frequency data turned the latent variance into something that can be measured with error rather than only | |
| 40 | +forecast: \citet{andersen1998answering} showed that realized variance makes GARCH forecasts look far better than | |
| 41 | +squared returns suggest, and \citet{andersen2001distribution,andersen2003modeling} and \citet{barndorff2002econometric} | |
| 42 | +established the asymptotics of realized variance. Microstructure noise \citep{hansen2006realized,zhang2005tale, | |
| 43 | +aitsahalia2005how}, jumps \citep{barndorff2004power,andersen2007roughing}, kernels \citep{barndorff2008designing} and | |
| 44 | +semivariances \citep{barndorff2010measuring} refined the measurement; \citet{liu2015does} found that five-minute | |
| 45 | +realized variance is hard to beat across 400 estimators and 31 assets, and \citet{hansen2005realized} proposed the | |
| 46 | +whole-day scaling we use as a sensitivity proxy. On the modelling side, the HAR model of \citet{corsi2009simple} | |
| 47 | +(with the extensions of \citealp{andersen2007roughing,patton2015good,bollerslev2016exploiting}), the GARCH-X of | |
| 48 | +\citet{engle2002new}, the multiplicative error model of \citet{engle2006multiple}, the HEAVY model of | |
| 49 | +\citet{shephard2010realising} and the Realized GARCH of \citet{hansen2012realized} (exponential form in | |
| 50 | +\citealp{hansen2016exponential}; multivariate HEAVY in \citealp{noureldin2012multivariate}) constitute the realized tier | |
| 51 | +of this benchmark. Multivariate conditional covariance models---CCC \citep{bollerslev1990modelling}, BEKK | |
| 52 | +\citep{engle1995multivariate}, DCC \citep{engle2002dynamic,engle2001theoretical,aielli2013dynamic}, asymmetric DCC | |
| 53 | +\citep{cappiello2006asymmetric}, GO-GARCH \citep{vanderweide2002gogarch}; surveys in \citealp{bauwens2006multivariate, | |
| 54 | +silvennoinen2009multivariate}---are evaluated with the consistent matrix losses of \citet{laurent2013loss} and | |
| 55 | +\citet{patton2009evaluating}. | |
| 56 | + | |
| 57 | +\paragraph{Forecast evaluation and inference.} | |
| 58 | +The evaluation toolkit is standard but its assembly matters. \citet{patton2011volatility} characterizes the loss | |
| 59 | +functions that rank variance forecasts consistently when only a noisy proxy of the latent variance is observed: the | |
| 60 | +MSE and QLIKE families, of which QLIKE is the most robust to proxy noise. Pairwise comparisons use | |
| 61 | +\citet{diebold1995comparing} with the small-sample adjustment of \citet{harvey1997testing} and HAC variances | |
| 62 | +\citep{newey1987simple,newey1994automatic}; see \citet{diebold2015comparing} and \citet{giacomini2006tests} for the | |
| 63 | +conditional-ability interpretation that justifies rolling-window comparisons of possibly misspecified models | |
| 64 | +\citep{patton2020comparing}. Multiple comparisons are handled with the reality check of \citet{white2000reality}, the | |
| 65 | +superior predictive ability test of \citet{hansen2005test} and the model confidence set of | |
| 66 | +\citet{hansen2011model}, all implemented with the stationary bootstrap of \citet{politis1994stationary}. Tail-risk | |
| 67 | +forecasts are backtested with \citet{kupiec1995techniques}, \citet{christoffersen1998evaluating}, | |
| 68 | +\citet{engle2004caviar} and the joint VaR--ES scoring functions of \citet{fissler2016higher} and | |
| 69 | +\citet{patton2019dynamic}; \citet{nolde2017elicitability} and \citet{bayer2022regression} discuss comparative versus | |
| 70 | +absolute backtesting. | |
| 71 | + | |
| 72 | +\paragraph{Large-scale comparisons.} | |
| 73 | +The closest antecedent is \citet{hansen2005forecast}, who compared 330 ARCH-type specifications on two series and found | |
| 74 | +nothing that beat GARCH(1,1) on exchange rates while asymmetric models dominated on IBM. \citet{marcucci2005forecasting}, | |
| 75 | +\citet{awartani2005predicting}, \citet{brownlees2011practical}, \citet{kourtis2016international} and | |
| 76 | +\citet{ardia2018forecasting} extended the comparison to regime switching, asymmetry, multiple horizons and hundreds of | |
| 77 | +assets, but each within a single information tier and without accounting for estimation failures or compute. The recent | |
| 78 | +realized-volatility benchmarks \citep{lyocsa2021stock,christensen2023machine,zhang2024volatility,branco2024forecasting, | |
| 79 | +rahimikia2024machine,brini2026forecasting} compare HAR-type and machine-learning forecasters on realized variance at | |
| 80 | +horizons of 1, 5 and 22 days with QLIKE and the MCS, but treat the GARCH family as, at most, a single baseline. Our search | |
| 81 | +(cut-off 2026-11-09, Appendix~\ref{app:provenance}) found no peer-reviewed revisit of the ``does anything beat GARCH(1,1)'' | |
| 82 | +question on a cross-asset universe with a pre-registered design; the contribution of this paper is therefore the | |
| 83 | +combination---a definition-faithful GARCH taxonomy, realized and multivariate tiers scored separately, failure and compute | |
| 84 | +accounting, and a frozen protocol---rather than any single element, several of which (asymmetry on equities, the value of | |
| 85 | +intraday information, regime dependence of rankings) are established results that we can only quantify more systematically. | |
modified
paper/sections/taxonomy.tex
+79 −1
@@ -1 +1,79 @@ | ||
| 1 | −% taxonomy — generated draft placeholder (to be written after the benchmark) | |
| 1 | +\section{A unified taxonomy and mathematical framework}\label{sec:taxonomy} | |
| 2 | + | |
| 3 | +Throughout, $r_t$ is the daily log return in percent, $\F_{t}$ the information set at the close of day $t$, | |
| 4 | +$r_t=\mu+\varepsilon_t$ with $\varepsilon_t=\sigma_t z_t$, $z_t\,|\,\F_{t-1}\sim D(0,1;\bm\eta)$ a standardized | |
| 5 | +innovation with distribution parameters $\bm\eta$, and $\sigma_t^2=\Var(r_t\,|\,\F_{t-1})$ in percent$^2$. Every model | |
| 6 | +below specifies $\sigma_t^2$ as a function of $\F_{t-1}$; a \emph{specification} is an architecture combined with an | |
| 7 | +innovation law and an order. Table~\ref{tab:taxonomy} lists the architectures with their defining recursion, admissibility | |
| 8 | +conditions and the multi-step rule actually implemented; Appendix~\ref{app:formulas} and the model cards in the | |
| 9 | +replication package give the complete parameter spaces and the reparameterizations used by the optimizer. | |
| 10 | + | |
| 11 | +\paragraph{Classical.} ARCH($q$) \citep{engle1982autoregressive}: $\sigma_t^2=\omega+\sum_{i=1}^q\alpha_i\varepsilon_{t-i}^2$. | |
| 12 | +GARCH($p,q$) \citep{bollerslev1986generalized}: $\sigma_t^2=\omega+\sum_{i=1}^p\alpha_i\varepsilon_{t-i}^2+\sum_{j=1}^q\beta_j\sigma_{t-j}^2$, | |
| 13 | +with $\omega>0$, $\alpha_i,\beta_j\ge0$ and covariance stationarity iff $\sum\alpha_i+\sum\beta_j<1$. IGARCH imposes | |
| 14 | +$\sum\alpha_i+\sum\beta_j=1$ \citep{engle1986modelling}: it is strictly but not covariance stationary | |
| 15 | +\citep{nelson1990stationarity}, and its $k$-step forecasts grow linearly, $\sigma_{t+k|t}^2=\omega+\sigma_{t+k-1|t}^2$. | |
| 16 | +GARCH-M \citep{engle1987estimating} adds $\delta\sigma_t^2$ to the conditional mean; its variance forecasts coincide with | |
| 17 | +those of GARCH(1,1). The constant-variance model, the exponentially weighted moving average with $\lambda=0.94$ | |
| 18 | +\citep{jpmorgan1996riskmetrics}---an IGARCH(1,1) with $\omega=0$---the RiskMetrics~2006 multi-horizon filter | |
| 19 | +\citep{zumbach2009riskmetrics} and rolling historical variances over 22, 66 and 252 days are the baselines. | |
| 20 | + | |
| 21 | +\paragraph{Asymmetric and power.} The GJR model \citep{glosten1993relation} adds $\gamma\varepsilon_{t-1}^2\ind{\varepsilon_{t-1}<0}$ to | |
| 22 | +GARCH(1,1); its multi-step recursion uses $\kappa=\E[z^2\ind{z<0}]$, which equals $1/2$ for symmetric laws and is computed | |
| 23 | +numerically for the skewed Student-$t$, so that $\sigma_{t+k|t}^2=\omega+(\alpha+\gamma\kappa+\beta)\sigma_{t+k-1|t}^2$. What | |
| 24 | +several software packages call ``TGARCH'' is the \citet{zakoian1994threshold} model, in which the threshold acts on the | |
| 25 | +conditional \emph{standard deviation}: $\sigma_t=\omega+\alpha^{+}\varepsilon_{t-1}^{+}-\alpha^{-}\varepsilon_{t-1}^{-}+\beta\sigma_{t-1}$; | |
| 26 | +we keep both and never equate them. EGARCH \citep{nelson1991conditional} models $\log\sigma_t^2=\omega+\alpha(|z_{t-1}|-\E|z|)+\gamma z_{t-1}+\beta\log\sigma_{t-1}^2$, | |
| 27 | +which needs no positivity constraints and is stationary iff $|\beta|<1$. The nonlinear asymmetric GARCH of | |
| 28 | +\citet{engle1993measuring}, $\sigma_t^2=\omega+\alpha(\varepsilon_{t-1}-\theta\sigma_{t-1})^2+\beta\sigma_{t-1}^2$, has persistence | |
| 29 | +$\alpha(1+\theta^2)+\beta$; the quadratic GARCH of \citet{sentana1995quadratic} adds a linear term | |
| 30 | +$\gamma\varepsilon_{t-1}$ whose positivity requires $\gamma^2<4\alpha\omega$. APARCH \citep{ding1993long}, | |
| 31 | +$\sigma_t^{\delta}=\omega+\alpha(|\varepsilon_{t-1}|-\gamma\varepsilon_{t-1})^{\delta}+\beta\sigma_{t-1}^{\delta}$, nests the absolute-value | |
| 32 | +GARCH ($\delta=1,\gamma=0$) of \citet{taylor2008modelling} and \citet{schwert1989why}; for $\delta\neq2$ the conditional | |
| 33 | +expectation of $\sigma_{t+k}^2$ has no closed form and we use simulation (2{,}000 paths, fixed seed), as for EGARCH and TGARCH. | |
| 34 | + | |
| 35 | +\paragraph{Fractional persistence.} FIGARCH($1,d,1$) \citep{baillie1996fractionally} writes | |
| 36 | +$\sigma_t^2=\omega+\{1-\beta L-(1-\phi L)(1-L)^d\}\varepsilon_t^2+\beta\sigma_{t-1}^2$, with hyperbolically decaying weights | |
| 37 | +truncated at 1{,}000 lags in the implementation; the sufficient positivity conditions of \citet{conrad2006inequality} | |
| 38 | +and the arch package's constraints are not identical to those of \texttt{rugarch}, which explains a log-likelihood gap of | |
| 39 | +1.5 units on the shared verification fixture (Appendix~\ref{app:verification}). FIEGARCH, FIAPARCH and HYGARCH have no | |
| 40 | +vetted implementation in the version-locked libraries and are inventoried but not scored. | |
| 41 | + | |
| 42 | +\paragraph{Components and regimes.} The component model of \citet{engle1999long} decomposes | |
| 43 | +$\sigma_t^2=q_t+\alpha(\varepsilon_{t-1}^2-q_{t-1})+\beta(\sigma_{t-1}^2-q_{t-1})$ with a slowly mean-reverting trend | |
| 44 | +$q_t=\omega+\rho q_{t-1}+\phi(\varepsilon_{t-1}^2-\sigma_{t-1}^2)$, $0<\alpha+\beta<\rho<1$, $0<\phi<\min(\alpha,\beta)$. The | |
| 45 | +Markov-switching GARCH of \citet{haas2004new} runs one GARCH(1,1) recursion per regime $k\in\{1,2\}$, driven by the common | |
| 46 | +innovation and mixed with the filtered regime probabilities of a two-state chain $(p_{11},p_{22})$; regimes are | |
| 47 | +identified by ordering their unconditional variances, the likelihood is evaluated with the Hamilton filter, and the | |
| 48 | +$k$-step forecast uses the exact recursion $\E[\sigma_{k,t+j+1}^2\,|\,\F_t]=\omega_k+\alpha_k\E[\varepsilon_{t+j}^2\,|\,\F_t]+\beta_k\E[\sigma_{k,t+j}^2\,|\,\F_t]$ | |
| 49 | +with $\E[\varepsilon_{t+j}^2\,|\,\F_t]=\sum_k\Prob(S_{t+j}=k\,|\,\F_t)\E[\sigma_{k,t+j}^2\,|\,\F_t]$. | |
| 50 | + | |
| 51 | +\paragraph{Score-driven comparator.} The GAS model with Student-$t$ innovations and inverse-information scaling | |
| 52 | +\citep{creal2013generalized,harvey2013dynamic} updates $f_t=\sigma_t^2$ by | |
| 53 | +$f_{t}=\omega+\alpha s_{t-1}+\beta f_{t-1}$, $s_t=\tfrac{\nu+3}{\nu}\big[\tfrac{(\nu+1)f_t\varepsilon_t^2}{(\nu-2)f_t+\varepsilon_t^2}-f_t\big]$, | |
| 54 | +which reduces to GARCH(1,1) as $\nu\to\infty$ and otherwise bounds the impact of outliers; it is labelled a non-GARCH | |
| 55 | +comparator. | |
| 56 | + | |
| 57 | +\paragraph{Realized-measure tier.} With $x_t$ the realized measure of day $t$ observed at its close, the | |
| 58 | +realized tier uses $x_{t-1}\in\F_{t-1}$. HAR \citep{corsi2009simple} projects the $h$-day average of the target proxy on | |
| 59 | +$(1,x_t,\bar x_t^{(5)},\bar x_t^{(22)})$ by least squares, one direct regression per horizon (in levels and, with Duan's | |
| 60 | +smearing correction, in logs). GARCH-X \citep{engle2002new} adds $\gamma x_{t-1}$ to GARCH(1,1). HEAVY | |
| 61 | +\citep{shephard2010realising} replaces the squared return by the realized measure in the return equation, | |
| 62 | +$h_t=\omega+\alpha x_{t-1}+\beta h_{t-1}$, and adds a measurement equation $\mu_t=\omega_R+\alpha_Rx_{t-1}+\beta_R\mu_{t-1}$ for | |
| 63 | +$\E[x_t\,|\,\F_{t-1}]$, estimated by the multiplicative-error quasi-likelihood $-\sum(\log\mu_t+x_t/\mu_t)$ | |
| 64 | +\citep{engle2006multiple}; multi-step forecasts follow from the two linear recursions. Realized GARCH | |
| 65 | +\citep{hansen2012realized}, in its log-linear form, couples $\log\sigma_t^2=\omega+\beta\log\sigma_{t-1}^2+\gamma\log x_{t-1}$ | |
| 66 | +with $\log x_t=\xi+\varphi\log\sigma_t^2+\tau_1z_t+\tau_2(z_t^2-1)+u_t$, $u_t\sim N(0,\sigma_u^2)$, estimated jointly; | |
| 67 | +stationarity requires $|\beta+\varphi\gamma|<1$ and multi-step forecasts are simulated. | |
| 68 | + | |
| 69 | +\paragraph{Multivariate tier.} For a basket of $N$ daily returns, the covariance models are the rolling sample covariance, | |
| 70 | +the EWMA covariance, CCC \citep{bollerslev1990modelling}, DCC \citep{engle2002dynamic} with correlation targeting, | |
| 71 | +asymmetric DCC \citep{cappiello2006asymmetric} and the scalar BEKK \citep{engle1995multivariate} with covariance targeting; | |
| 72 | +all produce symmetric positive-definite one-step forecasts by construction and are scored against the realized covariance | |
| 73 | +with the matrix losses of Section~\ref{sec:design}. | |
| 74 | + | |
| 75 | +\begin{table}[tp]\centering\footnotesize | |
| 76 | +\caption{Architectures in the registry. ``Implementation'' is the version-locked library (arch 8.0.0) or the validated custom | |
| 77 | +code of the replication package; ``multi-step'' is the rule used for $h>1$.}\label{tab:taxonomy} | |
| 78 | +\input{tables/tab_taxonomy} | |
| 79 | +\end{table} | |
added
paper/tables/tab_taxonomy.tex
+33 −0
@@ -0,0 +1,33 @@ | ||
| 1 | +\begin{tabular}{llllll} | |
| 2 | +\toprule | |
| 3 | +Architecture & Family & Seminal reference & Innovations & Implementation & Multi-step \\ | |
| 4 | +\midrule | |
| 5 | +Constant, hist.\ 22/66/252, EWMA, RM2006 & baseline & \citet{jpmorgan1996riskmetrics,zumbach2009riskmetrics} & N / empirical & arch / ols & flat / analytic \\ | |
| 6 | +ARCH(5) & classical & \citet{engle1982autoregressive} & N, $t$, GED, skt & arch & analytic \\ | |
| 7 | +GARCH(1,1), (2,1), (1,2) & classical & \citet{bollerslev1986generalized} & N, $t$, GED, skt & arch & analytic \\ | |
| 8 | +IGARCH(1,1) & classical & \citet{engle1986modelling} & N, $t$, GED, skt & custom & analytic \\ | |
| 9 | +GARCH-M(1,1) & classical & \citet{engle1987estimating} & N, $t$, GED, skt & custom & analytic \\ | |
| 10 | +GJR(1,1) & asymmetric & \citet{glosten1993relation} & N, $t$, GED, skt & arch & analytic ($\kappa$) \\ | |
| 11 | +TGARCH(1,1) (Zakoïan) & asymmetric & \citet{zakoian1994threshold} & N, $t$, GED, skt & arch & simulation \\ | |
| 12 | +EGARCH(1,1) & asymmetric & \citet{nelson1991conditional} & N, $t$, GED, skt & arch & simulation \\ | |
| 13 | +NAGARCH(1,1) & asymmetric & \citet{engle1993measuring} & N, $t$, GED, skt & custom & analytic \\ | |
| 14 | +QGARCH(1,1) & asymmetric & \citet{sentana1995quadratic} & N, $t$, GED, skt & custom & analytic \\ | |
| 15 | +AVGARCH(1,1) & power & \citet{taylor2008modelling,schwert1989why} & N, $t$, GED, skt & arch & simulation \\ | |
| 16 | +APARCH(1,1) & power & \citet{ding1993long} & N, $t$, GED, skt & arch & simulation \\ | |
| 17 | +FIGARCH(1,$d$,1) & fractional & \citet{baillie1996fractionally} & N, $t$, GED, skt & arch & analytic \\ | |
| 18 | +FIEGARCH, FIAPARCH, HYGARCH & fractional & \citet{bollerslev1996modeling,tse1998conditional,davidson2004moment} & --- & unsupported & --- \\ | |
| 19 | +Component GARCH & component & \citet{engle1999long} & N, $t$, GED, skt & custom & analytic \\ | |
| 20 | +MS-GARCH(2) & regime switching & \citet{haas2004new} & N, $t$ & custom & analytic (HMP) \\ | |
| 21 | +ST-GARCH, GARCH-MIDAS & regime / component & \citet{gonzalezrivera1998smooth,engle2013stock} & --- & unsupported & --- \\ | |
| 22 | +GAS-$t$(1,1) & score-driven & \citet{creal2013generalized} & $t$ & custom & analytic \\ | |
| 23 | +Stochastic volatility & parameter-driven & \citet{kim1998stochastic} & --- & unsupported & --- \\ | |
| 24 | +\midrule | |
| 25 | +RV random walk, HAR, log-HAR & realized & \citet{corsi2009simple} & empirical & ols & direct \\ | |
| 26 | +GARCH-X(1,1) & realized & \citet{engle2002new} & N, $t$ & custom & analytic \\ | |
| 27 | +HEAVY(1,1) & realized & \citet{shephard2010realising} & N, $t$ & custom & analytic \\ | |
| 28 | +Realized GARCH(1,1) & realized & \citet{hansen2012realized} & N, $t$ & custom & simulation \\ | |
| 29 | +Realized EGARCH & realized & \citet{hansen2016exponential} & --- & unsupported & --- \\ | |
| 30 | +\midrule | |
| 31 | +Rolling cov., EWMA cov., CCC, DCC, aDCC, scalar BEKK & multivariate & \citet{bollerslev1990modelling,engle2002dynamic,cappiello2006asymmetric,engle1995multivariate} & N (QML) & custom & $h=1$ \\ | |
| 32 | +\bottomrule | |
| 33 | +\end{tabular} | |
| 34 | ||