Repository Public Research preview
1# Model card — `stgarch11` (logistic smooth-transition GARCH(1,1)) — post-registration extension23## 1. Identity4- **model_id:** `stgarch11` · **family:** regime-switching · **tier:** A · **status:** extension (E-01, added 2026-11-09 after the protocol freeze; scored with the frozen protocol, reported separately as exploratory — `progress.md`) · **impl:** custom (`src/wp46/models/extensions.py::STGARCH11`)5- **Label:** Smooth-transition GARCH (logistic) · **distributions:** normal, t (registry `dists`; the class also accepts ged/skewt but those pairs are not scored)6- **Seminal citation:** `gonzalezrivera1998smooth`7- **Other references:** `hagerud1997smooth` (smooth-transition ARCH), `terasvirta2009introduction` (survey of smooth-transition GARCH forms), `lundbergh2002evaluating` (tests of smooth-transition dynamics), `glosten1993relation` (GJR, the γ → ∞ limit), `haas2004new` (`msgarch2`, the discrete-regime model of the registry). This card replaces the former unsupported stub `stgarch.md` (the id changed to `stgarch11`).89## 2. Definition (as coded)10$$r_t = \mu + \varepsilon_t,\quad \varepsilon_t = \sigma_t z_t,\qquad \sigma_t^2 = \omega + \big[\alpha_1 + \alpha_2\,F(\varepsilon_{t-1})\big]\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2,\qquad F(e) = \frac{1}{1 + e^{-\gamma e}},\ \gamma > 0 .$$11The transition variable is the lagged innovation in **percent** (γ has units percent⁻¹) and the logistic function is centred at zero (no location parameter). Positive shocks load with $\alpha_1 + \alpha_2 F \to \alpha_1 + \alpha_2$ as $\gamma\varepsilon \to \infty$, negative shocks with $\to \alpha_1$. Recursion `rec_stgarch`: $\sigma_0^2 = s_0$ (backcast; note that `garch11_custom` initialises with $\omega + (\alpha+\beta)s_0$), floor $\sigma_t^2 \ge 10^{-12}$. Innovations: standardised normal or Student-t (`loglik_z`).1213## 3. Parameter space and admissibility14- Parameters: `mu, omega, alpha1, alpha2, gamma, beta` (+ `nu` for t).15- Reparameterisation (`theta_to_vol`): $\omega = e^{\theta_0}$; persistence $s = \sigma(\theta_1) \in (0,1)$ and share $w = \sigma(\theta_2)$ give $\bar\alpha \equiv \alpha_1 + \alpha_2/2 = s\,w$ and $\beta = s(1-w)$; $q = \tanh(\theta_3) \in (-1,1)$ gives $\alpha_2 = 2q\bar\alpha$, $\alpha_1 = \bar\alpha(1-q)$; $\gamma = e^{\theta_4}$; $\nu = 2.05 + e^{\theta_5}$.16- Implied domain (all by construction): $\omega > 0$, $\alpha_1 \ge 0$, $\alpha_1 + \alpha_2 = \bar\alpha(1+q) \ge 0$ (the ARCH loading stays non-negative for every value of F), $\beta \ge 0$, $\gamma > 0$, $\alpha_1 + \alpha_2/2 + \beta < 1$.17- Admissibility flag (`admissible`): the same six conditions. The persistence $\alpha_1 + \alpha_2/2 + \beta$ is exact for **symmetric** innovation laws: since $F(e) + F(-e) = 1$, $E[F(\varepsilon_t)\varepsilon_t^2 \mid \sigma_t^2] = \sigma_t^2/2$, so $E[\sigma_t^2] = \omega/(1 - \alpha_1 - \alpha_2/2 - \beta)$ under normal/t innovations (it would not be exact under a skewed law).1819## 4. Nesting and relations20- $\alpha_2 = 0$: GARCH(1,1) ($\omega, \alpha_1, \beta$); γ is then unidentified (nuisance parameter absent under the null).21- $\gamma \to \infty$: $F \to \mathbf 1\{\varepsilon > 0\}$ and the model becomes GJR with $\alpha_{GJR} = \alpha_1 + \alpha_2$ (positive shocks) and $\gamma_{GJR} = -\alpha_2$ (extra loading of negative shocks) — `gjr11` is the limit, not a special case.22- Relatives in the registry: `msgarch2` (discrete, latent regimes instead of a smooth observed-shock transition), `nagarch11`/`qgarch11` (other smooth asymmetric news-impact curves), `egarch11`.2324## 5. Estimation25Shared custom MLE (`CustomModel.fit`, `custom.py`): negative log-likelihood $-\sum_t[\log f(z_t) - \tfrac12\log\sigma_t^2]$ on the unconstrained θ; L-BFGS-B (maxiter 2000, ftol 1e-10, gtol 1e-6) from up to three starts (ω, α₁, α₂, γ, β) ∈ {(0.05v, 0.03, 0.08, 1.0, 0.88), (0.03v, 0.08, 0, 0.5, 0.88), (0.1v, 0.02, 0.12, 3.0, 0.8)}, v = sample variance of the demeaned window, μ start = sample mean, ν start 6; the loop stops after the second start if it converged; Nelder–Mead polish (maxiter 4000) followed by a final L-BFGS-B pass when L-BFGS-B failed or stalled; **A-05 likelihood floor**: if the optimum is more than 50 log-likelihood units below GARCH(1,1) with the same law, two perturbed restarts are tried and the fit is flagged `degenerate` (not converged) if the gap persists. Backcast $s_0$ = exponentially weighted mean (75 lags, decay 0.94) of the first squared demeaned returns. Point estimates only.2627## 6. Forecasting28`STGARCH11.step_forecast` (method `simulation`): $\hat\sigma^2_{t+1|t} = \omega + [\alpha_1 + \alpha_2 F(\varepsilon_t)]\varepsilon_t^2 + \beta\sigma_t^2$ (deterministic); for k ≥ 2, 2,000 paths with $\varepsilon = \sigma z$, z drawn from the fitted law (`rvs`, seeded `default_rng(seed)`, seed 46 + origin index in the driver), path recursion with floor 1e-12, forecast = cross-path mean of $\sigma^2_{t+k}$. Cumulative h-day variance = sum of the first h steps. Note: for the symmetric laws scored here an exact recursion exists ($E_t[\sigma^2_{t+k}] = \omega + (\alpha_1 + \alpha_2/2 + \beta)\,E_t[\sigma^2_{t+k-1}]$, by the identity of §3 and iterated expectations), so the simulation only adds Monte Carlo noise at k ≥ 2 (`_discrepancies.md`, E-01).2930## 7. Implementation and verification31- `src/wp46/models/extensions.py::STGARCH11`, numba `rec_stgarch`; dispatched by `rolling.make_model` through `EXTENSIONS`.32- Tests (`tests/unit/test_extensions.py`): `test_fiaparch_nests_figarch_and_stgarch_nests_garch` (fit on the simulated GARCH-t fixture `R`: converged, admissible, log-likelihood ≥ `GARCH11` custom − 1.0), `test_no_lookahead_extensions` (5-step forecast from the first 2,000 observations unchanged when later returns are scaled ×5).33- **No external-package cross-check** (no smooth-transition GARCH in arch 8.0.0 or rugarch 1.5-6), no seeded simulation-recovery test, no likelihood identity test. Among the seven extensions the only external identity is HYGARCH(amp = 1) vs arch's FIGARCH likelihood (`hygarch11.md` §7). The verification rule of CLAUDE.md (rule 6) is therefore **not** met in full — hence the `extension` status and the separate reporting.3435## 8. Known limitations / failure modes36Post-registration, exploratory. γ is weakly identified (flat likelihood when α₂ ≈ 0, or once γ|ε| is large enough for F to be a step) and depends on the return scale; the transition has no location parameter; the GARCH(1,1) nest differs from `garch11_custom` in the first observation only; multi-step forecasts carry simulation noise although an exact recursion exists; persistence/admissibility are defined for symmetric laws; a GJR-like optimum will often sit at a large γ with `L-BFGS-B` reporting convergence on a flat ridge.3738## 9. Computational footprint39One O(T) numba recursion (one exponential per step) per likelihood evaluation — same order as `garch11_custom`, with two more parameters and a 2,000 × 22 vectorised simulation per forecast origin; qualitatively a small multiple of GARCH(1,1), far below the fractional extensions. Not timed in the pilot.4041## 10. Literature expectations42`gonzalezrivera1998smooth` and `hagerud1997smooth` document smooth (rather than threshold) asymmetry; `terasvirta2009introduction` notes that the smooth-transition and GJR fits are usually close. Under pre-registered H1 (asymmetry), gains relative to `garch11` are expected where `gjr11`/`egarch11` gain (equity indices and single stocks, stressed regimes under H6) and not for FX; `hansen2005forecast` find leverage-type models matter for IBM returns but not for DM–$. No large cross-asset forecasting benchmark of ST-GARCH is in the literature matrix.43