Report cover — key takeaway
Report cover — key takeaway

Bank of England · UK mortgage model

BoE UK rates — morning report

Report date 2026-09-15 · OIS curve 2026-09-11

BoE UK rates — morning report

Report date: 2026-09-15
Parquet fetched: 2026-09-15T06:21:31.405712+00:00
OIS curve as of: 2026-09-11
Data cleaned: 2026-09-15T06:59:50.901512+00:00


Data pipeline workflow

End-to-end path from Bank of England original sources to this morning report.

Data pipeline waterfall
Data pipeline waterfall

Source → storage → report use

Original BoE source Stored as Used in this report for
OIS yield-curve zips (Excel spot sheets) ois_spots.parquet, ois_tenors.parquet OIS par yield table & charts
IADB IUDSOIA, IUDBEDR mortgage_quotes.parquet SONIA, Bank Rate, policy chart
IADB IUMBV34/42/45/48 mortgage_quotes.parquet Advertised mortgage table & margin explainer
Derived month-end mortgage_spreads.parquet Retail margin table, spread chart, YoY panel
Fetch metadata _meta.json Report header timestamps

Extract step: generate_boe_report.py loads the four parquet files (no live BoE call), builds matplotlib charts, and writes Markdown/HTML. Use --full-refresh to re-fetch BoE data first.


What we built this session

This folder now holds a small Bank of England data pipeline for UK mortgage / OIS analysis:

Script Purpose
fetch_boe_yield_curves.py Downloads BoE OIS yield curves (monthly + latest daily) and IADB quotes (SONIA, Bank Rate, advertised mortgages). Writes parquet under data/boe/.
clean_boe_parquet.py Removes unsound historic rows flagged by audit (bad decimal conversion in early IADB data). Rebuilds spreads.
audit_boe_parquet.py Validates parquet; writes audit_report.xlsx/md, audit_errors.csv, and timestamped copies under audit_history/.
export_boe_latest.py One-page printable snapshot → latest_rates.html / .md.
export_boe_ytd.py Excel export of year-to-date rates.
refresh_uk_rates.py Pushes parquet snapshots into uk_mortgage_model.xlsx.
build_uk_mortgage_workbook.py Builds the layered mortgage workbook (OIS tenors, spread block).
generate_boe_report.py This report — Markdown + Python charts from parquet.

Parquet store (data/boe/)

File Contents
ois_spots.parquet Long-format OIS spot curve (continuous %, by maturity)
ois_tenors.parquet Wide-format par OIS at 1y–25y (+ par / AC / CC columns)
mortgage_quotes.parquet SONIA, Bank Rate, advertised 2y/5y/10y/var mortgages
mortgage_spreads.parquet Month-end advertised − OIS spreads + 36m median / IQR
_meta.json Fetch metadata, URLs, row counts

Data quality work

Early IADB values were stored with a flawed to_decimal() rule (values ≤ 1.5 not divided by 100).
clean_boe_parquet.py truncated bad history per series; audit now passes 0 fail / 0 warn.

Cutoffs applied: SONIA/Bank Rate from 2022-08-04; mortgages from 2021-11-30 (var from 2017-11-30); OIS 10y+ nulled before 2021-12-01.


Latest rates (one-page table)

Policy & mortgage rates

Series Code As of Rate
SONIA IUDSOIA 2026-09-10 3.731%
Bank Rate IUDBEDR 2026-09-11 3.750%
2-year fixed mortgage IUMBV34 2026-08-31 4.920%
5-year fixed mortgage IUMBV42 2026-08-31 4.780%
10-year fixed mortgage IUMBV45 2026-08-31 5.250%
Variable mortgage IUMBV48 2026-08-31 4.230%

OIS par yields (BoE curve)

Tenor As of Rate
1-year 2026-09-11 4.451%
2-year 2026-09-11 4.685%
3-year 2026-09-11 4.720%
5-year 2026-09-11 4.753%
10-year 2026-09-11 4.936%
15-year 2026-09-11 5.122%
20-year 2026-09-11 5.230%
25-year 2026-09-11 5.265%

