diff --git a/economy/topics.py b/economy/topics.py index 63901b62..ba2b3120 100644 --- a/economy/topics.py +++ b/economy/topics.py @@ -141,6 +141,32 @@ def stored(value: float) -> str: return f"{value:,}" +def display(series: dict, value: float) -> str: + """The reading a person would say out loud. + + stored() is right for the method note and for anything asserting fidelity + to the snapshot, but it is wrong for the number a reader meets first: the + restructure made the public-finances headline read "-15,989.0" where the + page it replaced said "£16.0bn borrowed", and dropped "£77.1bn" and + "£749/week" from the site entirely. Scale and unit here; exact stored + value stays one line below and in the method note. + """ + units = series["units"].lower() + if "£m" in units or "\u00a3m" in units: + billions = abs(value) / 1000 + borrowed = " borrowed" if value < 0 and "borrowing" in series["title"].lower() else "" + return f"\u00a3{billions:,.1f}bn{borrowed}" + if "per week" in units: + return f"\u00a3{value:,.0f}/week" + if "thousand" in units: + return f"{value:,.0f}k" + if "percent" in units or units.startswith("%"): + # Keep the publisher's precision: a stored 5.0 is 5.0%, not 5%. The + # trailing zero is information about how the figure was published. + return f"{stored(value)}%" + return stored(value) + + def listed(items: list[str]) -> str: """Join a registry list the way a sentence needs it.""" if len(items) < 2: @@ -265,8 +291,8 @@ def stat_card(series: dict) -> str: now = latest(series) return f"""

{esc(label(series).upper())}

-

{esc(stored(now["value"]))}{suffix(series)}

-

{esc(series["units"])}

+

{esc(display(series, now["value"]))}

+

stored as {esc(stored(now["value"]))} · {esc(series["units"])}

Observation
{esc(now["period"])}
Vintage
{esc(series["vintage"])}
diff --git a/economy/topics/growth/index.html b/economy/topics/growth/index.html index ce04abbd..d0df3b81 100644 --- a/economy/topics/growth/index.html +++ b/economy/topics/growth/index.html @@ -80,8 +80,8 @@

The numbers, as the snapshot stores them.

REAL GROSS DOMESTIC PRODUCT

-

709,598.0

-

£m, chained volume measure

+

£709.6bn

+

stored as 709,598.0 · £m, chained volume measure

Observation
2026Q1
Vintage
2026-07-26
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

MONTHLY GROSS VALUE ADDED INDEX

103.2

-

index, chained volume measure, seasonally adjusted

+

stored as 103.2 · index, chained volume measure, seasonally adjusted

Observation
2026-05
Vintage
2026-07-26
@@ -100,8 +100,8 @@

The numbers, as the snapshot stores them.

REAL BUSINESS INVESTMENT

-

77,134.0

-

£m, chained volume measure, seasonally adjusted

+

£77.1bn

+

stored as 77,134.0 · £m, chained volume measure, seasonally adjusted

Observation
2026Q1
Vintage
2026-07-26
diff --git a/economy/topics/inflation/index.html b/economy/topics/inflation/index.html index 99167d2f..6d772884 100644 --- a/economy/topics/inflation/index.html +++ b/economy/topics/inflation/index.html @@ -81,7 +81,7 @@

The numbers, as the snapshot stores them.

CPI INFLATION

2.8%

-

percent, year-on-year

+

stored as 2.8 · percent, year-on-year

Observation
2026Q2
Vintage
2026-07-26
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

CORE CPI INFLATION

2.6%

-

percent, year-on-year

+

stored as 2.6 · percent, year-on-year

Observation
2026-06
Vintage
2026-07-26
diff --git a/economy/topics/jobs/index.html b/economy/topics/jobs/index.html index c76423db..f0d4e95a 100644 --- a/economy/topics/jobs/index.html +++ b/economy/topics/jobs/index.html @@ -81,7 +81,7 @@

The numbers, as the snapshot stores them.

UNEMPLOYMENT RATE

5.0%

-

percent

+

stored as 5.0 · percent

Observation
2026Q1
Vintage
2026-07-26
@@ -90,8 +90,8 @@

The numbers, as the snapshot stores them.

UK VACANCIES

-

712.0

-

thousands, seasonally adjusted three-month average

+

712k

+

stored as 712.0 · thousands, seasonally adjusted three-month average

Observation
2026-05
Vintage
2026-07-26
@@ -100,8 +100,8 @@

The numbers, as the snapshot stores them.

AVERAGE WEEKLY EARNINGS

-

749.0

-

£ per week, seasonally adjusted

+

£749/week

+

stored as 749.0 · £ per week, seasonally adjusted

Observation
2026-05
Vintage
2026-07-26
diff --git a/economy/topics/public-finances/index.html b/economy/topics/public-finances/index.html index c0ccd035..a599f4cb 100644 --- a/economy/topics/public-finances/index.html +++ b/economy/topics/public-finances/index.html @@ -80,8 +80,8 @@

The numbers, as the snapshot stores them.

PUBLIC-SECTOR NET BORROWING

-

-15,989.0

-

£m, current prices, not seasonally adjusted

+

£16.0bn borrowed

+

stored as -15,989.0 · £m, current prices, not seasonally adjusted

Observation
2026-06
Vintage
2026-07-26
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

PUBLIC-SECTOR NET DEBT

94.9%

-

percent of GDP, not seasonally adjusted

+

