Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions integration/src/policyengine_macro/capabilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,8 @@ def _quality(level: str, evidence: str, next_gate: str) -> dict:
"real data to numerical precision.",
"Keep all exact invariants hard-gated for every specification.",
),
# Figures in this entry and the next are from boe-var-model 845e2a4
# (data through 2026Q1), the run vintage cited on /svar/validation.
"predictive_validation": _quality(
"weak",
"No demonstrated skill against a random walk WITH DRIFT on any "
Expand Down
3 changes: 2 additions & 1 deletion papers/boe-svar/figures/make_comparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@
# Fast fixed-seed configuration, identical to tests/conftest.py.
N_DRAWS, SAMPLE_SEED, IDENT_SEED, LAGS = 600, 1, 2, 4

# Production artifact (results/summary.md): 10,000 draws, importance-weighted,
# Production artifact (results/summary.md at boe-var-model 845e2a4, data through
# 2026Q1 -- the run vintage the site and paper cite): 10,000 draws, importance-weighted,
# sample 1992Q1-2025Q1 (2026Q1 vintage). Posterior MEAN of the per-draw group
# share at 4 quarters — the paper-comparable statistic.
PROD = {"gdp": 37.4, "cpi": 42.3}
Expand Down
2 changes: 1 addition & 1 deletion papers/boe-svar/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ <h2 class="paper-title">An open replication of the Bank of England structural VA

<p class="chip-row"><span class="chip chip-brand">Working paper</span><span class="chip">No DOI</span><span class="chip">Vahid Ahmadi &middot; PolicyEngine</span></p>
<p class="paper-result" style="max-width:78ch;">The paper&rsquo;s claim in one line: an open replication that matches the Bank&rsquo;s GDP variance decomposition, falls short on CPI, and shows no forecast skill over a random walk with drift once the tests are adjusted together.</p>
<details class="about"><summary>More detail</summary><p>Current forecast: data through <strong>2026Q1</strong>, outlook <strong>2026Q2&ndash;2029Q2</strong>. Every figure is on the <a href="/svar/validation">validation tab</a>.</p></details>
<details class="about"><summary>More detail</summary><p>Current forecast: data through <strong>2026Q1</strong>, outlook <strong>2026Q2&ndash;2029Q2</strong>. Every figure is on the <a href="/svar/validation">validation tab</a>. The replication and evaluation figures come from the model repository as committed at <a href="https://github.com/PolicyEngine/boe-var-model/tree/845e2a4">845e2a4</a> (data through 2026Q1).</p></details>
<details class="expander">
<summary>What the paper covers</summary>
<ol>
Expand Down
Binary file modified papers/boe-svar/main.pdf
Binary file not shown.
2 changes: 1 addition & 1 deletion papers/boe-svar/sections/implementation.tex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ \subsection{Code architecture}

\subsection{Estimation and identification runs}

The production configuration takes \textbf{10{,}000} posterior draws, of which \textbf{744} survive the sign-restriction accept/reject step (a 7.4 per cent acceptance rate), with $p=4$ lags and hyperparameters $\lambda = 0.2$, $\mu = 1$. Zero restrictions are satisfied by construction on every draw; sign restrictions are enforced by rejection, so they too hold exactly on every accepted draw --- neither fact is a test (Section~\ref{sec:validation}). Because the \citet{arias2018} zero-restriction sampler does not draw $Q$ uniformly from the restricted set, the slow validation path additionally computes the algorithm's importance weights (each requiring a numerical Jacobian per accepted draw); the importance-weighted effective sample size is \textbf{356.1}, and weighted and unweighted results are compared in Section~\ref{sec:validation}. The forecast-revision exercise re-estimates through 2024Q2 with 6{,}000 draws (487 accepted, weighted ESS 207.5). The hosted interactive tools default to a smaller 2{,}000-draw run on the extended sample; the 10{,}000-draw run described here is the publication artifact.
The production configuration takes \textbf{10{,}000} posterior draws, of which \textbf{744} survive the sign-restriction accept/reject step (a 7.4 per cent acceptance rate), with $p=4$ lags and hyperparameters $\lambda = 0.2$, $\mu = 1$. Zero restrictions are satisfied by construction on every draw; sign restrictions are enforced by rejection, so they too hold exactly on every accepted draw --- neither fact is a test (Section~\ref{sec:validation}). Because the \citet{arias2018} zero-restriction sampler does not draw $Q$ uniformly from the restricted set, the slow validation path additionally computes the algorithm's importance weights (each requiring a numerical Jacobian per accepted draw); the importance-weighted effective sample size is \textbf{356.1}, and weighted and unweighted results are compared in Section~\ref{sec:validation}. The forecast-revision exercise re-estimates through 2024Q2 with 6{,}000 draws (487 accepted, weighted ESS 207.5). The hosted interactive tools default to a smaller 2{,}000-draw run on the extended sample; the 10{,}000-draw run described here is the publication artifact. Its figures, and those of the rolling-origin evaluation in Section~\ref{sec:validation}, are the ones committed in the model repository at revision \texttt{845e2a4} (22 September 2026; data through 2026Q1, estimation sample 1992Q1--2025Q1).

\subsection{Hosted MCP tools}

Expand Down
2 changes: 1 addition & 1 deletion svar/methodology/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ <h4>Corrections</h4>

<div class="meth-step" id="meth-4" data-step="3">
<div class="meth-step-head"><span class="meth-step-num mono">4</span><h3>Sampling: draws and acceptance</h3></div>
<p>This is accept/reject sampling. The production run drew <strong>10,000</strong> posterior <mjx-container data-tex="(\Pi, \Sigma)" data-mjx="df92f8bdd622c0fb" class="MathJax" jax="CHTML" style="font-size: 123.6%; position: relative;"><mjx-math class=" MJX-TEX" aria-hidden="true"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mi class="mjx-n"><mjx-c class="mjx-c3A0"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-n" space="2"><mjx-c class="mjx-c3A3"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><mi mathvariant="normal">Π</mi><mo>,</mo><mi mathvariant="normal">Σ</mi><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> draws, of which <strong>744 passed</strong> the sign restrictions (7.4%), for an importance-weighted <a class="gloss-link" href="/glossary#ess">effective sample size</a> of <strong>356.1</strong> (<a href="https://github.com/PolicyEngine/boe-var-model/blob/main/results/summary.md">results/summary.md</a>, seed 20260812) — so medians and bands are correct but noisier than the paper's.</p>
<p>This is accept/reject sampling. The production run drew <strong>10,000</strong> posterior <mjx-container data-tex="(\Pi, \Sigma)" data-mjx="df92f8bdd622c0fb" class="MathJax" jax="CHTML" style="font-size: 123.6%; position: relative;"><mjx-math class=" MJX-TEX" aria-hidden="true"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mi class="mjx-n"><mjx-c class="mjx-c3A0"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-n" space="2"><mjx-c class="mjx-c3A3"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><mi mathvariant="normal">Π</mi><mo>,</mo><mi mathvariant="normal">Σ</mi><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> draws, of which <strong>744 passed</strong> the sign restrictions (7.4%), for an importance-weighted <a class="gloss-link" href="/glossary#ess">effective sample size</a> of <strong>356.1</strong> (<a href="https://github.com/PolicyEngine/boe-var-model/blob/845e2a4/results/summary.md">results/summary.md</a> at commit 845e2a4, data through 2026Q1, seed 20260812) — so medians and bands are correct but noisier than the paper's.</p>
<div class="meth-inline">
<div class="meth-sec-title">Accept/reject sampling</div>
<div class="meth-eq"><div class="meth-eq-label">Production run</div><div class="meth-eq-body">10,000 draws &rarr; 744 accepted (7.4%)</div></div>
Expand Down
5 changes: 3 additions & 2 deletions svar/validation/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ <h2>Where this departs from the Bank&rsquo;s model</h2>
<div class="band-head" data-icon="chart">
<h2>Replication, one frozen origin, 49 origins, the benchmark</h2>
</div>
<p class="section-intro">Run vintage: every replication and evaluation figure on this tab comes from the model repository as committed at <a href="https://github.com/PolicyEngine/boe-var-model/tree/845e2a4">845e2a4</a> (22 Sep 2026), with data through 2026Q1 and the estimation sample 1992Q1&ndash;2025Q1. A later data refresh would move them.</p>
<details class="expander dim-fold">
<summary><span><strong>Evidence by dimension:</strong> implementation fidelity strong; identification, uncertainty and vintage reproducibility moderate; predictive validation weak; policy counterfactuals not applicable</span></summary>
<!-- Levels and next gates: integration/src/policyengine_macro/capabilities.py MODEL_QUALITY["boe-svar"]. -->
Expand Down Expand Up @@ -458,7 +459,7 @@ <h2>Replication, one frozen origin, 49 origins, the benchmark</h2>
</ul>
<p class="vc-notes">Vertical bars span the best and worst of the eight variables; lowest cell 29% (CPI energy, 68% band, h4).</p>
</div><!-- /vc-fig -->
<figcaption>Empirical interval coverage across 49 expanding-window origins, mean across the eight variables, by horizon. The 68% band <em>over</em>-covers at one quarter (71%) and falls below nominal from two onward; the 90% band <strong>under-covers</strong> at every horizon. Both worsen with horizon — the opposite of the frozen-origin reading above, and the one to weight. These figures are the evaluation run without Covid dummies. The same evaluation with the six Covid dummies (2020Q1&ndash;2021Q2) that the published fans use covers about the same: 69% at one quarter and 56% at eight (<a href="https://github.com/PolicyEngine/boe-var-model/blob/main/results/coverage_evaluation.json">boe-var-model <code>production_spec</code></a>). Source: <code>papers/boe-svar/figures/coverage_evaluation.json</code>.</figcaption>
<figcaption>Empirical interval coverage across 49 expanding-window origins, mean across the eight variables, by horizon. The 68% band <em>over</em>-covers at one quarter (71%) and falls below nominal from two onward; the 90% band <strong>under-covers</strong> at every horizon. Both worsen with horizon — the opposite of the frozen-origin reading above, and the one to weight. These figures are the evaluation run without Covid dummies. The same evaluation with the six Covid dummies (2020Q1&ndash;2021Q2) that the published fans use covers about the same: 69% at one quarter and 56% at eight (<a href="https://github.com/PolicyEngine/boe-var-model/blob/845e2a4/results/coverage_evaluation.json">boe-var-model <code>production_spec</code></a>). Source: <code>papers/boe-svar/figures/coverage_evaluation.json</code>.</figcaption>
</figure>
<p class="kv-title">49 expanding-window origins</p>
<dl class="kv kv-text"><div><dt>Run</dt><dd>evaluation model without Covid dummies</dd></div><div><dt>68% band, h=1</dt><dd>71%, just above nominal</dd></div><div><dt>68% band, h=8</dt><dd>57%</dd></div><div><dt>90% band</dt><dd>under-covers at every horizon</dd></div><div><dt>Unemployment satellite</dt><dd>beats no-change at h=1&ndash;4 only, not significant</dd></div></dl>
Expand All @@ -479,7 +480,7 @@ <h2>Replication, one frozen origin, 49 origins, the benchmark</h2>
not significant), so the published path is capped there. Its
specification is on the <a href="/svar/methodology#meth-5">methodology
tab</a>; skill table:
<a href="https://github.com/PolicyEngine/boe-var-model/blob/main/results/unemployment_satellite_validation.json">unemployment_satellite_validation.json</a>.
<a href="https://github.com/PolicyEngine/boe-var-model/blob/845e2a4/results/unemployment_satellite_validation.json">unemployment_satellite_validation.json</a>.
</p>
</details>
</details>
Expand Down
Loading