Model card — constvar (constant variance, window mean)
1. Identity
- model_id:
constvar· family: baseline · tier: A · status: implemented · impl: arch 8.0.0 (ConstantVariance) - Label (registry): Constant variance (window mean) · distributions (registry): normal
- Seminal citation: none (registry
ref: null); the constant-variance model is the degenerate GARCH(1,1) with α = β = 0 (bollerslev1986generalized). - Other references:
engle1982autoregressive(ARCH as the alternative to constant variance);hansen2005forecast(uses the same kind of benchmarks).
2. Definition
Conditional mean and variance (returns in percent, variances in percent²): $$r_t = \mu + \varepsilon_t,\qquad \varepsilon_t = \sigma_t z_t,\qquad \sigma_t^2 = \sigma^2 \ \ \text{for all } t .$$ Innovation law: $z_t \sim$ i.i.d. N(0,1) only (registry).
3. Parameter space and admissibility
- Parameters:
mu,sigma2; $\sigma^2 > 0$. arch bounds: $\sigma^2 \in [v/10^5,\ 10(v + \bar r^2)]$ with $v$ the sample variance of the residuals; constraint $\sigma^2 \ge 0$. - No stationarity condition; the admissibility flag is always
TrueinArchModel.fit(no model-specific check).
4. Nesting and relations
Nested in GARCH(1,1) ($\alpha = \beta = 0$), in ARCH(5) ($\alpha_i = 0$) and in every GARCH-type model of the registry. It is the "no dynamics" floor of the benchmark; histvar252 is its rolling-window analogue without a mean equation.
5. Estimation
arch 8.0.0 ConstantMean + ConstantVariance + Normal: closed form (arch's _fit_no_arch_normal_errors: $\hat\mu$ = window mean, $\hat\sigma^2$ = mean squared residual over the 1,000-day window) — no numerical optimisation, no backcast needed, no retries. Wrapper: src/wp46/models/arch_models.py::ArchModel.fit. Standard errors are not used: only point estimates enter the rolling benchmark (src/wp46/estimation/rolling.py).
6. Forecasting
res.forecast(horizon=22, method="analytic"): $\hat\sigma^2_{t+k|t} = \hat\sigma^2$ for every $k$ (flat term structure); cumulative $h$-day variance $= h,\hat\sigma^2$ (Forecast.cumulative). Method recorded: analytic.
7. Implementation
src/wp46/models/arch_models.py(SPECS["constvar"],ArchModel), library arch 8.0.0 (sheppard2025arch).- Cross-check: not part of the rugarch fixture (
results/metrics/rugarch_crosscheck.jsonhas noconstvarentry); the closed-form estimate needs no numerical cross-check. - Tests: no dedicated unit test; exercised only through the driver machinery (
tests/integration/test_rolling_driver.pyusesgarch11,har_rv,gjr11,heavy11, notconstvar).
8. Known limitations / failure modes
No dynamics, so it is mis-specified for every instrument in the universe; its only role is a floor. No convergence failures possible. With rolling re-estimation it reacts to volatility changes with the 1,000-day window lag.
9. Computational footprint
Closed form (fastest model of the registry together with histvar*); analytic forecasts. No pilot timing is recorded for constvar in results/metrics/pilot/pilot_report.json (pilot models: garch11, egarch11, gjr11, aparch11, nagarch11, realgarch11, har_rv, histvar22).
10. Literature expectations
Hansen & Lunde (hansen2005forecast) and every later comparison find constant-variance / no-dynamics benchmarks dominated by any ARCH-type model at the 1-day horizon; the literature matrix (docs/literature_matrix.md, §a.1) lists it as a baseline only. Expected to be excluded from the MCS at short horizons; at h = 22 the gap to GARCH(1,1) is expected to narrow because mean reversion brings GARCH forecasts toward the unconditional variance (christoffersen2000how).