stored as 94.9 · percent of GDP, not seasonally adjusted

Observation
2026-06
Vintage
2026-07-26
diff --git a/economy/topics/rates/index.html b/economy/topics/rates/index.html index d3a8e7e3..f28b202f 100644 --- a/economy/topics/rates/index.html +++ b/economy/topics/rates/index.html @@ -81,7 +81,7 @@

The numbers, as the snapshot stores them.

OFFICIAL BANK RATE

3.75%

-

percent

+

stored as 3.75 · percent

Observation
2026-08-10
Vintage
2026-08-12
@@ -91,7 +91,7 @@

The numbers, as the snapshot stores them.

UK NOMINAL PAR YIELD, 5 YEAR

4.4356%

-

percent

+

stored as 4.4356 · percent

Observation
2026-08-07
Vintage
2026-08-12
@@ -101,7 +101,7 @@

The numbers, as the snapshot stores them.

UK NOMINAL PAR YIELD, 10 YEAR

4.9118%

-

percent

+

stored as 4.9118 · percent

Observation
2026-08-07
Vintage
2026-08-12
@@ -111,7 +111,7 @@

The numbers, as the snapshot stores them.

UK NOMINAL PAR YIELD, 20 YEAR

5.4311%

-

percent

+

stored as 5.4311 · percent

Observation
2026-08-07
Vintage
2026-08-12
diff --git a/obr/validation/index.html b/obr/validation/index.html index e9d138bc..4a06690d 100644 --- a/obr/validation/index.html +++ b/obr/validation/index.html @@ -121,7 +121,7 @@

Excellent anchored. Weak free-running. Both published.

Held add-factors Add-factors fitted 2024Q1–2025Q4, held flat, projected to 2027Q4. Scored over 2026Q1–2027Q4 on the March 2026 baseline (caveats in the notes below). - GDP 0.37%, consumption 0.33%; 6 of 8 computed variables within band. (The working paper's November-2025-vintage scorecard, over its own longer window, reports GDP 2.2% and consumption 3.6%.) + GDP 0.37%, consumption 0.33%; 6 of 8 computed variables within band. (The working paper reports GDP 2.2% and consumption 3.6% for the same 2026Q1–2027Q4 window — the difference is the EFO vintage it was anchored to, November 2025 against March 2026 here, not the window.) Free-running diff --git a/papers/boe-svar/figures/latest_shocks.json b/papers/boe-svar/figures/latest_shocks.json new file mode 100644 index 00000000..f08a1411 --- /dev/null +++ b/papers/boe-svar/figures/latest_shocks.json @@ -0,0 +1,60 @@ +{ + "quarter": "2026Q1", + "provenance": { + "model_id": "boe-svar", + "package": "boe_var", + "package_version": "0.1.0", + "model_version": "0.1.0", + "adapter_version": "0.2.0", + "source_url": "https://github.com/PolicyEngine/boe-var-model", + "source_revision": "3ab56259224c20a0bf65caa523e6e7440e56b37e", + "data_vintage": "conditioned through 2026Q1", + "baseline_vintage": "identified structural shocks", + "baseline": "identified structural shocks", + "estimation_sample": "1992Q1-2025Q1", + "run_at": "2026-08-12T13:41:15.541729+00:00", + "reproducibility": "Check out the recorded source URL at the recorded source revision, install the recorded adapter version, and rerun the serialized request against the recorded baseline and data vintage." + }, + "draws": 6000, + "accepted_draws": 430, + "ess": 197.9, + "warnings": [], + "shocks": [ + { + "shock": "World demand", + "p_positive": 0.287, + "p_negative": 0.713, + "reading": "World demand shock was probably negative in 2026Q1 (P(\u2212) = 0.71)." + }, + { + "shock": "World energy", + "p_positive": 0.105, + "p_negative": 0.895, + "reading": "World energy shock was clearly negative in 2026Q1 (P(\u2212) = 0.90)." + }, + { + "shock": "World supply", + "p_positive": 0.873, + "p_negative": 0.127, + "reading": "World supply shock was clearly positive in 2026Q1 (P(+) = 0.87)." + }, + { + "shock": "UK demand", + "p_positive": 0.809, + "p_negative": 0.191, + "reading": "UK demand shock was clearly positive in 2026Q1 (P(+) = 0.81)." + }, + { + "shock": "UK supply", + "p_positive": 0.715, + "p_negative": 0.285, + "reading": "UK supply shock was probably positive in 2026Q1 (P(+) = 0.71)." + }, + { + "shock": "UK mon. pol.", + "p_positive": 0.16, + "p_negative": 0.84, + "reading": "UK mon. pol. shock was clearly negative in 2026Q1 (P(\u2212) = 0.84)." + } + ] +} diff --git a/svar/index.html b/svar/index.html index 2680c1d7..7f0d873c 100644 --- a/svar/index.html +++ b/svar/index.html @@ -187,11 +187,10 @@

What's happening now, and why.

by negative world-demand (probability 0.71) and world-energy (0.90) shocks, against positive UK demand (0.81) and expansionary monetary policy - (0.84); the composite effect revises the - year-on-year path by +0.27pp on GDP growth at impact - and +0.22pp on CPI inflation at its peak three - quarters out. -

+ (0.84). Source and provenance: + latest_shocks.json, + 6,000 draws, 430 accepted, ESS 198. +

It does not score reforms. Mapping a policy reform into identified structural innovations is conceptually dubious, not