Bank of England · UK mortgage model
BoE UK rates — morning report
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.
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:
- Product data is sourced from Moneyfacts (the same product universe used by many comparison sites).
- 75% LTV, owner-occupier, loans roughly £25,000–£500,000.
- The lowest qualifying headline rate for each product type (fees/cashback help select the product but are not included in the rate).
- Weighted using FCA product sales data — reflects market mix, not necessarily the cheapest deal on a comparison site.
- This is not APR (fees are excluded from the quoted rate).
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: IUMBV45 → mtg_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:
- BoE 10y (5.250%, 2026-08-31) — market average at 75% LTV.
- Comparison site “from” rates — often lower for strong profiles on promotional fixes (check same LTV and term).
- 90% / 95% LTV — typically +30–80 bp above the 75% benchmark.
| 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)
Reading the spread chart
- Solid lines: month-end retail margin (advertised fixed rate minus matching-tenor OIS par). Labels at right show latest level in bp.
- Dashed lines: 36-month rolling median for each tenor.
- Lower panel: 12-month change — red = margin widening (lenders charging more over swap), green = tightening.
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
- BoE
yNcolumns are spot-starting par OIS from the published spot curve — not forward-curve points. When comparing to BlueGamma or Chatham, match spot par swap rows and the same as-of date. - Mortgage quotes are monthly; OIS and policy rates can be daily.
- Retail margin uses BoE advertised 75% LTV series (IUMBV34/42/45), not live lender menus.
Generated by generate_boe_report.py at 2026-09-15 08:24 UTC.