Retail margin (advertised − OIS)

Tenor Month-end spread Implied (latest) 36m median 36m IQR
2y 56.0 bp 23.5 bp 51.8 bp 38.2 bp – 64.6 bp
5y 31.2 bp 2.7 bp 44.5 bp 29.6 bp – 60.2 bp
10y 52.1 bp 31.4 bp 60.3 bp 46.8 bp – 82.5 bp
Full series list (all parquet fields)
Category Series Code As of Latest
Policy rate
SONIA IUDSOIA 2026-09-10 3.731%
Bank Rate IUDBEDR 2026-09-11 3.750%
Mortgage (advertised)
2-year fixed mortgage IUMBV34 2026-08-31 4.920%
5-year fixed mortgage IUMBV42 2026-08-31 4.780%
10-year fixed mortgage IUMBV45 2026-08-31 5.250%
Variable mortgage IUMBV48 2026-08-31 4.230%
OIS par yield
1-year y1 2026-09-11 4.451%
2-year y2 2026-09-11 4.685%
3-year y3 2026-09-11 4.720%
5-year y5 2026-09-11 4.753%
10-year y10 2026-09-11 4.936%
15-year y15 2026-09-11 5.122%
20-year y20 2026-09-11 5.230%
25-year y25 2026-09-11 5.265%
Retail margin
2y advertised − OIS spread_2y 2026-08-31 56.0 bp
5y advertised − OIS spread_5y 2026-08-31 31.2 bp
10y advertised − OIS spread_10y 2026-08-31 52.1 bp
Retail margin (implied)
2y at latest quotes implied_2y 2026-09-11 23.5 bp
5y at latest quotes implied_5y 2026-09-11 2.7 bp
10y at latest quotes implied_10y 2026-09-11 31.4 bp
Margin history
2y 36m median median_36m_2y 2026-09-11 51.8 bp
2y 36m 25th pct p25_36m_2y 2026-09-11 38.2 bp
2y 36m 75th pct p75_36m_2y 2026-09-11 64.6 bp
5y 36m median median_36m_5y 2026-09-11 44.5 bp
5y 36m 25th pct p25_36m_5y 2026-09-11 29.6 bp
5y 36m 75th pct p75_36m_5y 2026-09-11 60.2 bp
10y 36m median median_36m_10y 2026-09-11 60.3 bp
10y 36m 25th pct p25_36m_10y 2026-09-11 46.8 bp
10y 36m 75th pct p75_36m_10y 2026-09-11 82.5 bp

BoE mortgage rates — what a householder pays

The Bank of England does not publish “what John Smith pays on his mortgage.” It publishes quoted (advertised) household interest rates — monthly, weighted averages of headline rates that UK lenders advertise for standard products.

Official methodology: Further details about quoted household interest rates. Key points:

Advertised rates in our parquet (latest)

Product BoE code As of Rate
2y fix 75% LTV IUMBV34 2026-08-31 4.920%
5y fix 75% LTV IUMBV42 2026-08-31 4.780%
10y fix 75% LTV IUMBV45 2026-08-31 5.250%
Variable 75% LTV IUMBV48 2026-08-31 4.230%

10-year fixed — the BoE benchmark rate

Series: IUMBV45mtg_10y in mortgage_quotes.parquet
Latest: 5.250% as of 2026-08-31

This is the official BoE answer for: “typical advertised 10-year fixed at 75% LTV.” A householder who matches that profile (75% LTV, standard criteria, near the weighted-average product) might expect a headline rate around this level — but individual quotes vary.

Decomposition (month-end, from mortgage_spreads.parquet):

Component Value Source
Advertised 10y fix 5.250% mtg_10y / IUMBV45
Matching 10y OIS par 4.729% ois_10y (curve on spread date)
Lender margin (advertised − OIS) 52.1 bp spread_10y
36-month median margin (10y) 60.6 bp median_36m_10y

Latest OIS curve (2026-09-11): 10y par = 4.936% — useful for repricing if mortgage quote is stale.

