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 â,b̂ 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); unconditional ≡ var_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, R², 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 leg — Monte-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 limits — lam_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)/2 — properties.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
_metablock, 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_metablock 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.referencestring but stores no structured version field),engle_granger(which names "statsmodels 0.14.6" in a prose_sourcestring, 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.