Skip to content
Merged
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 changelog.d/2542.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Bus fares from journeys now follow DfT's published local bus fares index (BUS0415a) by area and fiscal year from the 2024-25 benchmark, and the OBR CPI after the last published quarter (March 2026), instead of holding the benchmark yield and adding a cap term against a fixed 2024 cap schedule. The 2025-26 yield per fare-paying boarding outside London rises 12.6% (the index) instead of 24.9%. Northern Ireland, which has no published index, follows CPI. Cap changes after the last published quarter (the £2 cap in 2027 and its end in 2028) enter the baseline through the cap term. The bus fare cap schedules now keep their calendar dates, so a cap change part-way through a year applies from its date.
- Cap changes are priced from a three-band table of uncapped single fares (`gov.dft.bus.uncapped_single_fares`), fitted to DfT's evaluation of the £2 cap, the 2023-24 fare cap grant, the January 2025 fares index step and the funding announced for the £3 cap in 2025 and the £2 cap in 2027, and uprated with CPI, instead of one £2.748 fare for every single ticket. A £3 cap now binds, and a full year at £2 against no cap saves about £0.36bn a year at 2024-25 boardings instead of £0.70bn. A supplied `local_bus_uncapped_single_fare` replaces the table for that person.
1 change: 1 addition & 0 deletions changelog.d/2542.removed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Removed `gov.dft.bus.reference_year` and `gov.dft.bus.uncapped_single_fare`. The benchmark year of the published bus fare yield is `gov.dft.bus.benchmark_year`; the cap term reads `gov.dft.bus.fares.cap` and `gov.dft.bus.reference_fares.cap` in the same year; and cap changes are priced from `gov.dft.bus.uncapped_single_fares`. A reform naming a removed parameter fails with directions.
191 changes: 157 additions & 34 deletions docs/engineering/bus-fares.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ false and the person pays fares even if eligible for a statutory concession.
For fare-paying passengers,
`local_bus_single_fare_share` is the share of boardings bought as singles,
bounded to [0, 1]. Its fallback is 0.70, the 2024 NTS other-local-bus estimate.
An optional `local_bus_uncapped_single_fare` overrides the representative
uncapped fare described below. Negative quantities and fares price at zero.
An optional `local_bus_uncapped_single_fare` replaces the table of uncapped
single fares described below for that person. Negative quantities and fares
price at zero.

On loading a UK `Simulation`, a supplied household `bus_fare_spending` moves
to `bus_fare_spending_reported`. The stored total therefore cannot freeze the
Expand Down Expand Up @@ -66,6 +67,59 @@ residents because non-residents also travel there. Scotland and Northern
Ireland use the English other-local-bus trip rate as a proxy, as Microcosm does.
These translations include interchanges and differences between operator
boardings and resident trips; they are not counts of legs for a known trip.
`gov.dft.bus.benchmark_year` (2024) names the fiscal year these facts describe.

## Fares by year

In other years each area's yield moves with its published fares index:

```
yield(t) = benchmark_yield * index(t) / index(benchmark_year)
```

