SPB Git

spb/wp46_uqo

Public

WP46 paper: literature, taxonomy, data, design sections

Simon-Pierre Boucher committed (Nov 9, 2026) parent 7262d41 Browse files

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 - 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. 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 ## 4. Nesting and relations 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 ## 5. Estimation 22 ## 5. Estimation
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. 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
Menu

Theme