Skip to content

Validation matrix

Correctness is the contract. Where a reference value can exist, nothing lands in tsecon without a golden fixture it has to reproduce to a stated tolerance — a JSON file of reference values (in fixtures/) that the Rust crate tests must hit on every run, and that the Python binding tests reload for 67 of the 100 files. This page is the map: for each method family it names the reference the golden is measured against, the fixture file, the test that enforces the match, and the tolerance it is held to.

Some functions have no golden, because no reference value for them exists or because the estimator they implement has no counterpart in any package. Where a row lists such a function, it says so in the row and names the property or simulation test that carries the claim instead. Read the Family column as the scope of the golden, not as a list of everything the crate exports: a function named there without a "not golden-pinned" caveat has a reference value in the fixture; one with the caveat does not.

The reference is honest about its own strength. There are three kinds, and the table says which one each row is:

  • Independent package. The golden values come from a mature, independently written library — statsmodels, SciPy, arch, linearmodels, scikit-learn, or ArviZ — computing the same estimand through a completely separate code path. Reproducing it is a genuine cross-implementation check.
  • Documented-formula golden. No package computes the quantity, so the generator transcribes the published closed form directly into NumPy (the formula is written out in the generator's docstring) and pins the crate to it. This proves the Rust reproduces the documented algebra; it does not by itself prove the algebra is the statistically right choice — that claim is carried by the crate's seeded Monte-Carlo property tests, noted where it applies. A few of these are cross-implementation goldens (an independent NumPy re-implementation of the same estimator, not an independent authority); the table flags those explicitly.
  • Property / simulation-recovery. Where no reference of either kind exists (multivariate DCC dynamics, dynamic probit), the object is validated by invariants it must satisfy — positive-definiteness, correlation targeting, parameter recovery on simulated data within Monte-Carlo bands — rather than a golden. The table says so plainly rather than overclaiming a package match.

Several rows are mixed, and where they are the row grades each leg and gives each its own tolerance. That distinction matters most where an independent-package leg exists but is not the leg carrying the tight number — panel_unit_root is the clearest case on this page — so read the tolerance next to the reference it belongs to, not the smallest number in the row.

Tolerances below are the asserted bounds in the test source. Many are far tighter than the crate spec requires and the achieved agreement is tighter still (frequently machine precision); where the two differ the table quotes the asserted bound.

What this table does not cover: whether the intervals cover

Every row below pins a point estimate or a standard-error formula against a reference. None of them pins the coverage of the resulting interval — that is a property of repeated sampling, and two estimators can agree with statsmodels to 1e-15 and still cover 95% and 63% of the time.

Interval coverage is the companion audit: 63 interval-valued surfaces re-estimated on seeded draws from known-truth processes, with the measured containment rate and its Monte Carlo standard error. It publishes the ones that miss — 14 of the 50 frequentist intervals are off nominal even in the design they are entitled to do well on — attributes each miss to the approximation, the estimator, a library convention, an API gap, or a misreading, and cross-links each caveat to the model card for the function. Read it before quoting a standard error from a family in this table.


Estimator families

Family Validated against Fixture Test Tolerance
Diagnostics — acf, pacf, ljung_box, jarque_bera, arch_lm statsmodels (acf, pacf, acorr_ljungbox, het_arch) + scipy.stats — independent package diagnostics.json tsecon-diag/…/golden.rs 1e-12 rel (spec floor 1e-8)
Unit root & stationarity — adf, kpss (check_stationarity's verdict rule is not golden-pinned) statsmodels adfuller, kpss + MacKinnon p-value grid — independent package. The fixture pins adf and kpss only. check_stationarity composes them and adds a joint verdict rule; that rule has no golden and is validated by property tests (quadrant consistency with the underlying tests, the conflict / inconclusive recommendations) in unitroot_properties.rs unitroot.json tsecon-diag/…/unitroot_golden.rs ADF stat 1e-8 / p 1e-7; KPSS stat 1e-8 / p 1e-6; verdict rule: exact quadrant assertions, no tolerance
Preprocessing advisors — ndiffs, box_cox_lambda mixed, graded per block. ndiffs' per-order evidence is a third-party golden (statsmodels kpss / adfuller, arch PhillipsPerron); the sequential rule it wraps them in is a documented-rule transcription of Hyndman-Khandakar (2008) / forecast::ndiffs, since no third-party implementation exists in the reference venv. box_cox_llf and the MLE λ are a strong SciPy golden (boxcox_llf, minimize_scalar, boxcox_normmax). Guerrero (1993) is a documented-formula golden — an independent NumPy transcription in the generator, no third-party implementation available advisors.json tsecon-diag/…/advisors_golden.rs d, stop reason, step count, lag/bandwidth and per-step decision exact; ndiffs statistics/p 1e-11 (achieved 3.2e-13 / 7.4e-14); Box-Cox llf 1e-13 (achieved 6.8e-16); MLE λ 1e-6 abs — the √eps limit for locating a smooth maximum — with llf at the two λ agreeing to 1e-9; Guerrero criterion 1e-13, optimising λ 1e-6
Phillips-Perron & Phillips-Ouliaris — phillips_perron, phillips_ouliaris arch PhillipsPerron (Z-tau/Z-alpha) and cointegration.phillips_ouliaris (Zt/Za) — independent package — for the statistics; MacKinnon (1996/2010) N-surfaces (arch/statsmodels ADF surfaces at N=1 for PP; statsmodels cointegration surfaces at N=1+ncols(x) for PO-Zt) for p-values/critical values. PO-Za is statistic-only (arch's proprietary surface deliberately not shipped) phillips.json tsecon-diag/…/phillips_golden.rs, phillips_properties.rs stat & crit 1e-8 rel (achieved < 1e-13 vs arch); p-value atol 1e-12 / rtol 1e-8
Volatility (GARCH) — garch_fit arch (Sheppard) arch_model — independent package — for the fixed-parameter log-likelihood, the conditional volatility at arch's fitted parameters, the fitted parameters, and the robust (sandwich) standard errors. The fixture pins no MLE standard errors: fit_bse_mle is byte-identical to fit_bse_robust in all five cases (the generator stored arch's robust column twice; the golden test asserts the duplication so the artifact cannot be mistaken for two references), so the crate's inverse-Hessian SEs are only checked finite, positive, and within 30% of the robust ones — measured 9-14% apart on the normal cases garch.json tsecon-garch/…/golden.rs fixed-param loglike 1e-8 rel; loglike ≥ arch − 1e-6; QMLE params 1e-3 rel on the four normal-innovation cases only — the Student-t case sits on a flat nu ridge, so its variance params are 2e-2 and nu is asserted only > 100; robust se 5e-3 rel (nu 0.10); MLE se not pinned
Score-driven volatility (GAS/DCS) — gas_volatility documented closed form (Creal-Koopman-Lucas 2013), NumPy tsecon-gas.json tsecon-gas/…/golden.rs 1e-10
Multivariate GARCH — ccc_garch, dcc_garch (incl. variant="cdcc"/"adcc", dist="t", h-step forecasts) no external DCC reference: univariate stage arch-pinned (via tsecon-garch); DCC dynamics property-validated (every R_t/H_t PD, correlation targeting) + single-realization recovery. The 0.5.0 variants are property-MC + internal nesting + literature formulas: ADCC(g=0) ≡ DCC and cDCC(0,0) ≡ CCC nesting identities, forecast h=1 bitwise ≡ the exact one-step, h→∞ convergence to corr(qbar), default path verified bit-identical to 0.4.0 (f64::to_bits), and seeded recovery MC (T=2000, 50 reps: DCC/cDCC â, within 1 sd of truth; ADCC ĝ = 0.082 (sd 0.025) at truth 0.08 — measured numbers in the volatility model card). No runnable third-party reference: the pip mgarch package was attempted for a non-gating DCC-t cross-run and is unusable (crashes on NumPy ≥ 1.25; under NumPy 1.24 its optimizer provably returns its starting values unchanged; targets raw-return covariance, not Engle 2002); R rmgarch is out of scope for this pass. The 0.6 stage-1 surface (univariate per-series results incl. SEs, std_residuals, ADCC nbar) is binding-identity-validated: per-series dicts asserted bit-identical to a direct garch_fit under the same spec (one shared dict builder), z == returns/sqrt(sigma2) bitwise (default spec), nbar reproduced from the returned residuals at 1e-12 mgarch.json (simulated DCC-GARCH(1,1), true params attached) tsecon-mgarch/…/mgarch.rs, test_dcc_buildout.py, test_binding_gaps.py property bounds (PD 1e-8…1e-14); nesting 1e-10 rel loglik; default-path pin 1e-7; loose MC recovery; stage-1 surface bitwise
Engle-Sheppard constant-correlation test — dcc_test no external implementation available: validated by the published construction (Engle & Sheppard 2001 §3.2 — symmetric-inverse-root joint standardization, pooled off-diagonal AR, χ²(lags+1)), an in-crate brute-force OLS transcription the statistic must match at 1e-8, and seeded size/power MC: null rejection 3.7% @ 5% / 7.0% @ 10% (CCC null, T=1000, k=2, 300 reps — mildly conservative, consistent with the paper's own tables), power 69% @ 5% (DCC a=0.05, b=0.90, T=1000, 200 reps); rejects the fixture's DCC DGP at p < 1e-8 none (property/MC; in-test simulated nulls) tsecon-mgarch/…/estest.rs (unit), mgarch.rs, test_dcc_buildout.py brute-force OLS match 1e-8; MC size/power as stated
VAR / SVAR — var_fit, var_irf, var_fevd, var_granger, var_forecast statsmodels VAR — independent package. The 0.6 residual surface (resid/fitted/nobs/df_resid) is identity-validated at the binding: fitted + resid == data[lags:] exact (bitwise, by construction), sigma_u == resid'resid / df_resid at 1e-10 var.json tsecon-var/…/golden.rs, test_binding_gaps.py 1e-8 (params, sigma_u, IRF, FEVD, forecast); Granger p 1e-6; residual identities exact
VAR IRF confidence bands — var_irf_bands asymptotic: statsmodels IRAnalysis.stderr and cum_effect_stderr (orth False/True) — independent package; bootstrap: no external golden — property-validated (seed reproducibility, residual-bootstrap structure) + Monte-Carlo coverage var_irf_bands.json, var_irf_bootstrap.json tsecon-var/…/irf_bands_golden.rs, irf_bootstrap_props.rs delta-method SE 1e-6 asserted (achieved ~1e-15 vs statsmodels), point IRF 1e-8; bootstrap property bounds + MC coverage
Generalized impulse responses, linear engine reduction — var_girf (the Koop-Pesaran-Potter simulation engine tsecon_var::girf, shared with threshold_var_girf) two exact goldens with a single draw — with common random numbers a linear model's paired with/without difference is Ψ_h δ for every draw: shock="orthogonal" vs statsmodels VARResults.irf(orth=True) (independent package), shock="generalized" vs the Pesaran-Shin (1998) closed form Ψ_h Σ e_j / √σ_jj transcribed in NumPy in generate_girf_fixtures.py (documented formula; the MA recursion asserted equal to statsmodels' irf.irfs at generation); across-history band width and draw_sd asserted zero; engine properties in girf_properties.rs: reduction to ma_rep closed forms for every history and draw, bit-identity at 1 vs 4 rayon threads and across two fresh processes (child spawned with a different RAYON_NUM_THREADS), 1/√n_draws convergence on a nonlinear toy (measured 32/512 error ratio 4.58, theory 4), antithetic variance ratio 0.953 on the toy (measured; modest by construction on threshold models), teaching errors incl. explosive-model refusal girf.json tsecon-var/…/girf_golden.rs, girf_properties.rs, test_girf.py 1e-12 abs (both closed forms, every horizon, single draw, antithetic pairs, and a seeded history subsample); var_irf(orth=True) identity asserted at 1e-12 in Python
Conditional (hard-path) VAR forecasts — var_conditional_forecast two exact legs, both hit at roundoff: (a) the Doan-Litterman-Sims / Waggoner-Zha closed form u* = Σ B'(B Σ B')^{-1} r, ỹ = ŷ + R u*, V = R(Σ − Σ B'(B Σ B')^{-1} B Σ)R' transcribed in NumPy in generate_var_cf_fixtures.py (documented formula; MA recursion asserted equal to statsmodels irf.irfs) — path, per-horizon covariance, se, bounds, implied reduced-form and Cholesky-orthogonalised shocks, the constrained grid, the Mahalanobis statistic and its χ²(m) p-value; (b) statsmodels VARMAX(endog_with_NaN_future).smooth(params) at the OLS parameters set by name — the Bańbura-Giannone-Lenza Kalman-conditioning route, an independent package — whose smoothed_state, smoothed_state_cov and smoothed_state_disturbance agree with (a) at ≤ 1.8e-15 at generation; the all-NaN future asserted equal to VARResults.forecast/mse at 1e-12. Seeded MC in var_cf_properties.rs: 95% conditional coverage of the free series under the DGP 0.9470/0.9540/0.9540/0.9605 at h = 1..4 (2000 reps, MC se 0.005; unconditional 0.9465/0.9575/0.9515/0.9605), standardised-error variance 0.958–0.989, mean Mahalanobis 3.977 (χ²(4) mean 4), single-cell h = 1 se ratio = √(1 − ρ̂²) exactly (0.8527) and 0.8384 under four-horizon path conditioning; minimum-norm characterisation proved by projection (20 feasible alternatives, all larger) var_cf.json tsecon-var/…/var_cf_golden.rs, var_cf_properties.rs, test_var_cf.py (also runs the VARMAX leg live on macrodata in levels) closed form 1e-10 (all quantities, 6 cases incl. the transformed macro system); VARMAX leg 1e-8 (path, cov, shocks); unconditionalvar_forecast bitwise; pinned cells bitwise, their se exactly 0
VAR residual diagnostics & lag order — var_diagnostics, var_select_order statsmodels VARResults.test_whiteness(nlags, adjusted=False/True) (Hosking / Lütkepohl Portmanteau), test_normality() (multivariate Jarque-Bera, lower-Cholesky orthogonalisation), roots, is_stable(), VAR.select_order — independent package; the skewness/kurtosis components and per-series b1/b2 transcribed from statsmodels' own test_normality lines with the sum asserted equal to the omnibus statistic at generation (Doornik-Hansen not shipped: no runnable reference). Seeded MC size/power in var_cf_properties.rs: at a nominal 5% on a Gaussian VAR(1), T = 200, k = 2, nlags = 8, 1000 reps — Q 4.60%, adjusted Q 5.40%, Jarque-Bera 4.20% (MC se 0.7 pts), mean adjusted p 0.4923; power 300/300 against an omitted lag and 300/300 against t(4) innovations var_diag.json tsecon-var/…/var_diag_golden.rs, var_cf_properties.rs, test_var_cf.py (live statsmodels parity on macrodata in levels) statistics 1e-10; p-values 1e-10 abs and 1e-6 on the log scale; df exact; roots/eigenvalue moduli 1e-8; select_order picks exact, criterion tables 1e-8 (11 Portmanteau blocks, 6 normality blocks, 3 selection tables)
FAVAR / factor extraction — favar NumPy SVD / PCA — documented favar.json tsecon-favar/…/golden.rs 1e-6 (eigenvalues, |PC|, |loadings|)
Connectedness (Diebold-Yilmaz) — connectedness self-authored GFEVD (Diebold-Yilmaz 2012), documented from a VAR connect.json tsecon-connect/…/golden.rs GFEVD matrix 1e-8; to/from/total 1e-6
Local projections — lp, lp_iv (lp_state is not golden-pinned) statsmodels OLS + Newey-West HAC and linearmodels IV2SLS (kernel-HAC) — independent package. The fixture holds goldens for lp and lp_iv only. lp_state has no reference value anywhere: it is validated by property tests — the two-regime effect is recovered on a seeded DGP with the high-state impact strictly larger — in properties.rs lp.json tsecon-lp/…/golden.rs; lp_state: properties.rs OLS β 1e-10 / HAC se 1e-8; IV β 1e-8 / se 1e-6; lp_state property bounds only
LP integral multiplier — lp_multiplier no package computes this estimand: independent NumPy re-implementation of the just-identified 2SLS (same sample, same control set) + the published Ramey-Zubairy (2018) headline on the authors' vendored data + a known-multiplier DGP and an outcome-only-trap regression guard ramey_zubairy.csv tsecon-lp/…/properties.rs + test_lp_multiplier.py + test_replication_ramey_zubairy.py 2SLS = reduced-form ratio 1e-9 rel; RZ multiplier in (0.5, 0.8) at h ∈ {4,8,12,16,20}; known-DGP recovery ±0.15
Sign-restricted SVAR — sign_restricted_svar published-result replication (Uhlig 2005, JME 52(2)) on the paper's own data — VAR(12), his K=5 restriction set: no price puzzle (deflator 84% quantile < 0 through month 60) and the ambiguous output response (68% band straddling zero, months 6–60) pinned offline in test_replication_uhlig.py on uhlig2005.csv — plus the existing property/simulation tier: Haar-uniform rotation moments (Mezzadri 2007), sign-checker behavior (flips, bands, infeasible patterns), and a simulated-DGP check that the identified-set bands cover the true structural IRF, infeasible restrictions report zero acceptance, and output is bit-exact reproducible and max_tries-batching invariant at a fixed seed none — in-test simulated VAR(1) with a known impact matrix tsecon-ident/…/haar.rs, sign.rs, dgp_validation.rs property bounds; seed reproducibility bit-exact
Zero + sign SVAR — zero_sign_svar documented-formula cross-implementation golden (the generator transcribes Theta_h = Psi_h chol_lower(Sigma) from the pure companion-power MA recursion in NumPy, never importing tsecon): the primary anchor is the recursive/Cholesky recovery — strict-upper-triangle impact zeros, no signs, positive-diagonal normalization — which the RWZ null-space recursion reproduces deterministically (ARW weight = 1), validating cholesky_irf and the recursion at once; an end-to-end binding check confirms the same pattern matches var_irf(orth=True) through the Minnesota-NIW posterior. Sign behavior, feasibility, and seed reproducibility are property-tested zero_sign_svar.json tsecon-ident/…/zero_sign.rs theta 1e-10; recursive ≡ Cholesky; reproducibility bit-exact
Structural identification (advanced) — long_run_svar, max_share_svar, proxy_svar, hetero_svar documented-formula cross-implementation goldens (each generator transcribes the published closed form in independent NumPy/SciPy and never imports tsecon): Blanchard-Quah via NumPy LU inverse + Cholesky (vars::BQ); max-share via numpy.linalg.lstsq/cholesky + eigensolver (leading eigenvector); proxy via statsmodels VAR MA-rep + NumPy method-of-moments; heteroskedasticity via pooled OLS + the NumPy generalized eigenproblem recovering a known B; published-design replication at figure-reading resolution for long_run_svar: Blanchard-Quah (1989) on the bundled statsmodels macrodata (1959–2009 real GDP and unemployment — the paper's 1948–1987 GNP vintage is unreachable, so no numerical parity with its tables is claimed) with the paper's design (1974Q1 mean break, detrended unemployment, VAR(8)): the hump-shaped, vanishing demand effect on output (+1.10 at h = 3, −0.004 at h = 40), the permanent supply effect (+0.48), the mirror-image unemployment response (−0.19 impact, −0.55 trough), supply raising unemployment on impact (+0.14), demand's share of short-horizon output variance (89–97%) and of unemployment's (65–91%), seeded residual-bootstrap bands bracketing each, and the recession decomposition (demand > half the rise in unemployment in all seven NBER recessions) — pinned offline in test_replication_blanchard_quah.py, plus a dual golden of the identification against a NumPy transcription of the closed form on a statsmodels VAR(8) fit long_run_svar.json, max_share_svar.json, proxy_svar.json, hetero_svar.json, macrodata_bq.csv tsecon-ident/…/long_run.rs, max_share.rs, proxy.rs, hetero.rs, test_replication_blanchard_quah.py long-run 1e-10 & max-share 1e-10 (crate golden; 1e-8 fed through the reduced-form binding); proxy 1e-9 rel / 1e-11 abs; hetero B 1e-8 / IRF 1e-7; variance-ratio MC recovery 5e-2; BQ replication: shape claims with stated bands (demand → output peak at h ∈ [1, 8],
Proxy-SVAR bootstrap bands — proxy_svar_bands documented-formula golden — NOT an independent-package match. No external package implements Jentsch-Lunsford moving-block bands for this estimand (R svars has a moving-block bootstrap, but for its own identification schemes), so there is no third-party number to copy. The generator transcribes the documented algorithm into plain NumPy — statsmodels' VAR cross-checks the reduced form — and never imports tsecon; the block starts are pinned in the fixture so the RNG becomes a shared input and everything downstream (position-wise centering, recursive reconstruction, re-estimation, per-draw re-identification and re-normalization, Hall and Efron endpoints, se, the per-draw diagnostic series, the failure accounting) is compared cell for cell. That pins the arithmetic, not the theory. The theory is carried separately by property tests (seed bit-reproducibility, the h=0 cell of norm_var exactly degenerate at unit — the free proof the normalization is inside the loop, joint vs. independent blocking, Hall ≠ Efron under skew, failure counting, sign-flipped draws retained) and by seeded Monte-Carlo coverage on a known-truth proxy-SVAR DGP against two references on the identical data (the wild arm and the crate's Cholesky residual bootstrap): nominal 0.90, measured 0.860 at impact for the moving block against 0.113 for the wild arm, whose common-Rademacher draw leaves the identifying moment bit-identical (verified 200/200, max deviation 0.000e+00) proxy_svar_bands.json tsecon-var/…/proxy_bands_golden.rs, proxy_bands_props.rs golden rtol 1e-10 asserted (largest observed deviation 6.7e-16); impact cell degenerate exactly; MC coverage bands at ~150 reps (MC se ~0.025)
Weak-IV-robust proxy-SVAR sets — proxy_ar_sets co-derived documented-formula transcription + brute-force grid inversion — NOT an independent-package match, and the golden is not the load-bearing leg. The fixture generator takes its reduced form from statsmodels but writes the Anderson-Rubin algebra as a plain-NumPy transcription of the same specification by the same author, so agreement is a cross-implementation check of the arithmetic, not a match against an independent authority. The load-bearing validation is a brute-force grid inversion: the closed-form quadratic is proved against a scan that re-tests AR(lambda) <= c directly at thousands of candidate values per cell, for every shape the set can take (interval, exterior, whole, empty, point, the one-sided rays) — this needs no external reference at all. Third, the reduced-form correction psi_reduced_form_cov is checked against a numerical Jacobian built by perturbing VAR coefficients one at a time (no Kronecker product, no companion matrix, no shared code with the analytic route), and required to widen every set while leaving A, q0, v2 bit-identical so weak-instrument robustness cannot regress. Plus exact properties (unit-equivariance, nesting in the level, NaN-prefix invariance, the point estimate always a member, boundedness all-or-nothing, sets genuinely asymmetric about the point — the Wald detector) and seeded Monte-Carlo coverage under a strong and a weak instrument, with known-Psi and estimated-Psi arms proxy_ar.json tsecon-ident/…/proxy_ar.rs, proxy_ar_coverage.rs golden rtol 1e-9 / atol 1e-11; grid inversion exact per shape; MC coverage nominal 0.95 → measured 0.952 (h=0) to 0.913 (h=8) propagated, 0.952 to 0.119 omitted
Non-Gaussian / ICA SVAR — nongaussian_svar documented-formula cross-implementation golden with an independent-package cross-check: the generator runs a self-contained NumPy FastICA (numpy.linalg.lstsq OLS, numpy.linalg.eigh whitening inverse-sqrt + decorrelation, numpy.tanh log-cosh contrast) that never imports tsecon, and additionally matches sklearn.decomposition.FastICA to ~4e-16 at generation — so the reference is a faithful FastICA, not a bespoke re-derivation. The core bit-matches impact B, whitened rotation Q, per-shock excess kurtosis, structural IRF, the column ordering, and the convergence flag/iteration count. The statistical-identification claim is carried separately by seeded-MC property tests: recovery of the true DGP B up to sign + permutation on non-Gaussian data, a fourth-order cross-dependence reduction versus the raw whitened residuals, plus BB' = Σ_u, Q orthogonal, and bit-exact reproducibility (honestly weaker than a closed-form golden — the ICA core is exact, the recovery is a property) nongaussian_svar.json tsecon-ident/…/nongaussian.rs core 1e-10 (achieved ~1e-15 vs NumPy); true-B MC recovery 5e-2; reproducibility bit-exact
Structural FEVD & historical decomposition — structural_fevd, historical_decomposition independent reference-impl goldens (generators never import tsecon): FEVD's Cholesky case cross-checked against statsmodels VARResults.fevd and tsecon-var var_fevd (exact), the general-A0 shares pinned by exact invariants (each row sums to 1 and denominator rotation-invariance under a random orthogonal Q); HD via a self-contained ~60-line NumPy VAR(2)-by-OLS + Cholesky reference for shocks/Θ_s/hd/baseline, anchored by the exact adding-up identity y = baseline + Σ_j hd (holds for any invertible A0) structural_fevd.json, historical_decomposition_chol.json tsecon-ident/…/structural_fevd.rs, historical_decomposition.rs (+ src/shocks.rs, src/histdecomp.rs unit tests) FEVD vs statsmodels 1e-10; row-sum & rotation invariants 1e-12; HD cells rtol 1e-8 / atol 1e-10; adding-up residual < 1e-9
Post-identification set tools — fry_pagan_svar, robust_svar_bounds, narrative_svar mixed strength, honestly graded. Fry-Pagan: the selection rule is validated exactly against an independent NumPy median/dispersion/MT-statistic/argmin on stored candidate IRFs (the estimand inherits the set-identification caveat — one interior point under the Haar prior). Giacomini-Kitagawa: independent NumPy Gafarov-Meier-Montiel-Olea (2018) active-set closed form (single restricted shock, exact) plus a ≥10⁶-draw brute-force random-sphere search that must bracket the analytic optimum from the inside; multi-shock bounds are the marginal identified set (conservative outer approximation, inside-bracket only). Narrative: reweighting-invariance (no/redundant narrative ⇒ uniform weights, bands = sign_restricted_svar bit-for-bit) + a deterministic weight-formula unit test vs brute-force high-K P(N|S); the underlying HD core carries the strong closed-form golden in the row above fry_pagan_svar.json, robust_svar_bounds.json tsecon-ident/…/fry_pagan.rs, src/robust_bounds.rs, src/narrative.rs FP mt_index/mt_statistic 1e-10 + seed bit-exact; GK single-shock 1e-8 & inside-bracket, aggregation 1e-10; narrative reweighting-invariance 1e-12 & weight-formula 3-σ MC
Bayesian BVAR (conjugate NIW) — bvar_fit (bvar_irf_draws is not golden-pinned) documented closed-form conjugate NIW posterior (NumPy / SciPy multigammaln). The fixture pins the Minnesota prior and the posterior moments / log-marginal-likelihood. bvar_irf_draws is a sampler and has no golden; it is property-tested (draw shapes, sanity, seed reproducibility) in properties.rs, with binding-side checks that a 90% credible band contains the 68% one pointwise and that cumulative bands come from cumulating the draws rather than the bands. The 0.6 posterior surface (omega_bar/s_bar/v_bar) is validated by a seeded NIW Monte Carlo at the binding: 40,000 (B, Σ) draws from the documented posterior (scipy.stats.invwishart + matrix-normal in the documented Kronecker order) reproduce the documented marginal coefficient-sd one-liner per coefficient within 5% relative, and sigma_posterior_mean == s_bar/(v_bar−K−1) at 1e-12 bvar_niw.json tsecon-bayes/…/golden.rs; bvar_irf_draws: properties.rs, test_intervals.py; posterior surface: test_binding_gaps.py Minnesota prior 1e-10; posterior moments and log-marginal-likelihood 1e-9; IRF draws: property bounds only; marginal-sd MC 5% rel (seeded)
Hierarchical BVAR (empirical-Bayes / ML-II) — bvar_hierarchical documented-formula cross-implementation: independent NumPy/SciPy re-implementation of the Kadiyala-Karlsson (1997, eq. 3.6) matrix-variate-t marginal likelihood maximized with scipy.optimize (Giannone-Lenza-Primiceri 2015) — same estimand, different numerical path, not an independent authority — pinned under both scale_ar conventions; published-design replication on nearby public data (GLP 2015 application design verified against the authors' own setpriors.m — macrodata stand-ins for the Stock-Watson variables) in test_replication_glp.py, and — with scale_ar=1 on the authors' own committed panel — a Figure-1 point replication (0.420 vs 0.449±0.03 small, 0.1716 vs 0.172±0.01 medium) in test_replication_glp_point.py bvar_hierarchical.json, glp_smallvar.csv tsecon-bayes/…/hierarchical.rs grid log-ML 1e-9; selected λ₁ 1e-8; posterior moments 1e-4; ML-II dominance certificate 1e-6
SSVS-BVAR — bvar_ssvs no closed-form golden (a Gibbs sampler): property / simulation-recovery — on a stable sparse VAR(2) DGP the posterior inclusion probabilities must go near 1 on the true non-zeros and near 0 on the true zeros; plus seed reproducibility, output shapes, the covariance-selection path, the multi-chain diagnostics, and the input guardrails. The closed-form conditional-moment anchors and the block-1 draw kernel are checked in the crate's src/ssvs.rs unit tests ssvs.json (sparse-VAR DGP + masks; data simulated in-Rust from a tsecon_rng::Stream) tsecon-bayes/…/ssvs.rs MC recovery thresholds (deterministic at the fixed seeds)
MCMC diagnostics — mcmc_diagnostics ArviZ (rhat, ess_bulk, ess_tail) — independent package convergence.json tsecon-bayes/…/golden.rs 1e-9
GMM / IV-GMM — iv_gmm (gmm_nonlinear is not golden-pinned) linearmodels IVGMM — independent package — for the 2-step robust fit, the kernel-HAC 2-step fit at the automatic Newey-West bandwidth (the golden that did not exist before the 0.2.0 bandwidth fix), and the first-stage Wald, converted to the Stata-convention HC1 F through an identity the test re-asserts from the raw lm_wald_chi2_hc0. gmm_nonlinear has no golden: linearmodels implements no nonlinear GMM, so it is validated by property tests (the driver recovers the analytic mean/variance method-of-moments solution; exact identification collapses GMM to IV for any weight) in properties.rs gmm.json, gmm_first_stage.json tsecon-gmm/…/golden.rs; gmm_nonlinear: properties.rs params 1e-9; bse 1e-6; Hansen J & p 1e-6; HAC 2-step params / bse / J 1e-12 and bandwidth exact; first-stage F 1e-12, p 1e-11, dof exact; gmm_nonlinear property bounds only
Cointegration — johansen, vecm statsmodels coint_johansen, VECM — independent package — deterministic="n" (coint.json) and every deterministic case: "n"/"co" on seeded drifting cointegrated data, arbitrating that deterministic="co" spans exactly the cointegrating space coint_johansen (det_order=0) tests while the "n" default diverges (β cosine ~0.63 pinned as documented behavior — field item 12); all nine statsmodels cases ("n"/"co"/"ci"/"lo"/"li"/"colo"/"coli"/"cilo"/"cili", incl. the restricted rows det_coef_coint of the widened cointegrating matrix) on seeded trending data with the cross-case β cosines pinned and coint_johansen(det_order=1) pinned as the asymptotic analogue of "colo" (β cosine ~1−6e-9, honestly not exact); centered seasonal dummies (seasons=4, incl. nonzero first_season) on a seeded quarterly pair; and the pre-existing "n"/"co" paths pinned bit-identical to their 0.6.0 output coint.json, vecm_deterministic.json tsecon-coint/…/golden.rs, tsecon-coint/…/vecm_deterministic_golden.rs, vecm_bit_identity.rs eigenvalues 1e-8; trace/max-eig LR 1e-6; VECM α/β/det_coef_coint/Γ/det_coef/Σᵤ/llf 1e-6 (measured ≤ ~1e-11 per case); evec 1e-6 up to column sign; co↔johansen β cosine 1 ± 1e-10; "n"/"co" regression bit-exact
Engle-Granger two-step — engle_granger statsmodels tsa.stattools.coint — independent package — across seven systems (six simulated, one real: log consumption on log GDP and log investment from statsmodels' macrodata), three deterministic specifications and every lag rule (aic / bic / t-stat / fixed); step-1 cointegrating coefficients pinned too. Two behaviours deliberately go beyond statsmodels and are pinned as such: N > 6, where coint raises IndexError and this crate returns a NaN p-value beside the published 2010 critical values, and the near-perfect step-1 fit, where coint warns and returns -inf with p = 0 and this crate returns a named error engle_granger.json tsecon-coint/…/engle_granger_golden.rs stat & step-1 coefs 1e-10; critical values 1e-11; p-value atol 1e-14 / rtol 1e-9 (the surface reaches ~1e-27 in the deep tail)
Cointegrating regressions — fmols, dols, ccr arch 8.0.0 unitroot.cointegration.{FullyModifiedOLS, DynamicOLS, CanonicalCointegratingReg} — independent package — across three seeded systems (k_x = 1, k_x = 3 with drift, a T = 60 small sample), all four trends (n/c/ct/ctt), the three kernels, explicit / automatic / forced-integer bandwidths, df_adjust, diff, x_trend, both DOLS covariance types, the three criteria, common and capped lead/lag searches: 56 FM-OLS, 56 CCR and 39 DOLS cases on params, cov, resid, , the bandwidth used and the selected leads/lags; the residual-system long-run covariances and arch's automatic bandwidth pinned separately against arch.covariance.kernel, the univariate case asserted equal to tsecon-hac's lrv. Two blocks are documented-formula goldens, recorded as such in the fixture: the "andrews" bandwidth rule (Andrews 1991 closed form; estimates are arch's at that bandwidth) and ccr under df_adjust (the documented T/(T−k) scaling of ω₁.₂ ships; arch 8.0 scales only ω₁₁ by a precedence slip, its raw value stored and asserted to differ). The default DOLS search arch runs underdetermined at T = 60 is pinned as a refusal. Real-data illustration (derived numbers only) on Wooldridge intdef and Ecdat Tbrate via get_rdataset, re-pinned by the Python suite. Statistical claims by seeded MC (fmols_properties.rs): super-consistency (mean T·|β̂−β| flat over T = 100/400/1600), the OLS second-order bias removed (mean T(β̂−β) at T = 200: OLS +4.13 (MC se 0.34) vs FM-OLS +1.29, CCR +1.32, DOLS +0.50), t-statistic size (reject @5% at T = 400: FM-OLS 0.107, CCR 0.113, DOLS 0.107 — liberal by about two, the kernel-LRV under-estimation of a persistent error; plain OLS 0.420) fmols.json tsecon-coint/…/fmols_golden.rs, fmols_properties.rs, test_fmols.py 1e-10 rel on every pinned quantity (p-values atol 1e-14 / rtol 1e-9); kernel weights 1e-12; MC bands as stated
OU spread utilities — ou_fit, spread_zscore closed-form + statsmodels AR(1) golden + MC-measured kappa bias and CI coverage. The exact-discretization AR(1) leg (c, phi, eta2, both SEs, loglik): statsmodels AutoReg(x, lags=1, trend='c') — independent package, same estimator through an independent lstsq path — on five seeded cells including a phi_hat > 1 explosive cell (pinning the honest mean_reverting=False branch) and a weakly-identified cell (pinning the half-life CI's +inf upper endpoint). The OU mapping on top (kappa/mu/sigma + delta-method SEs + level-scale half-life CI) is a documented-formula golden (NumPy transcription in the generator docstring) and is asserted bit-for-bit against a summation-order-identical closed-form reimplementation in the crate test; identities half_life·kappa = ln 2, e^{−kappa dt} = phi, stationary variance at float round-off. The finite-sample kappa bias (~4/span; Kendall 1954 / Tang-Chen 2009) and the coverage of the shipped level-scale vs the rejected log-scale half-life CI are Monte-Carlo measured (2000 reps × 8 cells; table in the cointegration model card) — the bias is documented, deliberately not corrected ou.json tsecon-coint/…/ou_golden.rs, test_ou.py, ou_kappa_bias_coverage.py AR(1) leg vs statsmodels 1e-10 fixture / 1e-12 live (achieved ~1e-15); OU mapping bit-for-bit (same summation order) and 1e-10 vs NumPy; identities 1e-12–1e-15; bias/coverage MC-measured, not asserted to nominal
Markov-switching AR — markov_switching_ar statsmodels MarkovAutoregression — independent package — plus the published Hamilton (1989) Table I on the author's vendored GNP data (dual golden: paper + cross-package on identical data, statsmodels itself anchored to its E-views benchmark) regime.json, hamilton_gnp.csv tsecon-regime/…/golden.rs, test_replication_hamilton_markov.py 1e-6 (fixed-param loglike, filtered/smoothed probs); Hamilton fit: published values ±0.02–0.03 (printed digits + the documented EM-vs-MLE O(1/T) gap, ≤0.016 measured; common AR φ ≤0.0048 measured), statsmodels cross-fit ±0.01–0.02 (AR φ ≤0.0043 measured), recession calls bit-identical
Conformal forecast intervals — conformal_forecast / conformal_backtest (split / EnbPI / ACI) mixed, graded per leg: split-leg quantile cross-checked against mapie's SplitConformalRegressor (identical residuals, half-width to 1e-12 rel — runnable third-party); the exchangeable-case finite-sample guarantee anchored by seeded MC (2000 reps at calib=20, coverage within 2 MC se of the 19/21 target); ACI is an exact cross-check against mapie 1.5.0 TimeSeriesRegressor(method="aci", conformity_score=AbsoluteConformityScore(sym=True)) (0.10.0, VM-01 closed): with the same prefit linear point forecaster (a Python callable), the same 75-residual sliding window and step size, per-origin bounds at 1e-12 rel and miss indicators and the α_t used at every origin exact, on γ = 0.05 (coverage 0.8933, final α_t 0.0750) and γ = 0.005 (0.9067, 0.1025). sym=True is required: TimeSeriesRegressor defaults to sym=False, an asymmetric signed-residual quantile pair rather than the absolute-score construction the ACI paper specifies — generate_conformal_mapie_fixtures.py records that and the three remaining differences that do not fire here (mapie clips α_t to [0, 1]; mapie counts a target on a bound as a miss; past the window's last order statistic mapie returns an infinite bound where conformal_backtest refuses the call — worst index 74 of 75 on these runs); EnbPI is a statistical cross-check against TimeSeriesRegressor(method="enbpi", cv=BlockBootstrap(length=1)): same algorithm, different bootstrap generators, the +1 finite-sample correction in mapie vs the paper's empirical quantile here, different β grids — so realized coverage within 0.06, mean width within 10% and mean absolute centre gap below 0.05 are asserted on the same AR(1) online run (measured, β line search off / on: coverage 0.9067 both sides / 0.9067 vs 0.9333, mean width 3.4024 vs 3.4830 / 3.3117 vs 3.6106, centre gap 0.0106); the property-MC grade of the earlier rounds still stands — AR(1)/GARCH-noise marginal coverage 0.888–0.936 at nominal 0.90, and the Gibbs-Candès shift scenario reproduced (post-shift: split 0.705, ACI γ=.05 0.892; lab/experiments/results/exp06.md) seeded DGPs in-test (no fixture); conformal_mapie.json test_conformal.py, test_conformal_mapie.py, tsecon-forecast/…/conformal.rs MC bands asserted; mapie split 1e-12 rel; mapie ACI bounds 1e-12 rel, misses/trajectory exact; mapie EnbPI coverage ±0.06, width ±10%, centres < 0.05 (statistical)
Forecasting metrics & tests — dm_test, cw_test, gw_test, theta_forecast, accuracy (backtest is not golden-pinned) documented hand-computed metrics + statsmodels ThetaModel + self-authored CW/GW. backtest is an evaluation engine, not an estimand, and the fixtures hold no backtest block. It is validated by pinned-alignment and guardrail tests — the (origin, horizon, target) alignment against hand-rolled slicing, expanding vs rolling window widths, the infrequent-refit contract, perfect-foresight ⇒ zero errors, and the degenerate-input errors — in backtest.rs. The 0.6 Python-callable forecaster path (forecaster=/conformal base= callables) is validated at the binding in test_backtest_callable.py: spy-recorded training windows equal the documented slices exactly (both schemes + refit-block walk), a perturbation test pins no-leakage without trusting the spy, a Python naive is bit-identical to the string path, statsmodels AutoReg(lags=p, trend="c") reproduces the Rust "ar" conformal base at 1e-6 rel (different least-squares routes), and the pre-existing string paths are pinned bitwise against the pre-callable build (backtest_string_snapshot.json, float-hex) forecast.json, forecast_eval2.json tsecon-forecast/…/golden.rs; backtest: backtest.rs; callable path: test_backtest_callable.py metrics 1e-14; theta forecast 1e-6 (b0 1e-10, seasonal 1e-8); DM 1e-10; CW 1e-9; GW stat 1e-10 / p 1e-8; backtest exact alignment assertions, no reference tolerance; callable path: windows exact, string snapshot bitwise, AutoReg≡"ar" 1e-6 rel
Machine learning — ridge, lasso, elastic_net (adaptive_lasso, lasso_path are not golden-pinned) scikit-learn Ridge, Lasso, ElasticNet — independent package. The fixture's five cases are two Ridge, two Lasso and one ElasticNet fit — nothing else. adaptive_lasso and lasso_path have no reference value: they reuse the golden-pinned coordinate-descent core but are themselves validated by property tests (adaptive weighting zeros the design's true zeros more reliably than plain LASSO at matched shrinkage; the path starts fully sparse at lambda_max and its AIC/BIC selectors pick up the signal) in properties.rs ml.json tsecon-ml/…/golden.rs; adaptive_lasso / lasso_path: properties.rs 1e-6 (achieved ~1e-9) on the three pinned estimators; property bounds for the other two
Kernel ridge regression — kernel_ridge (exact mode; the rff_features random-Fourier-feature mode is not golden-pinned) scikit-learn 1.9.0 KernelRidge — independent package. dual_coef_, predict(X) and predict(X_test) for two parameterizations of each of the four kernels (rbf, laplacian, polynomial, linear; gamma=None -> 1/n_features, alpha on the Ridge scale), eight cases on a seeded n = 60, p = 3 design. The random-Fourier-feature approximation (Rahimi-Recht 2007) is a seeded Monte-Carlo object with no reference value: property-tested in kernel_properties.rs — same seed bit-identical, different seeds differ, RMSE against the exact fit 0.307 → 0.049 → 0.016 at D = 20, 200, 2000 kernel.json tsecon-ml/…/kernel_golden.rs, test_kernel.py 1e-8 (achieved 2.2e-12) on all three pinned quantities; property bounds for RFF
Kernel regression — kernel_regression (Nadaraya-Watson and local linear, product Gaussian kernel, k = 1, 2) mixed, graded per leg. Leg 1 (independent package): statsmodels 0.15.0 KernelReg(reg_type="lc"|"ll", var_type="c"*k) at user-specified bandwidths — fit() at the training rows and at x_test, twelve cases (three bandwidths × both estimators × k = 1, 2), plus the leave-one-out criterion KernelReg.cv_loo(bw, func) at the same twelve bandwidths and at statsmodels' own bw="cv_ls" optimum. Leg 2 (documented-formula transcription, NumPy in the generator): the leave-block-out criterion (Chu-Marron 1991, half-widths 2 and 5) and the effective degrees of freedom tr(S) — no package computes either; the transcription reproduces cv_loo at l = 0 and fit() at 1e-12 (asserted at generation, recorded in _meta.transcription_checks). The selected bandwidth is not pinned (the search is a log grid + golden section, not statsmodels' fmin): property — the criterion it reaches is no worse than at statsmodels' cv_ls optimum on all four (series, estimator) cases, and it is a local minimum (±5%); block-CV wider than LOO on 10/10 AR(1) seeds; bandwidth_at_boundary proven to fire on pure noise kernel.json tsecon-ml/…/kernel_golden.rs, kernel_properties.rs, test_kernel.py fitted/predicted 1e-8 (achieved 6.7e-15); cv_loo 1e-10 (achieved 3.0e-15); block-CV and tr(S) transcriptions 1e-10 (achieved 2.7e-15 / 3.6e-15); selected bandwidth by property
Group / sparse-group LASSO — group_lasso Two grades, both stated. Optimality certificate (primary): an independent evaluation of the subgradient KKT conditions of the stated objective (1/(2n))‖y − Xb‖² + α[(1 − l1)Σ_g w_g‖b_g‖₂ + l1‖b‖₁], written in the test (inactive groups ‖S(−∇_g, α l1)‖₂ ≤ α(1 − l1)w_g; active coordinates ∇_j + α(1 − l1)w_g b_j/‖b_g‖ + α l1 sign(b_j) = 0; zero coordinates of active groups |∇_j| ≤ α l1) — rigorous for a convex problem. Independent package: skglm 0.5 (GroupLasso at l1_ratio = 0; WeightedL1GroupL2 + GroupBCD for the sparse-group cases; run to tol = 1e-12, same 1/(2n) objective, weights (1 − l1)w_g / l1), ten cases over two designs (contiguous correlated blocks; scattered non-contiguous unequal labels), three weight conventions, l1 ∈ {0, 0.2, 0.3, 0.5, 0.9, 1}; the fixture records skglm's own KKT residual per case (worst 5.7e-13), which bounds the agreement. The l1 = 1 case is scikit-learn Lasso. Reductions to the crate's scikit-learn-pinned lasso (l1 = 1 for any grouping/weights; singleton groups at l1 = 0; custom-weighted singletons ≡ column-rescaled lasso), alpha_max (NumPy transcription; zero just above, nonzero just below), scale equivariance over sixteen decades at both shipped tolerances, relabeling/permutation invariance, and the converged=False honesty flag, in structured_properties.rs. group-lasso (Moe) was evaluated and rejected as a reference (FISTA, ~1e-4) structured.json tsecon-ml/…/structured_golden.rs; structured_properties.rs; Python re-pin + NumPy KKT re-evaluation in test_structured.py KKT residual ≤ 1e-8 (achieved 2.3e-13); skglm / scikit-learn coefficients 1e-8 abs (achieved 1.5e-12); reductions 1e-8 (achieved ~1e-13); alpha_max 1e-12 rel; objective ≤ reference + 1e-12
Post-LASSO OLS — post_lasso (no standard errors, by design) scikit-learn Lasso / ElasticNet (tol = 1e-12, fit_intercept=False) for the support and first stage, LinearRegression(fit_intercept=False) on the selected columns for the refit — independent package; three cases (α = 0.1, 0.2 LASSO; α = 0.1, l1 = 0.5 elastic net). Refit's OLS normal equations on the support and exact off-support zeros by property structured.json structured_golden.rs; structured_properties.rs; test_structured.py support exact; refit 1e-10 abs (achieved 8.4e-15); first stage 1e-6 (achieved 1.5e-12); rss 1e-10 rel
Post-double-selection — pds_lasso Mixed, graded per leg. Exact leg — independent package: statsmodels OLS(...).fit(cov_type="HAC", cov_kwds={"maxlags": L, "use_correction": True}, use_t=False) and cov_type="nonrobust", use_t=False on [d, X_union], with the union forced to all 30 controls (L = 4 via the None → Newey-West rule path, 8, 0) and with the BIC-selected union (L = 4, 0; alpha_y/alpha_d against scikit-learn lasso_path on the crate's grid with the BIC n ln(RSS/n) + ln(n) df transcribed in the generator); the convention matched is Bartlett, n/(n − k) correction, normal reference distribution. Coverage legMonte-Carlo grade, not a golden: R hdm / Stata pdslasso are not runnable in the reference environment, and coverage is a repeated-sampling property; the seeded design (n = 400, p = 40 AR(1) controls ρ = 0.5, AR(1) errors ρ = 0.3 in both equations, four confounders with γ = ±1 on d and β = ±0.15 on y) measures PDS at 0.950, the infeasible oracle at 0.953, and the Belloni-Chernozhukov-Hansen single-selection comparator (LASSO of y on x with d unpenalized, then OLS) at 0.003 (300 replications, MC s.e. 0.013). A second cell (n = 200, ρ = 0.5 in both error processes) measures the HAC engine's own small-sample shortfall — oracle 0.930, PDS 0.903, single 0.153 — and asserts PDS tracks the oracle rather than that either hits 0.95 structured.json structured_golden.rs; coverage in structured_properties.rs (pds_covers_where_single_selection_does_not, always on: n = 200, p = 16, 80 replications — PDS 0.938, oracle 0.963, single 0.075; pds_coverage_full_measurement, the two 300-replication cells above, #[ignore]d — run with --release --ignored); test_structured.py coef/se/t_stat/conf_int 1e-8 rel (achieved 9.8e-15); p_value 1e-12 abs; alpha_y/alpha_d 1e-10 rel; supports exact; coverage: PDS within 0.95 ± 3 MC s.e. and within 3 s.e. of the oracle, single selection < 0.5 (cell A); PDS within 3 s.e. of the oracle, single < 0.5 (cell B)
Regression tree — regression_tree scikit-learn 1.9.0 DecisionTreeRegressor(criterion="squared_error", splitter="best", max_features=None)independent package. Float32-representable Friedman #1 design (n=300, p=8, 120 test rows), eight (max_depth, min_samples_leaf, min_samples_split) settings from depth 2 to unbounded. The generator refits every stored case under five other random_state values and asserts the identical tree, proving no RNG-dependent tie-break was exercised (scikit-learn breaks an exact tie between features by its private RNG's visit order; this tree by the lowest index); two candidate settings that did exercise one are recorded in _meta.excluded_settings, and unbounded depth with min_samples_leaf=1 is excluded by design (every two-row node ties). Features are stored float32-rounded because scikit-learn grows and predicts in float32 trees.json tsecon-ml/…/trees_golden.rs, test_trees.py training fit and test predictions 1e-12 (achieved 1.1e-14); n_nodes/n_leaves/depth exact; feature_importances_ 1e-10 (achieved 3.3e-14); split multiset — features exact, thresholds 1e-12 (achieved 0)
Random forest — random_forest mixed, graded per leg. Leg 1 (exact bridge to the independent-package golden): random_forest(bootstrap="none", max_features="all", n_trees=1) reproduces regression_tree bit-for-bit on every fixture setting and at the tie-heavy unbounded/min_samples_leaf=1 setting, so the forest's tree grower is the scikit-learn-pinned one. Leg 2 (property / Monte-Carlo — the forest's randomness is tsecon's own Philox stream, one SeedSequence substream per tree, so no third-party golden can exist): same seed bit-identical, different seed differs, 1/3/8 rayon threads and the global pool identical; Friedman #1 (n=500/500, p=10, 300 trees) out-of-sample R² 0.79 with the iid out-of-bag R² 0.78 within 0.05; lag-1 autocorrelation of an AR(0.9) series 0.90 → iid resample −0.01, moving-block(20) 0.84, stationary(20) 0.84; OOB optimism on the same forest (persistent logistic-AR(0.9) predictors, fit 400 rows / scored on the next 200, five seeds): OOB/POOS MSE ratio 0.84 with iid errors, 0.70 with AR(0.9) errors — sign asserted (< 0.9) and the AR ratio asserted below the iid one; quantile forest on iid heteroskedastic data: q10-q90 band covers 0.88 of 400 test targets for a nominal 0.80 (conservative, Meinshausen's small-leaf over-coverage; asserted in [0.75, 0.95]), q05-q95 0.943, quantiles never cross (exact by construction), median-vs-mean correlation 0.995; importance: impurity and block-permutation both rank the five relevant Friedman columns first (impurity min-relevant/max-irrelevant 0.057/0.022; permutation 1.09/0.046 in y² units); persistent irrelevant AR(0.95) unit (two lags): about zero (−0.02) under iid relevant predictors vs 0.11 under persistent ones (inflation asserted > 0.1), grouped single-row 0.114 vs grouped block(20) 0.108 — asserted equal within half the inflation, i.e. block permutation does not deflate the inflation (per-lag naive permutation 0.093: ungrouped permutation dilutes) none (property grade) tsecon-ml/…/trees_properties.rs, test_trees.py bridge exact (bit-for-bit); R² > 0.70; block/stationary lag-1 > 0.7 and iid < 0.1; OOB/POOS < 0.9 under AR errors and < iid ratio − 0.05; coverage in [0.75, 0.95]; importance top-5 set exact; inflation > 0.1; row-vs-block gap < 0.5 × inflation
L1 trend filtering — l1_trend_filter (penalty="l1", orders 1 and 2; penalty="l2" is the Hodrick-Prescott form) mixed, graded per leg. (1) Optimality certificate — the primary grade for a convex problem: the tests re-derive the KKT / duality-gap certificate for the crate's own trend from scratch (dual variable recovered from the residual by order negative cumulative sums, clipped into the dual box; P(x) - G(v) is an upper bound on P(x) - P* by weak duality), independent of every solver including the fixture's; (2) independent package — cvxpy 1.9.2 + Clarabel 0.11.1 interior-point solutions converged at Clarabel's 1e-14 tolerance, each reference's own relative gap recorded in the fixture (1.6e-16 to 1.6e-12) and asserted below 1e-11; (3) closed-form limitslam_max = ‖(DD')⁻¹Dy‖_∞ and the np.polyfit least-squares polynomial at lam ≥ lam_max; (4) penalty="l2": the dense np.linalg.solve(I + lam D'D, y) closed form (documented formula) and the cross-surface identity with hp_filter (Python suite). Properties in convex_properties.rs: lam → 0 returns the data, lam_max is the exact knot threshold, off-knot differences are zero to rounding, scale equivariance across twelve decades, the converged flag fires on a starved budget and on a below-floor tol, wall time at n = 10000 convex.json tsecon-ml/…/convex_golden.rs; test_convex.py certificate: relative gap 1e-8 (achieved ≤ 3.3e-10 on the closed-form polynomial cases, ≤ 5.8e-11 on the interior-point cases, 1e-15 on order-1 cases); Clarabel trend 1e-8 abs (achieved 1.4e-10); lam_max 1e-10 rel; polynomial limit 1e-8 (achieved 1.4e-10); L2 vs dense 1e-10 (achieved 1.7e-12); hp_filter identity 1e-10 (achieved 1.4e-12)
Componentwise L2 boosting — boosting documented-algorithm transcription, not a third-party run: an independent dense NumPy transcription of Bühlmann & Yu (2003) / Bühlmann (2006) in the fixture generator — single-column least-squares base learners, greedy RSS selection with ties to the smallest index, F_0 = 0, and the boosting operator B_m = B_{m-1} + ν H_j (I − B_{m-1}) formed explicitly as an n × n matrix so tr(B_m) and the corrected AIC log(RSS/n) + (1 + df/n)/(1 − (df+2)/n) are exact by construction. The crate keeps the operator in a rank-m factored form and never forms the matrix; the pin proves the two bookkeepings agree. R mboost glmboost (the roadmap target) is not runnable in the build environment — an open follow-up, stated on the card. Properties: RSS nonincreasing, first-step trace exactly ν, the small-step / many-step limit is OLS on the selected support (3.3e-14), AIC stopping recovers a sparse truth's support, seedless determinism, wall time at n = 500, p = 50, 500 steps convex.json tsecon-ml/…/convex_golden.rs; test_convex.py coef_path, df_path, aic_path 1e-12 abs (achieved 6.7e-16 / 2.7e-15 / 1.6e-15); selected and best_step exact; fitted vs B_best y 1e-10 (achieved 3.6e-15); predicted 1e-12
Neural — mlp_regression (mechanics golden-pinned; the estimator is property-graded) scikit-learn 1.9.0 MLPRegressor — independent package — at sklearn's own fitted weights, never its optimizer trajectory: the fixture stores the converged coefs_/intercepts_ of four (architecture, activation) cases (tanh (16,), relu (8, 4), logistic (10,), tanh (12, 6), solver=lbfgs) and pins (a) the forward pass to sklearn predict on held-out rows, (b) the objective (1/(2n))‖y − f(x)‖² + (α/(2n))Σ‖W_l‖²_F to the sklearn-convention loss (formula, _backprop, and est.loss_ asserted identical in the generator), (c) the analytic gradient to sklearn's own _backprop at Glorot-scale random and at fitted weights (relu included) and to a central finite difference of our loss on the smooth activations, (d) the gradient inf-norm at sklearn's converged weights to the norm measured there (4.9e-5 … 2.2e-3 — scipy's L-BFGS-B stops on ftol; fixture bar 1e-2). The public estimator — Adam / L-BFGS training, temporal early stopping, the seed ensemble, the training-row scaler — has no trajectory reference and is validated by seeded property tests in neural_properties.rs (re-checked through Python on the release wheel in test_neural.py): y_t = sin(2 y_{t−1}) + 0.3 e_t recovered out of sample (Campbell-Thompson R²: mini-batch Adam and L-BFGS 0.76–0.90 across six data seeds, all-defaults 0.59–0.82, linear AR(1) 0.46–0.76, oracle 0.78–0.90); ensemble beats the mean member 10/10 (Jensen) and the median member 7/10 (Rust draws) / 10/10 (Python draws) on a documented overfitting DGP; early stopping fires on an easy problem and not at max_epochs=1; scaler bit-identical under perturbation of the validation rows; same seed bit-identical, different seeds differ neural.json tsecon-ml/…/neural_golden.rs (golden_mlp_*); estimator: neural_properties.rs forward 1e-12 (achieved 3.1e-15); loss 1e-10 (3.3e-16); gradient vs sklearn backprop 1e-10 (1.1e-15); gradient vs central difference 1e-6 relative (5.3e-8); gradient norm at the sklearn solution 1e-8 (5.2e-16); property bounds for the estimator
Neural — echo_state_network (mechanics pinned; the estimator is property-graded) Mixed, graded per leg. State recursion s_t = (1 − a)s_{t−1} + a tanh(W s_{t−1} + W_in u_t), s_0 = 0: a NumPy transcription of Lukoševičius (2012) eqs. 2–3 on an explicit 6-unit reservoir, which reservoirpy 0.4.2's Reservoir (same explicit W, Win, lr, bias=0) reproduced with max abs difference 0.0 at generation time — recorded in the fixture's _meta.esn.reservoirpy, so this leg is third-party-confirmed rather than transcription-only. Readout on [1, u_t, s_t] after the washout: the closed form (Z′Z + αI)⁻¹Z′y, cross-checked in the generator against scikit-learn Ridge(fit_intercept=False) (gap 6.6e-13) — independent package for the regression step. Spectral radius: numpy.linalg.eigvals on a 30 × 30 sparse random matrix (the rescaling to a target radius is pinned through it). Reservoir draws (Philox sparse-normal W, uniform W_in) have no reference and are covered by the seed contract. The public estimator is property-graded in neural_properties.rs / test_neural.py: NARMA-10 out-of-sample NRMSE 0.32 (mean over four data seeds, 0.26–0.41) with input_scaling=0.3 and otherwise default settings on 1000 training rows, 0.16–0.19 with reservoir_size=400 on 2000 rows (the all-defaults call, input_scaling=1, averages 0.43–0.46 and is reported, not asserted); spectral_radius_achieved within 1e-6 of the target; x_test states equal the tail of one long run (1e-14); same seed bit-identical, different seeds differ neural.json tsecon-ml/…/neural_golden.rs (golden_esn_*); estimator: neural_properties.rs states 1e-12 (achieved 1.7e-16); readout and fitted values 1e-10 (6.6e-13 / 1.4e-14); spectral radius 1e-6 relative (5.8e-15); property bounds for the estimator
Panel FE — panel_fe (panel_lp is not golden-pinned) linearmodels PanelOLS (nonrobust, entity-clustered, Driscoll-Kraay at bandwidth 4) — independent package — pinning slopes, standard errors and t-statistics on a y ~ shock_t + shock_{t-1} within design. The 1e-6 ceiling is set by the fixture, not the estimator: the generator stored y and shock rounded to six decimals but computed the golden from the full-precision arrays, so a from-scratch fit on the stored inputs cannot do better. panel_lp shares that pinned within machinery per horizon but has no reference value of its own; it is validated by recovery of the panel's analytically known response 0.8 · 0.6^h inside 4-σ Driscoll-Kraay bands panel.json tsecon-panel/…/golden.rs 1e-6 rel (slopes, se, t-stats; nobs exact); panel_lp: known-IRF recovery inside 4-σ bands, no reference tolerance
Heterogeneous panel MG / CCE-MG — panel_mean_group (mean_group_var is not golden-pinned) statsmodels OLS per-unit (independent) + documented MG / CCE averaging (Pesaran-Smith 1995 / Pesaran 2006). The fixture's mg and cce blocks pin panel_mean_group only. mean_group_var — the mean-group VAR — lives in a different crate, has no reference value, and is validated by simulation recovery: on a homogeneous panel of 25 identical stable VAR(1) entities it must recover the common A₁ and report positive, modest cross-entity dispersion tsecon-panelts.json tsecon-panelts/…/golden.rs; mean_group_var: tsecon-panel/…/golden.rs 1e-10 (coef, se, tstat, per-unit slopes); mean_group_var: recovery within 0.05 of the true A₁, no reference tolerance
Panel unit-root tests — panel_unit_root mixed, and the tight tolerances are not the independent-package leg. The per-unit ADF is a genuine statsmodels adfuller match, and Fisher is exact arithmetic on those p-values — that leg is strong. IPS and LLC are documented-formula transcriptions: the generator standardizes t_bar with the Im-Pesaran-Shin (2003) Table 3 moments and the Levin-Lin-Chu (2002) Table 2 moments, and the generator states those tables are byte-identical to the crate's own tables.rs, so the table lookup is a shared input rather than an independent check. The R plm::purtest leg is real but narrow: an anchor block covering 3 of the 12 fixture cases (and Wtbar for only two of those three), asserted at 1e-4, not at the 1e-6…1e-9 quoted for the transcription tsecon-panelroot.json tsecon-panelroot/…/golden.rs, validation.rs vs. the NumPy transcription: IPS 1e-9 (t_bar 1e-7), LLC 1e-8…1e-9, Fisher 1e-6…1e-7; per-unit ADF t 1e-7; lags/nobs exact. vs. R plm::purtest: 1e-4, on 3 cases
Pooled mean group (PMG) — panel_pmg documented-formula cross-implementation: independent NumPy re-impl of PSS 1999 — same estimator, different numerical path, not an independent authority pmg.json tsecon-panelts/…/pmg_golden.rs θ, φ̄, se 1e-8; loglik 1e-6
Distributed-lag panel regression — panel_distributed_lag (and the two-way / entity-trend FixedEffects menu added to the within estimator) linearmodels PanelOLS — independent package — on the explicitly lagged balanced design: nine cases (linear responses at L = 0…3 under two-way, entity-only and time-only effects; entity trends with and without time effects, via explicit entity × trend regressors; two regressors; the quadratic response with explicit and default evaluation points) × three covariances (unadjusted, entity-clustered, Bartlett kernel at bandwidth 4), pinning slopes, SEs, t-statistics and the full covariance, nobs/df_resid exact. The cumulative effect, its delta-method SE/interval, the marginal effects and the turning point are a documented-formula golden (NumPy transcription in the generator; no Python package reports them). Coverage measured (property-MC, 500 reps/cell, long-run impact 0.70): entity cluster 0.928 (N = 50) / 0.938 (N = 200); Driscoll-Kraay 0.886 (T = 50) / 0.924 (T = 200) — stated, not promised as nominal. lags=0, time_effects=False is bit-identical to panel_fe panel_dl.json tsecon-panel/…/panel_dl_golden.rs, panel_dl_properties.rs 1e-10 rel (slopes, SEs, t-stats, covariance, delta-method objects); nobs, df_resid exact; coverage bounds two MC standard errors below the measured values
Unbalanced panels — the observation mask (mask=) of panel_fe, panel_distributed_lag and panel_lp (lp_did and the panel_lp half-panel jackknives refuse it with a named message) linearmodels PanelOLS — independent package — on the Arellano-Bond EmplUK panel (plm, 140 firms, 1976–1984, 1031 firm-years: 103 firms observed 7 years, 23 for 8, 14 for 9) and on a seeded N = 20 × T = 30 panel with random entry, exit and 8% internal gaps: the within estimator under every effects menu (entity, two-way, time-only, entity trends, trends + time — the trends via explicit entity × trend regressors, two-way effects by PanelOLS's own Frisch-Waugh route) × three covariances (unadjusted, entity-clustered, Bartlett kernel at bandwidth 4), 10 cases; the lagged design (lags 0–2, linear and quadratic, one and two regressors, every effects menu), 12 cases, plus the documented delta-method leg; the panel local projection per horizon (h = 0–3, 0–2 lag controls, level and cumulated targets) against PanelOLS on exactly the rows the crate keeps, 3 cases × 3 covariances. fixtures/panel_balanced_snapshot.json (a float-hex self-snapshot of the 0.9.0 build, like backtest_string_snapshot.json) pins every balanced-panel call bitwise, and a mask that is 1 everywhere is asserted bit-identical to no mask; masked-out cells are asserted never read (NaN/1e300 there changes no bit) panel_unbalanced.json, panel_balanced_snapshot.json tsecon-panel/…/unbalanced_golden.rs, test_panel_unbalanced.py 1e-10 rel (slopes, SEs, t-stats, full covariance, delta-method objects, LP irf/se); nobs, df_resid exact; balanced paths bitwise
Nowcasting DFM (two-step Kalman) — dfm_nowcast statsmodels DynamicFactor (Kalman step at fixed params) — independent package; the DGR two-step estimates are property-only. The 0.6 model surface (loadings/factor_ar/factor_cov/idiosyncratic/center/scale, both method routes) is identity-validated at the binding: nowcast == center + scale*(loadings @ edge_factor) at 1e-10 (the crate's own destandardized_fit), common-component reconstruction R² and idiosyncratic-variance consistency bounds on a seeded factor DGP tsecon-nowcast.json tsecon-nowcast/…/golden.rs, test_binding_gaps.py 1e-8 (llf, smoothed states); nowcast mapping identity 1e-10
Nowcasting DFM one-step MLE — dfm_nowcast (MLE path) statsmodels DynamicFactor fitted (exact-likelihood optimum) — independent package nowcast_mle.json tsecon-nowcast/…/mle.rs smooth-at-fitted 1e-6; optimiser gap honest ≤ 1e-2 rel
Nowcast news decomposition — dfm_news independent NumPy Kalman + RTS smoother (Banbura-Modugno 2014) — a different implementation nowcast_news.json tsecon-nowcast/…/news.rs weights 1e-6; forecasts / news 1e-7; actuals 1e-9
MIDAS — midas_weights, umidas (weighted_midas is not golden-pinned) statsmodels OLS (U-MIDAS) + documented weight formulas (exp-Almon, Beta). The fixture pins the weight vectors and the U-MIDAS OLS fit. weighted_midas — the NLS estimator itself — has no golden; it inherits the pinned weight functions and is validated by property tests (it recovers the weights of a seeded Beta-weight DGP, and U-MIDAS is its free-lag limit on the fixture design) in properties.rs midas.json tsecon-midas/…/golden.rs; weighted_midas: properties.rs weights 1e-10; U-MIDAS params / bse / R² 1e-8; weighted_midas property bounds only
Term structure — nelson_siegel (dynamic_ns is not golden-pinned) statsmodels OLS on Nelson-Siegel loadings at Diebold-Li (2006) fixed λ; Svensson validated by nesting property. The fixture pins the cross-sectional fit only — loadings, the date-100 factors and its R². dynamic_ns repeats that pinned cross-section date by date and then adds AR(1) factor dynamics; those dynamics have no golden and are property-tested (the level factor tracks the long yield, AR(1) parameters are recovered on simulated dynamics, forecasts are finite and curve-shaped) in properties.rs termstructure.json tsecon-termstructure/…/golden.rs; dynamic_ns: properties.rs loadings 1e-10; factors / R² 1e-8; dynamics: property bounds only
Arbitrage-free Nelson-Siegel — afns_adjustment documented closed-form yield-adjustment term (Christensen-Diebold-Rudebusch 2011), NumPy afns.json tsecon-termstructure/…/afns.rs 1e-10
Realized volatility — har_rv, and the RV / bipower legs of realized_measures (realized_quarticity, tripower_quarticity, bns_jump_test, realized_range are not golden-pinned) statsmodels OLS (HAR-RV, Corsi 2009) + documented measures (RV / BV only). The fixture stores exactly three reference blocks — rv, bipower, and the HAR fit. No quarticity, jump-test or range value is pinned anywhere. realized_quarticity / tripower_quarticity are validated by in-crate property and guard tests (non-negativity, RV > BV on average under jumps, minimum-sample and non-finite guards); bns_jump_test by an in-test transcription of the Huang-Tauchen (2005) statistic — the finite-sample M/(M−1) / M/(M−2) scalings on BV / TQ applied inside the test since 0.6, matched to 1e-12 and required to differ from the pre-0.6 unadjusted BNS-2004 assembly — plus the pinned marginal-day decision flip (z 1.689 unadjusted vs 1.564 HT around the 5% one-sided 1.645), a seeded injected-jump detection test, and a null-size MC (measured 0.053 at nominal 0.05, M = 78, 4000 reps); realized_range (Parkinson / Garman-Klass) by in-test closed-form transcriptions plus the inverted-bar and non-positive-price guards — the closed form is written in the test file, not in a fixture realized.json tsecon-realized/…/golden.rs; the rest: properties.rs, validation.rs RV / BV 1e-12; HAR params / bse / R² 1e-8; quarticity / jump / range: property and in-test closed-form bounds, no fixture tolerance
Predictive regressions & IVX — predictive_regression, ivx_test documented closed form (Stambaugh 1999 / Kostakis-Magdalinos-Stamatogiannis 2015), NumPy; size / power are property tests predreg.json tsecon-predreg/…/golden.rs slopes / Wald 1e-9; p-value 1e-8
Recession probability — recession_probit statsmodels Probit / Logit (static); the dynamic Kauppi-Saikkonen model has no reference → property-only tsecon-recession.json tsecon-recession/…/golden.rs 1e-6
Survey expectations — cg_regression, forecast_efficiency, forecast_disagreement statsmodels OLS + Newey-West HAC + NumPy (std, percentiles) + documented closed forms (implied rigidity, IQR, and both CG series builders — the fixed-event F_t x_{t+h} − F_{t−1} x_{t+h} construction and the fixed-horizon proxy). The fixed-event-vs-fixed-horizon distinction is additionally pinned by an exact sticky-information DGP test (Rust cg_series_fixed_event recovers beta = lambda/(1−lambda) to MC tolerance at T = 400k; the fixed-horizon proxy converges to its distinct plim beta·(1+rho)/2properties.rs) tsecon-survey.json tsecon-survey/…/golden.rs; DGP identification: properties.rs 1e-8; DGP slopes ±0.02
Long memory — frac_diff, frac_integrate, long_memory_d documented closed form (binomial (1−L)ᵈ; GPH 1983; Robinson 1995 local Whittle), NumPy; recovery is a property test longmemory.json tsecon-longmemory/…/golden.rs frac diff / int 1e-12; GPH d 1e-8, se 1e-12; Whittle d 1e-6
Specification & diagnostic tests — heteroskedasticity_test, reset_test, chow_test, cusum_test statsmodels het_white, het_breuschpagan (Koenker), linear_reset + documented Chow / CUSUM tsecon-spectest.json tsecon-spectest/…/golden.rs 1e-8
DSGE (linear RE solver) — dsge_solve documented closed-form Blanchard-Kahn solution (NumPy; eigenvalues independently cross-checked via numpy.linalg.eigvals) tsecon-dsge.json tsecon-dsge/…/golden.rs 1e-8
Quantile regression & growth-at-risk — quantile_regression, quantile_lp, growth_at_risk statsmodels QuantReg with all defaults (IRLS + Powell kernel sandwich, Hall-Sheather bandwidth) across three DGPs; GaR additionally pinned to per-tau statsmodels fits + np.sort rearrangement, including a case where the raw quantile paths genuinely cross tsecon-quantile.json tsecon-quantile/…/golden.rs params/bse/bandwidth/sparsity 1e-6
Functional shocks (FVAR/FLP) — functional_pca, flp, flp_scenario, fvar_scenario FPCA vs numpy.linalg.eigh (documented sign convention); FLP vs statsmodels OLS with kernel-HAC on the identical joint design; the scenario reconstruction identity (scenario = j-th eigenfunction ⇒ j-th coefficient path) is an exact property, and an MC recovers a known functional response operator tsecon-funcshock.json tsecon-funcshock/…/golden.rs FPCA 1e-10; FLP 1e-8; identity exact
Structural breaks — bai_perron, sup_f_test DP vs exact brute-force enumeration (NumPy itertools over all admissible partitions — an independent algorithmic path) for the global partition; sequential sup-F against the transcribed Bai-Perron published critical values; Hansen (1997) p-value response surface; Bai (1997) argmax cdf closed form (homogeneous case only — stated in the card); published-data replication: Bai-Perron (2003)'s own US real-interest-rate application on the vendored RealInt series — dates exact at m=1..3, means at published rounding, SSR path vs R strucchange 1e-3, classical supF vs Perron's mbreaks 2e-3 (test_replication_bai_perron.py) tsecon-breaks.json, realint_bai_perron.csv tsecon-breaks/…/golden.rs SSR 1e-8 rel; break dates exact
Smooth local projections — smooth_lp B-spline basis vs scipy.interpolate.BSpline.design_matrix; the stacked penalized estimator vs plain-NumPy normal equations at several λ; λ = 0 exactly reproduces lp(se="hac") (internal-consistency anchor, test-pinned) smoothlp.json tsecon-lp/…/smooth_golden.rs basis 1e-10; θ/IRF/SE 1e-8
DF-GLS — dfgls arch DFGLS (Elliott-Rothenberg-Stock) — independent package — for the statistic, AIC/BIC/t-stat selected lag, and nobs; p-values/critical values are arch's DF-GLS response surfaces (Sheppard's MacKinnon-methodology simulations, transcribed — not an independently published table; the raw constants are re-exported in the fixture's provenance block and pinned bit-for-bit so upstream drift is visible) dfgls.json tsecon-diag/…/dfgls_golden.rs, dfgls_properties.rs stat 1e-10 rel (achieved 2.3e-13); lag/nobs exact; CVs 1e-12 rel (achieved bit-exact); p-value atol 1e-12 / rtol 1e-8 (achieved 3.2e-15 abs)
Ng-Perron M unit-root tests — ng_perron (MZa, MZt, MSB, MPT) transcribed table + Monte-Carlo + cross-implementation — NOT a reference-run golden, because none can exist: statsmodels 0.14.6 and arch 8.0.0 do not implement the M tests and no CRAN package does (checked against the CRAN GitHub mirror: urca::ur.ers stops at DF-GLS/ERS P-test; bootUR/CADFtest borrow only MAIC; a Python canary test pins the absence). The legs: (1) critical values transcribed from Ng-Perron (2001) Table 1, cross-checked against the independent transcription in GAUSS tspdlib (gls.src) and behaviorally verified by seeded MC size at the asymptotic values — lag-0, T=1000, 2000 reps: 5% size measured 0.039–0.058 and 1% size 0.006–0.010 across all eight statistic/trend rows; full MAIC pipeline, T=250, 600 reps: 0.027–0.045 at 5% (slightly conservative, matching the paper's Table 2); (2) power ordering (AR(0.8) at T=250: ~0.80 vs size ~0.03) and the MAIC mechanism (mean lag 0.9 i.i.d. vs 7.8 under MA(−0.8); the Perron-Qu 2007 far-from-null power reversal pinned as documented behavior); (3) the exact identity MZt = MZa × MSB as an internal invariant; (4) the GLS-detrended series pinned bitwise to the shared dfgls engine; (5) an independent NumPy re-implementation of the full pipeline (lstsq detrending, MAIC, AR spectral density, all four statistics) re-pinned through the Python binding — same estimand, different language and linear algebra, not an independent authority. Statistic-only: no p-value surface exists and none is fabricated none — MC/property tests carry it (the ROADMAP's planned "table+MC golden") tsecon-diag/…/ng_perron_properties.rs, in-crate pins in src/ng_perron.rs, test_ng_perron.py identity rel 1e-13 (achieved ~1e-16); dfgls-engine pin bit-exact (==); NumPy cross-pin rel 1e-9, MAIC lag exact; MC size bands 5%: [0.025, 0.075] lag-0 / [0.005, 0.09] MAIC at the stated reps; Table 1 spot values exact
Zivot-Andrews one-break unit root — zivot_andrews statsmodels zivot_andrews (statistic/break/lag/p-value; the Baum approximation) — independent package, primary; arch ZivotAndrews agreeing on all expressible cases (shared Baum code lineage — corroboration, not an independent derivation, stated in the generator); p/crit from the transcribed statsmodels simulation table (100k reps, honest to MC resolution) zivot_andrews.json tsecon-diag/…/zivot_andrews_golden.rs, zivot_andrews_properties.rs stat 1e-10 rel; break index & lag exact; crit 1e-12; p-value atol 1e-12 / rtol 1e-8
STL + seasonal workflow — stl, seasonal_strength, nsdiffs mixed, graded per block. stl components are a strong third-party golden — statsmodels 0.14.6 (_stl.pyx, the netlib Fortran port) elementwise on co2 monthly / 100·log realgdp quarterly / seeded synthetic monthly, over defaults, robust, large seasonal window, degree 0, non-unit jumps, explicit inner/outer. seasonal_strength and the nsdiffs 0.64 rule are documented-formula/rule transcriptions (Wang-Smith-Hyndman 2006, ddof=1; forecast::nsdiffs(test="seas")) computed from statsmodels STL components in the generator — no R in the reference venv stl.json tsecon-filters/…/stl_golden.rs, stl_properties.rs, tsecon-diag/…/nsdiffs_golden.rs STL arrays 1e-8 elementwise (achieved ≤ 1.2e-11); resolved config exact; strengths 1e-8; nsdiffs D/stop reason/step count exact
MSTL multiple-seasonal decomposition — mstl strong third-party golden (statsmodels MSTL, elementwise): statsmodels 0.14.6 MSTL (the Bandara-Hyndman-Bergmeir 2021 iterated-STL driver over the same netlib STL core) — trend, every per-period seasonal, resid, and robustness weights pinned elementwise on a seeded two-seasonal hourly-like series (periods 24/168), a seeded three-seasonal awkward-period series (5/12/31), the degenerate single-period case, and a dropped-period (≥ n/2) case, across default/explicit windows (paired-sort pinned via unsorted inputs), robust, forwarded stl_kwargs incl. inner_iter/outer_iter, and iterate ∈ {1, 2, 3, 4}. The single-period case must additionally reproduce tsecon's own stl (seasonal window 11) bitwise — internal consistency between the two entry points, graded separately. Per-period seasonal_strength is the same documented Wang-Smith-Hyndman formula as the stl row, checked against an in-test NumPy transcription. lmbda/Box-Cox is scoped out (stated in the docstrings) mstl.json tsecon-filters/…/mstl_golden.rs, mstl_properties.rs, test_mstl.py components 1e-8 elementwise (achieved ≤ ~5e-11; weights ≤ ~3e-10 on the robust case); resolved periods/windows/drops exact; single-period vs own stl bit-exact
SETAR — setar, setar_test independent NumPy transcription of the published concentrated-LS algorithm and sup-F (Tong-Lim 1980; Hansen 1996/1997) — no third-party SETAR runs in the reference venv; graded honestly in generate_setar_fixtures.py. The bootstrap p-value is deliberately not fixture-pinned: it is validated by seeded MC properties (null rejection ~ nominal; threshold MAE 0.008 at T=400 over 200 reps) in setar_properties.rs; anchored to a published fit of real data: Hansen (1999, JES 13(5)) sunspot SETAR(2) (p=11, 1700–1988, Ghaddar-Tong transform) — delay exact, threshold at published precision (within one order statistic), linearity verdict matched, in test_replication_setar_sunspots.py setar.json, sunspots_tong.csv tsecon-regime/…/setar_golden.rs coefs/SEs/SSR/ICs/sup-F 1e-10; thresholds 1e-12; bootstrap p-value by property bounds
SETAR threshold confidence set — setar_threshold_ci (Hansen 1997/2000 LR inversion) documented-formula golden for the closed forms — critical value c(level) = −2 ln(1 − √level) and p-value 1 − (1 − e^{−x/2})², Hansen (2000) Table 1 reproduced to the printed decimals; cross-implementation transcription golden for the LR profile n (S(γ) − S_min)/S_min, Hansen's programs' η² convention (quadratic regressions of (x'δ)² and e²(x'δ)² on the threshold variable), the possibly-disjoint interval construction, the null-threshold inversion and the conservative slope unions — no third-party threshold-CI code runs in the fixture container (Hansen's site unreachable; no R tsDyn); graded honestly in generate_setar_ci_fixtures.py. The fit underneath is asserted bit-identical to setar. Coverage is measured, not pinned: over 500 seeded reps per cell in setar_ci_properties.rs, 90%/95% sets cover the true threshold at 0.886/0.930 (n = 100), 0.926/0.948 (250), 0.946/0.976 (500) on a Hansen-(2000)-style threshold regression with effect 0.5, 0.950/0.972, 0.964/0.980, 0.956/0.978 with effect 1, and 0.960/0.976, 0.964/0.982, 0.966/0.984 on a SETAR(2) — at or above nominal except the small-effect n = 100 cell, as the fixed-effect theory (asymptotically conservative) predicts; the η² correction is identified in 468/500 reps at n = 250 on a heteroskedastic design (mean 0.617 vs true 0.607, interdecile 0.31–0.90) and gives 0.915/0.938 conditional on identification setar_ci.json tsecon-regime/…/setar_ci_golden.rs closed forms 1e-14; LR profile / η² / intervals / slope unions 1e-10; thresholds 1e-12; fit bit-identical to setar; coverage by MC bands
STAR — star, star_eval, star_test (LSTAR/ESTAR, Teräsvirta cycle) independent NumPy/SciPy transcription of the published closed forms (Luukkonen-Saikkonen-Teräsvirta 1988 LM3 aux regressions + H01/H02/H03 F sequence; concentrated OLS at fixed (γ, c) with Gauss-Newton SEs; the (γ, c) grid incl. the raw-γ tsDyn scaling convention and the standardized grid) — no third-party STAR reachable (CRAN egress denied so no R tsDyn — attempted, r-base installed, dependency tree unbuildable offline; statsmodels has no STAR); graded honestly in generate_star_fixtures.py. The NM refinement of (γ, c) is deliberately not fixture-pinned (optimizer-dependent): properties assert refined SSR ≤ grid SSR, star_eval(fit) == fit, the LSTAR→SETAR step limit against the test's own split-OLS (not tsecon::setar — no circularity), exact grid equivariance, and gamma_at_boundary/converged/se_valid honesty flags; seeded MC in star_properties.rs: LM3-F size 0.060/0.028 at 5% (T=200/500, 400 reps, MC se 0.011), power 0.81 (LSTAR)/0.91 (ESTAR) at T=250, H-sequence picks ESTAR 98% / LSTAR 55% given rejection; recovery medians over identified fits ≤ 0.29 with standardized-γ median 2.73 at T=500 (truth ≈ 2.9; boundary-flagged in 57/200 — the documented large-γ flatness) star.json tsecon-regime/…/star_golden.rs, star_properties.rs, test_star.py battery stats/p-values/SSRs, eval coefs/SEs/loglik/ICs, grid surface 1e-10 (atol floor 1e-10 for cancellation-limited near-zero F stats); verdicts/counts/best cell exact; γ NOT parameter-pinned (by design — flags + MC carry it)
Threshold cointegration (Hansen-Seo 2002) — threshold_vecm, hansen_seo_test independent NumPy transcription of the published algorithm (concentrated ln det grid over (beta, gamma); the eq. 10-12 Eicker-White sup-LM with the fixed-regressor bootstrap) — no third-party reference was runnable: R installs from apt in the fixture container but CRAN is unreachable through its egress proxy, so tsDyn::TVECM/TVECM.HStest could not be run, and no Python package implements the estimator; graded honestly in generate_tvecm_fixtures.py. The bootstrap p-value is deliberately not fixture-pinned: seeded MC properties in tvecm_properties.rs measure null size 0.100 at the 5% level at T=150 falling to 0.065 at T=400 (200 draws × B=199, MC se ≈ 0.02 — mildly liberal small-T, the direction Hansen-Seo's own simulations show), and recovery median |γ̂−γ| = 0.025, median |β̂₂−β₂| = 0.0046 (T=300, 200 reps); nesting (llf ≥ llf_linear) and split-OLS self-consistency asserted. Even with tsDyn runnable, point estimates would only match at grid resolution (its 50×50 default grid and differently-constructed beta region) tvecm.json tsecon-coint/…/tvecm_golden.rs, test_tvecm.py fixed-beta cases 1e-10 (coefs/EW SEs/Σ/criterion/llf); estimated-beta cases 1e-8 (eigensolver leg); counts exact; bootstrap p-value by property bounds
Threshold VAR — threshold_var, threshold_var_test independent NumPy transcription of the documented algorithm (concentrated ln det scan; the robust score-form sup-Wald — the multivariate Hansen-Seo LM — with the Hansen-1996 fixed-regressor bootstrap) — no third-party TVAR runs in the fixture container (same CRAN-unreachable story: no tsDyn::TVAR; note TVAR.LRtest is in any case a different convention — sup-LR with a residual bootstrap — so statistic values would not be comparable); graded honestly in generate_tvar_fixtures.py. Bootstrap p-value by seeded MC property in tvar_properties.rs: null size 0.100 at the 5% level at T=150 falling to 0.085 at T=400 (200 draws × B=199, MC se ≈ 0.02), threshold median |err| = 0.008 and coefficient |bias| ≤ 0.009 under a strong two-regime VAR(1) (T=400, 200 reps); refit-equals-scan-minimum and Σ-mixture identities asserted. Regime-dependent GIRFs: the threshold_var_girf row below tvar.json tsecon-regime/…/tvar_golden.rs, test_tvar.py coefs/SEs/covariances/criterion/llf/ICs/sup-Wald 1e-10; thresholds 1e-12; counts exact; bootstrap p-value by property bounds
Threshold-VAR generalized impulse responses — threshold_var_girf (Koop-Pesaran-Potter 1996 through the shared engine) documented-algorithm transcription + exact linear reduction + seeded MC — no third-party TVAR GIRF runs in the container (no tsDyn). (1) An independent NumPy transcription of the documented engine that reproduces its random streams exactly through NumPy's own SeedSequence.spawn/Philox/Generator.random and Box-Muller (tsecon-rng is bit-compatible), so the pinned numbers are the simulation itself: four cases (orthogonal/generalized, ± sizes, regime="all"|"low"|"high", a seeded history subsample) pin girf, the across-history bands, every per_history path, mc_se, draw_sd, draw_lower/draw_upper, the regime averages, history_regimes/history_times and the per-regime shock vectors; graded honestly in generate_girf_fixtures.py. (2) With both regimes set equal the TVAR GIRF equals Ψ_h P e_j / the Pesaran-Shin form from tsecon_var::ma_rep for every history. (3) Seeded MC on a strongly asymmetric k = 3 TVAR(1) at T = 600 in tvar_girf_properties.rs: sign asymmetry max |GIRF(+1)+GIRF(−1)| = 0.149 (t = 37 vs the MC error), size non-proportionality max |GIRF(2)−2·GIRF(1)| = 0.040 (t = 11.5), regime dependence max |low−high| = 0.111 (t = 60), 1/√n_draws convergence (32/512 error ratio 4.02, theory 4), antithetic variance ratio 1.000 (no reduction — measured and documented, not claimed), bit-identity at 1 vs 4 threads and across two fresh processes, regime averages mixing to the overall average, teaching errors; showcase timing T = 600, k = 3, 200 histories × 500 draws × h = 20: 0.23 s (Rust release) / 0.63 s (Python incl. fit), indicative girf.json tsecon-regime/…/tvar_girf_golden.rs, tvar_girf_properties.rs, test_girf.py transcription 1e-10 rel (abs floor 1e-10) on every path array; linear reduction 1e-12; regimes/dates/counts exact; MC claims by measured t > 5 and property bounds
EVT tails — gpd_fit, gev_fit scipy 1.17.1 genpareto.fit(floc=0) / genextreme.fit (Nelder-Mead-polished — scipy's own fit stops at xtol=1e-4; both raw and polished params stored), NumPy central-difference Hessian for SEs, genpareto/genextreme.ppf + McNeil-Frey (2000) / return-level closed forms computed independently in the generator tsecon-evt.json tsecon-evt/…/evt_golden.rs, evt_properties.rs params 1e-6; loglik at the optimum 1e-10 abs (plus ours-never-worse); SEs 1e-4 rel; VaR/ES/return levels 1e-5 rel
VaR backtests — var_backtest (Kupiec, Christoffersen, Engle-Manganelli DQ) first-principles NumPy/SciPy closed-form LR references + statsmodels OLS for the DQ regression algebra (generator-cross-checked vs the normal equations at 1e-10) + a hand-derived n=250/5 case + the published Jorion (Value at Risk ch. 6) JPM-1998 example (LR_uc = 3.91); seeded MC size/power suites in the crate tests var_backtest.json tsecon-forecast/…/var_backtest.rs LR stats 1e-12; DQ 1e-9; p-values 1e-8 (deep tail 1e-4); counts/transition cells exact
DCS robust local level — dcs_local_level mixed, graded per density: statsmodels UnobservedComponents('llevel') (Gaussian limit, pinned through the derived steady-state mapping kappa = p/(1+p); fitted params vs a scipy same-criterion MLE — two optimizers) — independent package; Student-t/Laplace are documented-closed-form + seeded MC recovery (no runnable reference exists; DCS code is R/Matlab — stated) tsecon-dcs.json tsecon-gas/…/dcs_golden.rs, dcs_properties.rs Gaussian loglik 1e-8 / path 1e-6 / params 1e-4; fixed-param recursions 1e-10; t/Laplace MC bands (κ RMSE 0.033 at T=400; robustness ratios asserted)
Panel LP split-panel jackknife — panel_lp(bias_correction="spj") independent NumPy transcription of Mei-Sheng-Shi's pLP panelLP.R (fetched verbatim; the R-only reference commits no numeric outputs, so transcription + seeded MC — stated): split/combination and the adjusted-score cluster/Driscoll-Kraay SEs panel_spj.json tsecon-panel/…/spj_golden.rs, spj_properties.rs coefficients and both SE variants 1e-10 rel; MC: bias cut 15x at T=20 h=2, coverage 0.74 → 0.82 (nominal not reached at T=20 — documented)
proxy_ar_sets second-order propagation — rf_method="second_order" seeded MC coverage harness (the audit's own design, estimand validated against a T=200k fit; transcription pinned to the shipped delta path at 2e-14) — measured 0.889→0.964 / 0.830→0.932 at h=12 on two DGPs; delta-limit and convexity-direction property tests harness committed at proxy_ar_long_horizon.py tsecon-ident crate tests determinism bit-exact; delta limit at shrunken covariance; coverage bands as published in the card
proxy_ar_sets bias-corrected second order — rf_method="second_order_bc" (pope_bias_corrected_coefs) the same seeded MC harness's delta2bc arm (h=12: 0.982 / 0.966 on the two DGPs — at-or-above nominal at every horizon, a conservative floor); Pope's closed form pinned to the exact univariate Marriott-Pope bias -(1+3a)/T and to the harness's NumPy transcription on a VAR(2) and a shrunk near-unit-root case; unstable-fit no-op bit-exact; boundedness/point invariance vs second_order harness arm in proxy_ar_long_horizon.py; registry rows in proxy_garch_tail.py tsecon-ident/…/proxy_ar_coverage.rs AR(1) closed form 1e-12; NumPy transcription 1e-10; no-op and boundedness bit-exact
Interval coverage of the round-8 families — growth_at_risk (bse/bse_powell), proxy_svar_bands (Hall/Efron/wild), proxy_ar_sets (all rf_methods), garch_fit (se_mle/se_robust), flp/flp_scenario property-MC (coverage measured) — the Tier-6 registry module measures empirical coverage of the documented nominal intervals on seeded closed-form-truth DGPs (an exact Gaussian state-space quantile design for GaR; the card VAR(2)/routine VAR(1) proxy DGPs; a GARCH(1,1) with normal and t(5) innovations; exactly-spanned curve panels), with per-run assertions on every headline finding; nongaussian_svar and the GARCH variance_forecast are verified interval-free by key-set tripwires none (a coverage measurement, not a golden) — module committed at proxy_garch_tail.py proxy_garch_tail.py via run_all.py (page rows guarded by check_page.py) coverage bands asserted per finding; MC se ~0.006–0.011 per cell
IVX Bonferroni joint test — ivx_test(joint="bonferroni"), the joint default since 0.5 (through 0.4.0 the default was "chi2") seeded MC size/power grid (64 cells, 2000 reps each; transcription pinned to tsecon at 1e-10) — size 0.011–0.059 everywhere vs 0.28–0.34 at k=8 for the chi-square mode (the pre-0.5 default, still available as joint="chi2"); the k>1 size regression test the suite previously lacked now pins both harness committed at ivx_joint_size.py tsecon-predreg crate tests chi2 defect pinned ≥0.10 at k=5; bonferroni ≤0.075 on the same draws
Weak-proxy first stage — proxy_first_stage statsmodels OLS (classical/HC1/HAC, rtol 1e-9) + scipy ncx2.ppf (1e-6) — dual golden — and the published weakivtest critical-value table (37.418/23.109/15.062 at τ=5/10/20%) proxy_first_stage.json tsecon-ident crate tests algebra 1e-9 rel; CVs/τ-bounds 1e-6; published table verbatim at print precision
ACM term premium — acm_term_premium documented three-step estimator (ACM 2013) transcribed end-to-end to NumPy — plus the NY Fed's published ACMTP10/ACMY10 as a level/shape target (vintage caveats stated) and a known-truth affine-DGP recovery acm.json, gsw_nss_params.csv, acm_published_10y.csv tsecon-termstructure/…/acm.rs pipeline 1e-8 (measured ≤1e-11); published series corr > 0.97, RMSE < 0.5pp; DGP recovery corr > 0.95
JSZ canonical affine term structure — jsz_fit, jsz_loadings graded per block: the Riccati recursions are a documented-formula golden (JSZ 2011, NumPy); the concentrated P-VAR(1) of the portfolios is an independent-package golden (statsmodels VAR(1): params, stderr, sigma_u_mle); the likelihood at stated parameters a documented-formula golden (llk_P + llk_Q + Jacobian, invariance to the portfolio basis asserted); the MLE a SciPy multi-start cross-optimizer target on a simulated canonical model (recovery measured: λ^Q 8.7e-5, k∞ 1.2%, σ_e 0.3% at T=500) and on the real GSW 1990-2007 panel (no published estimate on that exact panel — illustration only); the AFNS special case λ^Q = (1, e^-λΔ, e^-λΔ) spans the Nelson-Siegel loadings exactly and converges at first order in Δ to the crate's independent CDR (2011) afns_yield_adjustment (gap 9.8e-6 → 2.5e-6 → 6.1e-7 as Δ = 1/12 → 1/48 → 1/192). Property suite: invariance to the basis of the portfolio space, exact pricing of the portfolios, determinism, local optimality of the MLE in every parameter direction, unit-root level factor jsz.json, gsw_nss_params.csv tsecon-termstructure/…/jsz_golden.rs, jsz_properties.rs recursions 1e-12; VAR 1e-9; likelihood 1e-7 abs (~1e-11 rel); MLE vs SciPy λ^Q 1e-5, k∞ 1e-3, σ_e 1e-4; NS span 1e-10; AFNS convergence ratio in [0.2, 0.32] (measured 0.2504, 0.2501); basis invariance llf 1e-8 rel (measured 1.1e-11), λ^Q 1e-8 (1.6e-10), fitted 1e-8
Static copulas — pseudo_obs, copula_fit, copula_select statsmodels 0.14.6 distributions.copula densities/CDFs + fit_corr_param; scipy-NM-polished MLE of the statsmodels log-density (statsmodels exposes no copula MLE); scipy kendalltau/rankdata; Owen's-T exact BVN CDF; bivariate-t CDF by conditional quadrature (statsmodels' t-CDF raises NotImplementedError). Tail closed forms verified by numeric copula limits — the statsmodels dependence_tail precedence bug is recorded, not pinned tsecon-copula.json tsecon-copula crate tests grids 1e-10; tau maps 1e-12 (Frank 1e-11); MLE params 1e-6, loglik 1e-10 abs; SEs 1e-4; kendalltau 1e-15; pseudo-obs exact
LP-DiD — lp_did reference-run golden: an R/fixest execution of the authors' (Dube-Girardi-Jordà-Taylor) published example code, fixest compiled from the CRAN mirror (independent NumPy reimplementation agreeing at 5.3e-15) + seeded MC (coverage 0.95–0.97; the clean-control-vs-naive contrast asserted: −56.5% bias vs +0.1%) lpdid.json tsecon-panel/…/lpdid_golden.rs, lpdid_properties.rs coef/se 1e-10; nobs/n_switchers exact
GARCH boundary/scale conventions (round 7) internal-property grade — no external reference defines these conventions: per-parameter se_valid/boundary flags on the reduced-Hessian SE path; power-of-two rescalings commute bit-exactly (same-run invariant); arch-pinned interior fixture cases bit-identical pre/post garch.json (unchanged) test_garch_boundary.py, test_garch_scale.py flags exact; pow2 commutation bit-exact; fixture drift ≤ 7.8e-7 within stated tolerances
Multiple forecast comparisons — spa_test (White RC / Hansen SPA), stepm_test (Romano-Wolf), model_confidence_set (Hansen-Lunde-Nason) independent-package golden, EXACT on the reference's own draws: arch 8.0.0's SPA/RealityCheck/StepM/MCS resample INDEX ARRAYS are stored in the fixtures and replayed through internal *_with_indices entry points, where tsecon reproduces arch bit for bit (mean loss differentials, all 200 replicate statistics under each of the three re-centrings, observed statistic, critical values, the three p-values; MCS mean losses, pairwise variance matrix, elimination order, included/excluded sets, MCS p-values; StepM superior sets at sizes 0.05/0.10) for every case with m >= 2. Two reference findings recorded and asserted: arch's SPA.studentize flag is INERT (identical output on and off, so arch computes the un-studentized statistic — the studentized path is a documented-formula pin against a NumPy transcription of Hansen 2005 on the same resamples), and arch's StepM raises whenever every model is declared superior over two or more steps. Resampling conventions MEASURED not assumed: arch's own raw draws replayed through tsecon-bootstrap's documented rule reproduce arch's index arrays element for element for all three schemes at three (n, block_size) settings — the ONE difference is the stationary restart tie (arch restarts on u <= p, tsecon on u < p; ties counted, zero observed). Seeded public path at Monte Carlo tolerance (4000 reps, within 0.05 of arch's 4000). Property-MC for what no package pins: SPA size under the least favourable null cross-checked against ARCH'S OWN rates on the same design (un-studentized, 5% level, 400 reps: 0.038/0.080/0.068/0.080 here vs 0.038/0.058/0.050/0.070 there); the STUDENTIZED default is measured, not validated — it over-rejects (0.123 and 0.135 at a nominal 0.05 under AR(0.5) losses, n=200) by Hansen's own construction and shrinks to 0.093/0.088 at n=800; power 0.985 at 5% against a 0.6x-error competitor; MCS containment of a two-element best set 0.870-0.895 at a nominal 0.90, matching arch's 0.879-0.909 on the same design (the gap is the method's, and does not close from n=150 to n=600) spa.json, mcs.json spa_golden.rs, mcs_golden.rs, spa_mcs_properties.rs, test_mcs.py arch legs bit-identical (m >= 2); Hansen kernel variances and the single-model case 1e-13; studentized transcription 1e-12 rel, its p-values exact; seeded path within 0.05 of arch at 4000 reps; MC rates within 4 MC se of arch's

Exponential smoothing

Family Validated against Fixture Test Tolerance
ETS innovations state space — ets_fit (the 30 Hyndman et al. 2008 error/trend/damped/seasonal models; MLE; class-1 forecast variances; simulated intervals) mixed, graded per leg. Leg 1 (independent package): statsmodels ETSModel(initialization_method="known").smooth(params) at fixed parameters — log-likelihood, fitted values, residuals, level/trend/seasonal paths, forecast(h), simulate(anchor="end") along stated innovations — for the twenty models without a multiplicative seasonal, and simulate(anchor="start") for all thirty (statsmodels' simulator is written in the innovations form); the six class-1 forecast variances against statsmodels' exact get_prediction; the Hyndman (2008 §2.6.1) heuristic initialisation against holtwinters.ExponentialSmoothing(initialization_method="heuristic") on 30 (series, trend, seasonal) combinations (plus 6 short-sample "simple" cases); the maximum likelihood against ETSModel.fit() (L-BFGS-B) on 21 (series, model, initialisation) cases as match-or-beat targets with two optimizers (auto and bfgs). Leg 2 (documented-formula transcription): the published recursion (Hyndman et al. 2008 Tables 2.2/2.3, R etscalc.c arithmetic) transcribed in NumPy for all thirty models, and the Table 6.1 closed-form variances, self-checked in the generator against the general w'F^{j-1}g formula before storing. For the ten multiplicative-seasonal models statsmodels' Cython smoother is not the innovations form (it updates the seasonal with the post-update level and γ/(1−α), the classical Holt-Winters recursion, which its own simulate does not use); the measured gap is recorded in the fixture, not gated, and those ten are pinned to the transcription. Data: bundled co2 (monthly means, 5 missing months linearly interpolated — the innovations form refuses NaN), Box-Jenkins airline, log UKgas, two seeded DGPs. Coverage and recovery are measured by seeded Monte Carlo (ets_properties.rs) and quoted on the ETS model card ets.json tsecon-ets/…/ets_golden.rs, ets_properties.rs, test_ets.py statsmodels legs 1e-10 rel; transcription and Table 6.1 1e-12 rel; MLE match-or-beat at 1e-5 rel on the log-likelihood (measured worst shortfall 2.67e-6, co2 ETS(A,Ad,A); the crate beats statsmodels' boundary-stalled optimum by 0.89 on log-UKgas ETS(A,A,A)), parameters within 1e-3 where the optima coincide (measured worst
Auto-ETS selection — auto_ets (the forecast::ets candidate search) graded as auto_arima was — the loop has no runnable third-party reference (M3 parity is R-only). Leg 1 (candidate level): every candidate's criterion is the golden-pinned ets_fit likelihood with the documented k (smoothing parameters + free initial states, m − 1 seasonal, + σ²; statsmodels counts m and the fixture records both). Leg 2 (exact): the admissible candidate set reproduces R's ets.R loop (restrict, allow.multiplicative.trend, damped, sign of the data) on 48 option combinations. Leg 3 (internal consistency): the winner is the table minimum, refitting it reproduces criterion/likelihood/parameters bitwise, two runs give identical tables. Leg 4 (primary, simulation-recovery): seeded MC recovery of the generating component form, rates quoted on the card ets.json ets_golden.rs, ets_properties.rs, test_ets.py candidate set exact; refit bitwise; MC recovery gated loosely (≥ 0.7 at T = 600, 30 reps; measured 0.90–1.00 across the four designs) so CI fails on regression, not noise

Foundational numerics

The primitives every estimator above leans on are held to the same standard.

Family Validated against Fixture Test Tolerance
ARIMA / SARIMAX statsmodels SARIMAX (fixed-param loglike, forecast); MLE optimum independently cross-verified — independent package arima.json tsecon-arima/…/golden.rs loglike 1e-8; forecast 1e-6; optimum params 1e-4
ARIMA parameter covariance (arima_fit standard errors; the covariance the 0.2.0 drift-uncertainty term is built on) statsmodels SARIMAX(..., simple_differencing=True).fit(cov_type='approx').bse — independent package — on six cases, every one evaluated at the fixture's recorded parameters so the comparison is curvature, not two optimisers' stopping points. The reference differentiates by complex step and this crate by four-point central differences, so the gap is finite-difference truncation and the tolerances are looser than the crate's closed-form goldens by design. A statsmodels match cannot catch a defect the two share, and every fixture case has sigma2 in [0.94, 2e4] — the complement is a closed-form scale sweep (se(c) = √(σ²/n), se(σ²) = √(2σ⁴/n)) over sigma2 from 9.8e5 down to 9.8e-19, the test that catches an absolute-tolerance step, plus an OLS closed form for the CSS arm arima_bse.json tsecon-arima/…/golden_bse.rs, cov_accuracy.rs vs. statsmodels 5e-6 rel (5e-5 on the ill-conditioned nile_arma11c, rcond = 5.1e-4); vs. the closed forms 5e-6 rel across twenty-four decades of sigma2; CSS vs. OLS 1e-6
Auto-ARIMA order selection — auto_arima (Hyndman-Khandakar stepwise) mixed, graded per leg — the selection loop has no gating third-party reference, stated: R's auto.arima and pmdarima disagree with each other on real series, so parity would pin an implementation accident. Leg 1 (independent package, candidate level): statsmodels SARIMAX(..., simple_differencing=True) fixed-parameter loglik and the implied AICc/AIC/BIC on nine (series, order) pairs, plus polished free fits as match-or-beat floors. Leg 2 (internal consistency): reported best criterion = trace minimum, refit of the reported orders reproduces criterion/loglik/params exactly, traces identical across runs (observed bit-identical across debug and release builds). Leg 3 (primary, simulation-recovery): seeded MC order recovery across seven DGPs with known orders (scripts/mc_auto_arima_recovery.py), rates quoted verbatim in the ARIMA model card. A pmdarima cross-run is reported there as a non-gating note. The d/D stages reuse the already-golden-pinned ndiffs/nsdiffs auto_arima.json tsecon-arima/…/auto_golden.rs, auto.rs, test_auto_arima.py fixed-param loglik/AICc 1e-8 rel; refit consistency exact (bitwise); free fits match-or-beat at 1e-5; MC rates reported with 95% CIs, gated loosely (within-one ≥ 50% at n=300) so CI fails on regression, not noise
State-space / Kalman filter & smoother statsmodels statespace / SARIMAX with exact-diffuse initialization — independent package ssm.json tsecon-ssm/…/golden.rs 1e-6 (achieved ≤ 1e-11)
Structural time-series models — unobserved_components (every statsmodels level/trend spec, dummy + trigonometric seasonals, damped/stochastic cycle, regressors, missing data) mixed, graded per leg: statsmodels UnobservedComponents(use_exact_diffuse=True) at fixed parameters (loglike, filtered/smoothed states and variances, residuals, forecasts and their variances, AIC/BIC, component paths) on 26 component combinations + 3 NaN-inserted series — independent package; the MLE against the better of statsmodels' own fit and a SciPy Nelder-Mead + L-BFGS-B re-optimization of the identical criterion (two optimizers, both over the same admissible cycle band — with the period unbounded above the exact-diffuse cycle log-likelihood is unbounded above too, measured at 25 points over four decades of frequency in uc_properties.rs, which is why the default upper period bound here is the sample length and statsmodels' is infinity), with the pile-up flags and the conditional observed-information standard errors (the same statsmodels Hessian inverted over the non-boundary parameters — what this crate reports; the full-Hessian cov_type="approx" numbers are recorded beside them); Durbin-Koopman (2012) Nile local level reproduced to the printed 15099 / 1469.1; Harvey-Durbin (1986) Seatbelts BSM re-estimated to the statsmodels/SciPy optimum with its slope/seasonal pile-ups flagged (series fetched live, never stored — R datasets is GPL); seeded MC for recovery, forecast coverage, scale invariance, and the Nyquist-harmonic identity (a frequency-pi sine state the observation never loads on cannot move the log-likelihood — an identity, no reference needed). The exact-diffuse smoother is the ill-conditioned leg and is graded as such: the generator records smoother_spread, the distance between statsmodels' OWN univariate and conventional smoothers on each case, and the tests use it as the tolerance for smoothed variances over the diffuse period and the two rows after it uc.json tsecon-ssm/…/uc_golden.rs, uc_properties.rs, test_uc.py (Seatbelts leg, live; skipped when Rdatasets is unreachable) fixed-param 1e-8 rel on log-likelihood, AIC/BIC, states, filtered variances, residuals and forecasts; smoothed variances 1e-8 on 19 of the 26 cases (where the two reference smoothers agree bit for bit) and at the recorded reference spread inside the diffuse period otherwise (worst case 4.5e-3 reference spread, 8.8e-4 tsecon gap, back under 1e-8 from nobs_diffuse + 3 on); MLE within 1e-5 log-likelihood of the better optimizer, params 2e-3, pile-up flags exact, SEs 2e-2 vs the conditional reference; MC bands in the card
TVP regression — tvp_regression (random-walk coefficients, pile-up check) mixed, graded per leg: a statsmodels MLEModel transcription of the documented state-space form at fixed parameters (loglike, filtered/smoothed coefficient paths and variances, residuals, AIC/BIC; a NaN-inserted series too) — independent package; statsmodels RecursiveLS as the zero-state-variance limit (filtered coefficients, concentrated log-likelihood, final = OLS); the MLE against the better of statsmodels' fit and a SciPy re-optimization with the true-zero variance's pile-up flagged; closed-form expanding-window OLS identity; seeded MC pile-up shares on constant vs moving coefficients uc.json tsecon-ssm/…/uc_golden.rs, uc_properties.rs, test_uc.py fixed-param and RLS limit 1e-8 rel (the three TVP blocks' two reference smoothers agree to ≤ 6.1e-13, so 1e-8 is the operative tolerance throughout); MLE 1e-5 log-likelihood / 2e-3 params / 2e-2 SEs (conditional) / pile-up flags exact; OLS identity 1e-8
Filters — HP / Baxter-King / Christiano-Fitzgerald / Hamilton statsmodels hpfilter, bkfilter, cffilter + documented Hamilton (2018) regression filter filters.json tsecon-filters/…/golden.rs 1e-8
Hamilton filter inference — hamilton_filter(se=…) HAC/nonrobust standard errors statsmodels OLS(...).fit(cov_type="HAC"/"nonrobust") on the identical design — independent package (at fixture-generation time statsmodels had no Hamilton filter — pinned by the fixture's absence canary — but the filter is OLS, so its coefficient inference is statsmodels territory; statsmodels 0.15.0 then added tsa.filters.api.hamilton_filter, and the canary test now runs a live version-gated cross-check of the full cycle/trend decomposition against it — measured max abs 4.2e-14 on first contact, asserted at 1e-10): bse/t-values for nonrobust and three HAC settings including the h-overlap default maxlags = h = 8; decomposition and beta additionally asserted bit-identical with and without se (defaults unchanged) bn_filters.json tsecon-filters/…/bn_filter_golden.rs, test_bn_filters.py 1e-6 (measured ≤ 2.9e-8 bse / ≤ 6.8e-8 t: raw-levels design, so statsmodels' pinv and tsecon-hac's refined Cholesky agree to ~1e-8, not the engine's calm-design 1e-10); beta 1e-8; defaults bitwise
Beveridge-Nelson decomposition — bn_decomposition (classic ARMA BN) mixed, graded per leg — statsmodels ships no BN decomposition (verified live and pinned by the fixture's absence canary). Leg 1 (documented-formula transcription): independent NumPy transcription of the Morley (2002) companion-form computation at fixed coefficients (MNZ ARIMA(2,1,2) on GDP, fixed ARMA(1,1)/AR(2) on a seeded series). Leg 2 (independent package, partial): the long-run multiplier ψ(1) = θ(1)/φ(1) — the number that defines the decomposition — equals the cumulative sum of statsmodels arma_impulse_response, asserted at generation and re-pinned in tests. Leg 3 (exact identities on own output): trend+cycle reconstructs y[1:], Δtrend = μ + ψ(1)ε, ARIMA(0,1,1) textbook closed form; fit path lands within 1.4e-4 (ψ(1)) / 6.8e-6 (drift) of the statsmodels MLE of the same spec bn_filters.json tsecon-arima/…/bn_golden.rs, test_bn_filters.py transcription 1e-8 (measured ≤ 2.4e-16); ψ(1) vs cum-IRF 1e-7; identities ≤ 1 ulp / 1e-9
BN filter — bn_filter (Kamber-Morley-Wong 2018 output gap) reference-run (R): the authors' own replication code (bnfiltering.com lineage — Ben Wong's MATLAB, R conversion Luke Hartigan, updated James Morley — as packaged at kletts/bnfilter@8af7924, sourced at generation, not vendored) executed at the KMW-2018 baseline (delta_select=1 amplitude-to-noise, ib=FALSE, grid d0=0.01, dt=0.0005, fixed bands) on US GDP + a seeded series, 4 cases (auto/fixed δ, sm/nd demeaning, p ∈ {8,12}); the generator also re-implements the procedure independently in NumPy and asserts R-agreement at 1e-9 before writing. Caveats stated on the card: current refined code lineage at 2018 settings, re-packaged repo bn_filters.json tsecon-filters/…/bn_filter_golden.rs, test_bn_filters.py cycle/AR 1e-8 (measured ≤ 2.9e-15); auto δ same grid point (1e-12); cycle_se / amp-to-noise 1e-8
HAC / long-run variance — Newey-West, EWC statsmodels OLS with HAC covariance — independent package hac.json tsecon-hac/…/golden.rs 1e-10
ols heteroskedasticity-robust ladder — nonrobust / HC0 / HC1 / HC2 / HC3 (the 0.2.0 HC2-HC3 addition) statsmodels fit(cov_type=...) — independent package — pinning bse, t-values and the full parameter covariance matrices on two designs: the T = 25 high-leverage DGP from the interval-coverage audit that motivated HC2/HC3, and a calmer k = 3 one. The hat-matrix diagonal the leverage weights are built from is pinned too, and HC2/HC3 covariances are independently rebuilt from statsmodels' own hat diagonal. A third block, near_singleton, deliberately breaks the 1e-10 tolerance: it walks 1 − h_7 down to machine noise to measure where HC2/HC3 parity stops holding, and the test asserts the degradation rather than hiding it hc_robust.json tsecon-hac/…/golden.rs ladder bse / t / cov 1e-10; cov rebuilt from the statsmodels hat diagonal 1e-12 (HC2/HC3 1e-9); near_singleton: parity asserted to fail worse than 1e-9 inside the band, by construction
Spectral analysis — periodogram / Welch / coherence scipy.signal (periodogram, welch, coherence) — independent package spectral.json tsecon-spectral/…/golden.rs 1e-8
Distributions & special functions scipy.stats (normal, Student-t, GED, …) — independent package distributions.json tsecon-stats/…/golden.rs pdf / logpdf / cdf 1e-12; ppf 1e-9
Linear algebra — Toeplitz solve / discrete Lyapunov / Levinson-Durbin scipy.linalg (solve_toeplitz, solve_discrete_lyapunov) + statsmodels levinson_durbin — independent package linalg.json tsecon-linalg/…/golden.rs 1e-10 (Levinson-Durbin 1e-12)
Simultaneous band critical values — the band="sup-t" / "sidak" / "bonferroni" routes of var_irf_bands, var_forecast, lp, lp_iv, lp_multiplier, lp_state, smooth_lp, panel_lp (closed forms only) mixed. The closed forms (pointwise / Bonferroni / Šidák) are a SciPy golden — scipy.stats.norm.ppf of the documented per-cell level. The sup-t routes are documented-formula cross-implementation goldens: NumPy's max-then-quantile on the identical stored draws matrix, and for the covariance route a shared SplitMix64 uniform stream the Rust side must reproduce, so the RNG is an input rather than a difference. That pins the arithmetic; that a sup-t band actually covers jointly is a separate claim, carried by the crate property tests and the interval-coverage audit. panel_lp's bands reuse the same pinned closed forms (sup-t is refused there — no cross-horizon covariance is estimated for the panel LP) and their joint coverage is graded property-MC (joint coverage measured, seeded, in test_simultaneous_bands.py and quoted on the panel card): no third-party reference for simultaneous LP bands exists in Python — statsmodels ships none simultaneous.json tsecon-stats/…/simultaneous_golden.rs, simultaneous_properties.rs; downstream: tsecon-var/…/simultaneous_bands.rs, tsecon-lp/…/simultaneous.rs closed forms 1e-12 rel; sup-t from draws 1e-14 rel (worst measured 1.8e-16); sup-t from a covariance 1e-10 abs (worst 4.2e-14) — absolute, because the Rust routine shifts each uniform by half a 2⁻⁵³ grid cell before inverting; k = 1 collapse to pointwise exact
RNG — Philox counter-based generator NumPy Philox bit-stream — independent package philox.json tsecon-rng/…/golden.rs bit-exact
Bootstrap resampling — bootstrap_indices, optimal_block_length no golden: property-validated — index range / full length for every scheme, moving vs circular block structure, the stationary scheme's geometric block-length distribution, wild-weight moments, and Politis-White behavior on a known AR(1) (finite and stable, short blocks on white noise, longer blocks under persistence); plus bit-exact seed reproducibility and thread-count invariance of the parallel driver none — seeded in-test simulation tsecon-bootstrap/…/properties.rs + reproducibility.rs fixed-seed 3-se property bounds; reproducibility bit-exact
Time-series CV — cv_splits (and crate-level cv_select) no golden: leakage safety is asserted analytically — every expanding / rolling test index lies strictly after its training window, purged K-fold honors the purge and embargo gaps exactly (the measured right-hand gap is purge + embargo — the additive AFML ch. 7 convention), and cv_select agrees with BIC selection on i.i.d. data as a sanity property none tsecon-ml/…/properties.rs + test_cv_splits.py exact index-set assertions
check_series (composition layer) no golden of its own — every component is individually validated above: ADF/KPSS/check_stationarity, ljung_box/acf/pacf, arch_lm, jarque_bera, sup_f_test/bai_perron, GPH (long_memory_d), periodogram, johansen, VAR lag selection. The routing itself is validated by seeded-DGP recovery tests (random walk → difference, GARCH → ARCH rec, broken mean → break dates, cointegrated pair → vecm, stationary VAR → var_fit) plus a Monte-Carlo white-noise size check on the per-family rejection rates; the .summary() report is snapshot-tested none (components' fixtures apply) test_check_series.py + test_results_check.py routing assertions exact; size within MC bands

Provenance

Most fixtures record, in a _meta block, the reference-library versions used to produce them. There is no single pinned version set, and the record is not complete — the 91 fixtures in fixtures/ were generated over three venv generations, and a regeneration reproduces a fixture's values only under the versions that fixture itself names. Counted directly over the shipped files:

Reference Versions recorded Fixtures recording it
statsmodels 0.14.6 (no disagreement) 39
NumPy 2.5.1 (37), 2.4.6 (21), 1.26.4 (12) 69
SciPy 1.17.1 (20), 1.18.0 (16) 35
arch 8.0.0 2
linearmodels 7.0 4
scikit-learn 1.9.0 1
ArviZ 1.2.0 1
R 4.3.3 (prose strings; lpdid names fixest 0.14.2 alongside) 2
Python 3.12.7 (28), 3.11.15 (13) 40

bvar_hierarchical was regenerated case by case and carries two _meta blocks from different generations, so it counts once in the right-hand column but appears under two versions in the middle one — that is why the NumPy, SciPy and Python rows each sum to one more than their total.

Two things this table makes visible that a single pinned list hid:

  • NumPy and SciPy move together, and the pair matters. The unit here is the _meta block, not the file. Every block naming NumPy 2.5.1 that also names SciPy names 1.18.0, and every one that also names Python names 3.12.7; every block naming NumPy 2.4.6 pairs with SciPy 1.17.1 and Python 3.11.15; every block naming NumPy 1.26.4 pairs with SciPy 1.17.1 and Python 3.12.7. Those three triples are the three generations, and no block names SciPy or Python without also naming NumPy. The combination NumPy 2.5.1 with SciPy 1.17.1 — which this page previously published as the pinned pair — is recorded by no _meta block in the suite.
  • 19 of the 91 fixtures record no library version at all, so they cannot be regenerated against a known reference: backtest_string_snapshot (a bitwise self-snapshot of tsecon's own string-forecaster paths — deliberately not a third-party golden, so there is no external version to record), dfgls (which names "arch 8.0.0" in a prose _meta.reference string but stores no structured version field), engle_granger (which names "statsmodels 0.14.6" in a prose _source string, same situation), fry_pagan_svar, hetero_svar, historical_decomposition_chol, long_run_svar, nowcast_mle, nowcast_news, phillips, tsecon-dsge, tsecon-gas, tsecon-nowcast, tsecon-panelroot, tsecon-recession, tsecon-survey, var_irf_bands, zero_sign_svar, zivot_andrews (prose again — "statsmodels 0.14.6" primary, "arch 8.0.0" cross-check). Several of these are the rows whose reference is an independent package, which is exactly where the version is load-bearing.

The goldens gate the Rust crate tests directly; that is the guarantee that holds for every fixture. The Python layer is a partial second pass, not a mirror: the binding suite in bindings/python/tests/ reloads 67 of the 100 fixture files. The other 33 are never opened from Python: advisors, arima_bse, auto_arima, bvar_hierarchical, distributions, engle_granger, fry_pagan_svar, gmm_first_stage, hc_robust, hetero_svar, historical_decomposition_chol, linalg, long_run_svar, max_share_svar, nongaussian_svar, nowcast_mle, nowcast_news, philox, phillips, proxy_ar, proxy_svar, proxy_svar_bands, robust_svar_bounds, simultaneous, ssvs, structural_fevd, tsecon-dsge, tsecon-gas, tsecon-nowcast, tsecon-panelroot, var_irf_bands, var_irf_bootstrap, zero_sign_svar. Most of those functions do have binding tests, but those tests assert shapes, argument handling, errors and invariants rather than reloading the golden numbers (linalg and distributions are internal primitives with no public Python function at all). For these 33, read the end-to-end claim as stopping at the crate boundary: the golden is enforced in Rust, and the binding is covered by its own tests.

The fixtures themselves store only derived numeric values and transformations of two public-domain reference series (the Nile river-flow series and US macrodata); no licensed dataset is redistributed. See the fixtures README for how each file is generated and regenerated.