`gov.dft.bus.local_bus_fares_index` holds DfT's
[BUS0415a](https://www.gov.uk/government/statistical-data-sets/bus04-costs-fares-and-revenue)
quarter-end values (March 2005 = 100) for London, England outside London and
Scotland, from DfT's June 2026 release (quarters to March 2026;
[archived copy](https://web.archive.org/web/20260619124752/https://assets.publishing.service.gov.uk/media/6a310ac715f2a70fac7e6006/bus0415.ods)),
the vintage Chronicle and Microcosm vendor. DfT's September 2026 release, now
served at the same address, revises the last two quarters and adds June 2026;
move to it together with Microcosm. Each value is dated at the start of the
quarter it ends, and `fiscal_year_blend` day-weights the quarters over 6 April
to 5 April, the model's year. FY2024–25 outside London is therefore
(86 × 181.6 + 92 × 185.7 + 92 × 185.9 + 90 × 206.4 + 5 × 210.5) / 365 = 190.23,
within 0.2% of the mean of its four quarter ends (189.9). After the last
published quarter the index grows with the OBR consumer price index each
January, as `private_rent_index` does. Northern Ireland has no published index,
so its yield grows with CPI from the benchmark year. Wales stays unpriced.

The CPI projection also raises the fares in the index that the £3 cap holds at
£3, while the cap term below measures changes from a nominal £3. From January
2027 a ticket held at a cap therefore costs about £3 times the CPI growth since
March 2026 more than the cap allows. That overstates the outside-London yield
by 0.4% in 2027–28 and 0.8% in 2028–29, about 0.3 points more each year after.
A cap reform is measured against the same reference as the baseline, so its
cost does not move.

| Area | FY2024–25 | FY2025–26 | FY2026–27 | FY2027–28 |
|---|---:|---:|---:|---:|
| London | 196.10 | 196.10 | 197.13 | 201.08 |
| England outside London | 190.23 | 214.18 | 219.09 | 223.48 |
| Scotland | 210.63 | 229.94 | 235.90 | 240.63 |

FY2025–26 and earlier are published; later years are CPI projections. The
index records prices paid, so it already contains each cap in force while it
is published, including the rise to £3 in January 2025 (outside London 185.9
in December 2024, 206.4 in March 2025). The cap term below adds only what the
index cannot contain.

Each area follows its own index, so the England total moves with the
receipts-weighted mix of the London and outside-London indices: +7.6% in
FY2025–26. DfT's England index rose 6.4%. Its step from December 2024 to
March 2025 was 5.6%, against 11.0% outside London and none in London, so it
weights outside London at about one half, where receipts weight it at 61%.
A receipts target moved by the England index therefore sits below the model's
England total.

## Caps and the uncapped counterfactual

Expand All @@ -79,45 +133,114 @@ representing the end of the announced scheme. These dates follow the
The cap does not affect the London series, Scottish or Northern Irish fares.
England outside London uses a representative participating-service assumption;
route-level participation and local lower caps require caller-supplied fares.
The table of uncapped fares below is fitted to national figures and applied
the same way in every English region outside London. Where a combined authority
already runs its own lower single fare, a national cap reform therefore
overstates the savings, and elsewhere it understates them. National totals
hold, but regional and distributional splits of a cap reform lean the wrong way.

The published yield already includes ticket discounts and the benchmark cap.
For an English fare-paying person's other-local-bus boardings, the model uses:
The published yield and index already include ticket discounts and the cap in
force. `gov.dft.bus.reference_fares.cap` records that cap: the cap in force up
to the last published quarter of the index (£3 from January 2025), held after
it. For an English fare-paying person's other-local-bus boardings, the model
uses:

```
current_yield = max(0, benchmark_yield + single_share *
(annual_min(uncapped_fare, current_cap) -
annual_min(uncapped_fare, reference_cap)))
spending = trips * boardings_per_trip * current_yield
yield(t) = max(0, benchmark_yield * index(t) / index(benchmark_year)
+ single_share * sum over bands b of share_b *
(annual_min(fare_b, fares.cap, t) -
annual_min(fare_b, reference_fares.cap, t)))
spending = trips * boardings_per_trip * yield(t)
```

Both schedules are read in the same year. While the index is published they
agree and the cap term is zero, so the baseline is the published path. After
the last published quarter the term adds the scheduled changes: the £2 cap from
January 2027 and its end in 2028. A reform of `fares.cap` adds its own
difference from the reference. Leave `reference_fares` unchanged in reforms.
When a newly published quarter is added to the index, extend
`reference_fares.cap` with the cap then in force;
`policyengine_uk/tests/test_bus_fare_parameters.py` fails until the two
schedules agree up to the last published quarter.

`annual_min` caps the fare in each date interval, then weights the intervals
from 6 April to 5 April, assuming uniform journeys through the year. It does
not cap a fare using the average cap. Both `fares` and `reference_fares` preserve
calendar dates. `reference_year` is 2024 and `reference_fares` holds the benchmark
schedule fixed when the policy cap changes. The source receipts use 1 April to
31 March; this approximation treats them as the corresponding model year's
benchmark. Annual Scenario changes apply to the full model fiscal year.

The default uncapped fare is £2.748019953976. This is an aggregate assumption,
not an observed fare distribution. The FY2024–25 cap grant is £515,693,216.60.
With `F = B - C` outside London and single share `s = 0.70`, the assumption
solves `s * (u - annual_min(u, reference_cap)) = grant / F`. Since `2 < u < 3`,
the reference year has 270 days at £2 and 95 at `u`, giving:
not cap a fare using the average cap. Both `fares` and `reference_fares` keep
calendar dates (their index files propagate `preserve_calendar_dates` to the
cap leaves), so a cap change part-way through a year applies from its date.
The source receipts use 1 April to 31 March; this approximation treats them as
the corresponding model year's benchmark. Annual Scenario changes apply to the
full model fiscal year.

```
u = 2 + grant / (F * 0.70 * 270/365)
```
### Uncapped single fares

What a cap saves depends on how uncapped single fares are spread, not on their
average. `gov.dft.bus.uncapped_single_fares` holds three bands, each with its
share of single tickets and its mean uncapped fare at FY2024–25 prices:

| Band | Share | Mean fare |
|---|---:|---:|
| `LOW`, at or below £2 | 0.55 | £1.65 |
| `MIDDLE`, above £2 and up to £3 | 0.30 | £2.21 |
| `HIGH`, above £3 | 0.15 | £3.87 |

The fares rise with the OBR CPI after FY2024–25 and the shares stay, so a fixed
cap saves more as fares rise. The model caps each band's mean fare under both
schedules and weights the bands by their shares, which must sum to one. With
the bands at their means, the table is exact for caps of £2 and £3 at
FY2024–25 prices and approximate for other caps; a cap below the low band's
mean needs more bands.

`scripts/fit_bus_cap_savings.py` fits the table by least squares to the facts
below, each scaled by its tolerance. It searches shares in steps of one point
and fares in steps of one penny, keeps each band's mean at least 10% above its
lower edge, and sets the low band's fare so all singles average £2.15:

| Fact | Source | Target | Table gives |
|---|---|---:|---:|
| A full year at £2, 2023–24 | Fare cap support, DfT BUS05bi | £278.95m ± 10% | £280.9m |
| Part of the December 2024 to March 2025 index step outside London due to the £3 cap | BUS0415a: +11.0%; neighbouring quarters 0.1% to 2.3% | 10% ± 1 point of the yield | 9.8% |
| The £3 cap in 2025 | ["over £150 million"](https://www.gov.uk/government/speeches/national-bus-fare-cap) | £150m ± 20% | £140.0m |
| The £2 cap in 2027, against no cap | ["£400 million"](https://www.gov.uk/government/speeches/2-bus-fares-from-january-2027) | £400m ± 20% | £411.6m |
| Mean pre-cap price of single tickets | [DfT evaluation](https://www.gov.uk/government/publications/evaluation-of-the-2-bus-fare-cap), Table 6 | £2.15 ± £0.10 | £2.15 |
| Share of single tickets above £2 | Table 6: £0.32 / (£2.73 − £2.00) | 0.44 ± 0.05 | 0.45 |
| Their mean pre-cap price | Table 6 | £2.73 ± £0.10 | £2.76 |
| 2024–25: £2 for 270 days, then £3 | Fare cap support, DfT BUS05bi | £515.69m, not fitted | £268.5m |

The £400 million is read as £2 against no cap: the £3 scheme is funded only to
December 2026, and the £2 scheme replaces it. Read as £2 against a continued
£3 cap, the table gives £247.3m, 38% below. The script prints both.

The 2024–25 grant, for the benchmark year itself, is reported and not fitted;
the table puts it at about half. Grant per fare-paying boarding rose 78% on
2023–24, while the outside-London index rose 6.7%, receipts per fare-paying
boarding rose 2.8%, and the cap rose only for the last quarter. The figure may
therefore hold more than that year's forgone fares (timing or coverage of
payments, not checked). The 2023–24 grant and the two announced figures all
put a full year at £2 near £0.3bn, not £0.6bn. The single £2.748 fare this
table replaced was calibrated to the 2024–25 grant.

The costs use the 0.70 default single share and fare-paying boardings outside
London (BUS01 journeys less BUS01c concessionary journeys: 1,281m in 2023–24
and 1,331m in 2024–25, which also stands for 2025 and 2027), with fares moved
to each year by CPI. Table 6 compares January to October 2022 with the same
months of 2023 and is read at face value, for the table's shape. Deflated to
2022 prices it would put the 2023–24 saving about a third above the grant.
Possible reasons, not checked, are that the grant pays operators for revenue
lost net of the journeys the cap added, and that Table 6 covers the larger
participating operators only. The two announced figures are budgets; the £2
cap's first ten months paid £210m against £245m planned. The table is a fitted
central estimate, not an observed fare distribution.

At FY2025–26 prices the table saves £0.39 per single ticket for a full year at
£2 against no cap, and £0.15 at £3: about £0.36bn and £0.14bn a year at
2024–25 boardings. The single £2.748 fare this replaced saved £0.75 at £2
(about £0.70bn) and nothing at £3.

Removing the cap therefore raises the benchmark yield from about £1.55 to
£1.94 at the representative share, matching the grant-addback calculation
in issue #1871. This assumes full grant pass-through and no demand response.
Individual shares can differ, so a dataset aggregate need not recover the
published grant. Caps at or above £2.75, including the £3 cap, have no effect
relative to uncapped travel under the default £2.748 representative fare.
The default has no fare distribution above these caps, so it cannot estimate
the savings those caps give to passengers with higher fares. Supply
person-specific `local_bus_uncapped_single_fare` values above a cap to model
its effect on those passengers. Very large reductions can reach the zero-yield
A dataset or calculator can supply `local_bus_uncapped_single_fare` for each
person. Where it is supplied, that person's single tickets cost that one fare
before the cap, and the table is not used. Single-year datasets extended by
`Simulation` uprate it with CPI. Very large reductions can reach the zero-yield
floor.

## Other reform controls and limits
Expand All @@ -127,8 +250,8 @@ spending. Both default to one; they are neutral reform controls rather than
historical index series. Keep the denominator positive. `ridership_index`
defaults to one and multiplies journey-priced spending, leaving supplied
journey inputs intact. The model includes no demand elasticity or automatic
ridership growth. Benchmark yields and trip translations stay nominally
constant after 2024 unless changed explicitly. Dataset CPI-uprated household
ridership growth. Trip translations stay constant after 2024 unless changed
explicitly; yields move with the fares index. Dataset CPI-uprated household
bus totals do not determine prices where journeys are available.

A proportional scenario can set `gov.dft.bus.fare_index` to 0.9 for a 10%
Expand Down
1 change: 1 addition & 0 deletions policyengine_uk/data/uprating_indices.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ gov.economic_assumptions.yoy_growth.obr.consumer_price_index:
- income_support_reported
- jsa_contrib_reported
- jsa_income_reported
- local_bus_uncapped_single_fare
- maintenance_expenses
- maternity_allowance_reported
- miscellaneous_consumption
Expand Down
15 changes: 15 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/benchmark_year.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
description: Fiscal year of the published bus fare benchmark. yield_per_boarding and
boardings_per_trip describe this year (FY2024-25 receipts and boardings), and the yield in
another model year is the benchmark yield times the local bus fares index in that year over
its value in this one.
values:
'0001-01-01': 2024
metadata:
unit: year
period: year
label: bus fare benchmark year
reference:
- title: DfT bus statistics, BUS01 and BUS05i, 2024-25
href: https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables
- title: Microcosm 954, published-fact extraction and pricing derivation
href: https://github.com/PolicyEngine/microcosm/pull/954
3 changes: 2 additions & 1 deletion policyengine_uk/parameters/gov/dft/bus/fare_index.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
description: Proportional multiplier on bus fares; a neutral reform lever, not a measured
historical fare index.
historical fare index. The published DfT fares index that moves the baseline is
gov.dft.bus.local_bus_fares_index.
values:
'0001-01-01': 1
metadata:
Expand Down
4 changes: 4 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/fares/index.yaml
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
metadata:
# The formula day-weights the cap over 6 April to 5 April itself, so the
# leaves keep their calendar dates instead of fiscal-year annualisation.
# Leaves only see node metadata that is propagated.
preserve_calendar_dates: true
propagate_metadata_to_children: true
Loading
Loading