OIS 10y vintages. 4.729% on the 2026-08-31 spread date vs 4.936% on the latest curve (2026-09-11). Cover chart 1 uses the spread-date vintage so advertised, OIS, and margin share one as-of date.

Illustrative payment: £300,000 loan, 25-year repayment, 5.250% fixed → ≈ £1,798/month (excludes fees, ERC, insurance; not APR).

Recent 10y advertised trend:

Month-end 10y rate
2026-06-30 5.180%
2026-07-31 5.160%
2026-08-31 5.250%

BoE database: IUMBV45 — 10y fixed 75% LTV


15-year fixed — not published by BoE

The BoE does not publish a 15-year mortgage quoted rate. Fixed quoted series in IADB run 2y, 3y, 5y, and 10y only (we fetch 2y/5y/10y; 3y is IUMBV37 and could be added). See BoE mortgage series search.

15-year fixes exist in the market but are uncommon. We can only estimate from swap curve + margin proxy:

Method Estimated 15y fix Notes
15y OIS par (2026-09-11) 5.122% y15 in ois_tenors.parquet
+ Aug 10y margin (52.1 bp) 5.643% Uses latest observed 10y spread as proxy
+ 36m median 10y margin (60.6 bp) 5.728% Uses typical long-end margin

These ~5.6–5.7% figures are indicative only — for a real 15y quote use a broker or comparison site.


BoE average vs what you might get elsewhere

Compare like with like: same LTV, fixation period, and whether you want average (BoE) or best-buy (brokers).

Source What it shows vs our BoE data
BoE IUMBV45 Official monthly weighted average, 75% LTV mtg_10y in parquet
Moneyfacts Underlying product feed BoE uses Should track closely; BoE is averaged & sales-weighted
Uswitch mortgages Live best deals by filters Often below BoE average (best-buy selection)
MoneySuperMarket Comparison tables Same — promotional / cherry-picked deals
Rightmove Mortgages Live rates with filters Good “what’s on market today” check
Habito / L&C Broker quotes & exclusives Personalised; may beat or exceed BoE average
Which? mortgages Curated best buys Sanity check, not a weighted average

Typical pattern:

Factor BoE quoted rate Real borrower
LTV Fixed at 75% 90%/95% → higher rate
Product Weighted average advertised May get best-buy below or specialist above
Fees Excluded from rate APR / true cost differs
Timing Month-end, published with lag Broker rates move daily
15y fix Not published Broker / comparison site only

Use BoE for: historical trends, macro analysis, and retail-margin vs OIS (our spread charts).
Use brokers / comparison sites for: “what could I get today?” before applying.


Charts (Python / matplotlib)

Spread Trends By Tenor
Spread Trends By Tenor

Ois Par Yields
Ois Par Yields

Mortgage Advertised
Mortgage Advertised

Policy Rates
Policy Rates

Reading the spread chart


Regenerating with fresh data

Run from the project root (finance/):

# 1. Fetch latest BoE curves and IADB quotes into parquet
python3 fetch_boe_yield_curves.py

# 2. (If audit shows IADB errors) clean bad history and rebuild spreads
python3 clean_boe_parquet.py

# 3. Validate
python3 audit_boe_parquet.py

# 4. One-page rate snapshot (HTML + MD)
python3 export_boe_latest.py

# 5. This morning report (MD + charts)
python3 generate_boe_report.py

# Optional: push into Excel workbook / YTD export
python3 refresh_uk_rates.py
python3 export_boe_ytd.py

One-liner (fetch + audit + snapshot + report):

python3 generate_boe_report.py --full-refresh

Outputs from this script:

Output Path
Timestamped report data/boe/reports/YYYY-MM-DD_morning_report.md
Latest report copy data/boe/reports/latest_morning_report.md
Charts data/boe/reports/charts/*.png

Audit history is archived separately under data/boe/audit_history/<timestamp>/.


Notes


Generated by generate_boe_report.py at 2026-09-15 08:24 UTC.