Repository Public Research preview
1# Model card — `realegarch11` (Realized EGARCH(1,1), Hansen–Huang) — post-registration extension23## 1. Identity4- **model_id:** `realegarch11` · **family:** realized (Tier B) · **tier:** B · **status:** extension (E-01, added 2026-11-09 after the protocol freeze; scored with the frozen protocol, reported separately as exploratory) · **impl:** custom (`src/wp46/models/extensions.py::RealEGARCH11`)5- **Label:** Realized EGARCH(1,1) · **distributions:** normal, t (for $z_t$; the measurement error $u_t$ is always Gaussian) · **input:** lagged/contemporaneous realized measure `rv5ss_on` (percent², `forecast_protocol.yaml: tier_b_input`)6- **Seminal citation:** `hansen2016exponential` (the registry key was corrected from the non-existent `hansen2016realized`; `_discrepancies.md` A.1 is resolved for this entry)7- **Other references:** `hansen2012realized` (Realized GARCH, scored as `realgarch11`), `hansen2014realized` (Realized Beta GARCH), `shephard2010realising` (HEAVY), `engle2002new` (GARCH-X), `nelson1991conditional` (EGARCH); literature-matrix caveat #7 (joint likelihood with the measurement equation → not comparable with return-only models). This card replaces the former unsupported stub.89## 2. Definition (as coded)10With $x_t$ the realized measure observed at the **end** of day t:11$$r_t = \mu + \sigma_t z_t,\qquad \log\sigma_t^2 = \omega + \beta\log\sigma_{t-1}^2 + \tau_1 z_{t-1} + \tau_2(z_{t-1}^2 - 1) + \gamma\,u_{t-1},$$12$$\log x_t = \xi + \varphi\log\sigma_t^2 + \delta_1 z_t + \delta_2(z_t^2 - 1) + u_t,\qquad u_t \sim \text{N}(0, \sigma_u^2),$$13i.e. `hansen2016exponential` with one realized measure and quadratic leverage functions $\tau(z) = \tau_1 z + \tau_2(z^2-1)$, $\delta(z) = \delta_1 z + \delta_2(z^2-1)$ (both mean-zero). The **measurement error $u_{t-1}$ enters the volatility equation directly** (in `realgarch11` it is $\log x_{t-1}$ that enters): $u_{t-1} = \log x_{t-1} - \xi - \varphi\log\sigma_{t-1}^2 - \delta(z_{t-1})$ is $\mathcal F_{t-1}$-measurable, so there is no look-ahead. Recursion `rec_realegarch`: $\log\sigma_0^2 = \log s_0$ (backcast), $\log\sigma_t^2$ clipped to [−50, 50], $x_t$ floored at 1e-8 before the log. Joint log-likelihood $\sum_t[\log f(z_t) - \tfrac12\log\sigma_t^2] + \sum_t[-\tfrac12\log(2\pi\sigma_u^2) - u_t^2/(2\sigma_u^2)]$ (`extra_loglik`).1415## 3. Parameter space and admissibility16- Parameters: `mu, omega, beta, tau1, tau2, gamma, xi, phi, delta1, delta2, log_sigma_u` (+ `nu` for t).17- Reparameterisation: all free except $\beta = \tanh(\theta_1) \in (-1, 1)$; $\sigma_u = e^{\texttt{log\_sigma\_u}} > 0$.18- Admissibility flag: $|\beta| < 1$ (stationarity of $\log\sigma^2$ given i.i.d. $u_t$ and $z_t$; `hansen2016exponential`). Holds by construction. No constraint on φ (≈ 1 in the literature) or on the leverage coefficients.1920## 4. Nesting and relations21- `realgarch11` (log-linear Realized GARCH) is not nested: substituting the measurement equation into Realized GARCH's $\gamma\log x_{t-1}$ gives $\gamma[\xi + \varphi\log\sigma_{t-1}^2 + \delta(z_{t-1}) + u_{t-1}]$, so Realized GARCH imposes proportionality between the $\log\sigma^2$, leverage and $u$ loadings that Realized EGARCH frees (`hansen2016exponential`, their eq. for the "Realized GARCH as a special case" argument); persistence is β here vs $\beta + \varphi\gamma$ there.22- γ = 0 removes the realized-measure feedback: an EGARCH-type model in $z_{t-1}$ and $z_{t-1}^2 - 1$ (quadratic rather than Nelson's $|z| - E|z|$) with a detached measurement equation — related to, but not identical to, `egarch11`.23- Relatives: `heavy11`, `garchx_rv11`, `har_rv`/`loghar_rv` (Tier B, same realized measure).2425## 5. Estimation26Shared custom MLE on the **joint** likelihood (`CustomModel.fit` with `extra_loglik`; `maxiter` 3000): L-BFGS-B (ftol 1e-10, gtol 1e-6) from up to three starts (ω, β, τ₁, τ₂, γ, ξ, φ, δ₁, δ₂, log σ_u) ∈ {(0.02ℓ, 0.98, −0.03, 0.03, 0.1, 0, 1.0, −0.05, 0.05, log 0.4), (0.05ℓ, 0.95, −0.05, 0.05, 0.2, 0, 0.9, −0.05, 0.05, log 0.5), (0.01ℓ, 0.99, −0.02, 0.02, 0.05, 0, 1.0, −0.02, 0.02, log 0.35)}, ℓ = mean of $\log x_t$ over the window; μ start = sample mean; ν start 6; stop after the second start if converged; Nelder–Mead polish (maxiter 4000) + final L-BFGS-B if not converged or stalled. The **A-05 floor is not applied** (`needs_rm = True`: the joint likelihood is not comparable with GARCH(1,1)). Backcast $s_0$ = exponentially weighted mean (75 lags, 0.94) of the first squared demeaned returns. Point estimates only.2728## 6. Forecasting29`RealEGARCH11.step_forecast` (method `simulation`): $\log\hat\sigma^2_{t+1|t} = \omega + \beta\log\sigma_t^2 + \tau(z_t) + \gamma u_t$ is deterministic ($u_t$ is known once $x_t$ is observed); for k ≥ 2, 2,000 paths with $z \sim$ fitted law (`rvs`, seeded) and $u \sim \text{N}(0, \sigma_u^2)$ (`rng.standard_normal`), path update of $\log\sigma^2$ **clipped to [−30, 30]** (the in-sample recursion clips at ±50, as in `realgarch11`), forecast = cross-path mean of $\exp(\log\sigma^2_{t+k})$. Cumulative h-day variance = sum of the first h steps. The realized measure itself is not forecast (not needed: only $u$ enters, and future $u$ are i.i.d. Gaussian).3031## 7. Implementation and verification32- `src/wp46/models/extensions.py::RealEGARCH11`, numba `rec_realegarch`; `fit()` stores the realized measure in `self._x` for the starting values; `sigma2()` stores $u_t$ in `self._u` for `extra_loglik`. Dispatched through `EXTENSIONS` with `needs_rm`.33- Tests (`tests/unit/test_extensions.py::test_betategarch_fiegarch_realegarch_fit_and_forecast`): fit (normal) on the GARCH-t fixture with a synthetic realized measure $(r-\bar r)^2\cdot\text{lognormal}(0, 0.3) + 0.05$ converges; 22-step forecasts positive, finite and seed-reproducible.34- **No external-package cross-check** (Realized EGARCH is not in arch 8.0.0; rugarch 1.5-6 has `realGARCH` only, which did not converge on the fixture even for `realgarch11`), no simulation-recovery test, no likelihood identity test. The only external identity in the extension set is HYGARCH(amp = 1) vs arch's FIGARCH (`hygarch11.md` §7). CLAUDE.md rule 6 is not met in full — hence `extension` status.3536## 8. Known limitations / failure modes37Post-registration, exploratory. Eleven parameters in a 1,000-day window (ξ, φ and ω are weakly separately identified when φ ≈ 1; δ₂/τ₂ trade off with σ_u); Gaussian measurement error by construction; single realized measure (the paper allows several); clipping of $\log\sigma^2$ at ±50 in-sample and ±30 in the simulation; in-sample log-likelihood includes the measurement equation and cannot be ranked against Tier A models; a bad realized measure (zeros, floor 1e-8) feeds a large $u$ straight into next day's variance through γ. Failures are recorded as failures (rule 5).3839## 9. Computational footprint40One O(T) numba recursion per likelihood evaluation over 11–12 parameters (more gradient evaluations than `realgarch11`), one 2,000 × 22 vectorised simulation per origin; qualitatively a few times `garch11_custom`, well below the fractional extensions. Not timed in the pilot.4142## 10. Literature expectations43`hansen2016exponential` report better in-sample fit and forecasting than Realized GARCH on US equities, attributing the gain to the free loading of the measurement error and to the richer leverage function. Under H3 (realized information) Realized EGARCH is expected to match or beat `realgarch11`/`heavy11` at h = 1 and to beat `garch11` on instruments with a clean realized measure (index futures, large caps), with smaller gains at h = 22 and for instruments with noisy overnight-adjusted measures; under H6 the realized models should gain most in stressed regimes. No large cross-asset benchmark of Realized EGARCH is in the literature matrix.44