Repository Public Research preview
1\section{Simulation and replication verification}\label{app:verification}23\paragraph{Test suite.} The replication package ships \NTests{} automated tests in four layers: unit tests of the standardized4densities (log-densities equal to arch's to $10^{-15}$ for the normal, Student-$t$, GED and skew-$t$; simulated moments and5expected shortfalls within sampling error), of the recursions (the custom GARCH(1,1) reproduces arch's6\texttt{compute\_variance} to $10^{-9}$ and its analytic forecasts to $10^{-15}$), of nesting (every custom asymmetric,7component and in-mean model attains at least the GARCH(1,1) likelihood), of admissibility, of the loss functions and realized8measures (units: 390 one-minute returns of 0.1\% give $\RV^{1m}=3.9$ percent$^2$), of the calendars (official XNYS early9closes; futures and FX windows), and of the HAR direct targets; integration tests of the rolling driver (re-estimation cadence,10missing-input handling, no look-ahead: perturbing all returns and realized measures after the last origin leaves every11forecast of a job unchanged, for a Tier~A and a Tier~B model); seeded Monte Carlo recovery tests for GJR (median over twelve12replications within 0.02--0.03 of the truth), NAGARCH, GARCH-M, QGARCH, Realized GARCH, HEAVY and MS-GARCH (regime13persistence and variance separation recovered); and replication tests against R packages on a shared synthetic fixture14(3{,}000 observations of a GJR-$t$ process with a noisy realized measure).1516\paragraph{Cross-package replication.} Table~\ref{tab:crosscheck} reports the maximized log-likelihoods of our implementations17and of \texttt{rugarch} 1.5-6 \citep{galanos2011rugarch} on the fixture. For every architecture available in both, our optimum18is within 0.3 log-likelihood units of \texttt{rugarch}'s (and above it in all but one case, which reflects optimizer19differences, not specification differences); GARCH(1,1)-$t$ parameters agree to three decimals ($\alpha$ 0.0767 vs 0.0766,20$\beta$ 0.8979 vs 0.8979, $\nu$ 6.92 vs 6.92), NAGARCH's asymmetry parameter to three decimals (0.3397 vs 0.3398) and the21component model's parameters to two. FIGARCH is the exception: arch's truncated ARCH($\infty$) representation with its22sufficient positivity constraints yields a likelihood 1.47 units below \texttt{rugarch}'s; we keep the arch implementation23(version-locked, tested) and flag the difference. \texttt{rugarch}'s Realized GARCH did not converge on the fixture, so that24model is verified by Monte Carlo recovery only. The GAS-$t$ model is checked against the \texttt{GAS} package of25\citet{ardia2019generalized}, the GARCH-X return equation against \texttt{rugarch} with an external variance regressor, and the26two-regime MS-GARCH likelihood and 22-step variance forecasts against \texttt{MSGARCH} \citep{ardia2019markov}; the27corresponding numbers are reported in the table when the R fits converged.2829\begin{table}[tp]\centering\footnotesize30\caption{Cross-package verification on the shared fixture (maximized log-likelihoods; differences = ours $-$ R).}\label{tab:crosscheck}31\adjustbox{max width=\textwidth}{\input{tables/tab_crosscheck}}32\end{table}3334\paragraph{Known implementation caveats.} (i) arch uses $\kappa=1/2$ in the GJR multi-step recursion for every innovation law35(exact for symmetric laws; the skew-$t$ GJR forecasts at $h>1$ are therefore approximate). (ii) No stationarity flag is36computed for TGARCH, AVGARCH and APARCH (their conditions involve $\E(|z|-\gamma z)^{\delta}$); convergence is their only37failure criterion. (iii) EGARCH in arch centres $|z|$ at $\sqrt{2/\pi}$ for all laws and restricts $\beta\in[0,1)$. (iv) arch38emits a scale warning, without rescaling, when the return variance is outside $[0.1, 10^4]$; percent returns keep every39instrument inside this range. (v) Simulation forecasts use the distribution generator seeded by the origin index (amendment40A-01; the first pass of four simulation-based specifications with non-Gaussian innovations was re-run after the seed was41found missing). (vi) $\kappa$ is held at $1/2$ inside the optimizer of the custom models (it only enters the first-observation42initialization of the custom GJR, which is not a scored model) and computed exactly once after each fit (A-04).43