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
1 change: 1 addition & 0 deletions changelog.d/1852.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Keep the unimplemented Scottish Two Child Limit Payment inactive in the baseline, with explicit counterfactual tests.
1 change: 1 addition & 0 deletions changelog.d/1871.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Price supplied person-level bus journeys with regional yields, single-fare caps and proportional reform controls, preserving reported spending for legacy data.
1 change: 1 addition & 0 deletions changelog.d/2064.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Recognise housing-association tenants as renting and share the rental tenure predicate between households and benefit units.
1 change: 1 addition & 0 deletions changelog.d/2065.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Preserve the independent Child Benefit claim gate, restore opted-out claimants' payments when a reform lowers the charge below a configurable behavioural threshold, and handle cliff charges without division warnings.
138 changes: 138 additions & 0 deletions docs/engineering/bus-fares.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# Bus fares from journeys

The model prices supplied person-level local-bus journeys from 2024 onwards.
`person_bus_fare_spending` sums London and other-local-bus spending;
`bus_fare_spending` sums it across household members. These outputs describe
spending. `transport_consumption` already includes bus spending, so consumers
must not add it to the consumption total again. This implementation does not
change transport consumption, disposable income or government subsidy totals.

## Inputs and fallback

The Microcosm `nts_bus_travel` stage supplies `bus_in_london_trips`,
`other_local_bus_trips`, their sum `local_bus_trips`, `bus_pass_eligible` and
`local_bus_single_fare_share` at Person level. Trips are annual quantities.
A supplied zero counts as journey data. A cached default does not. If only
`local_bus_trips` is supplied, London residents' trips use the London series
and other residents' trips use the other-local-bus series. When either split
series is supplied, that split takes precedence and the absent series is zero.
Supply consistent splits for cross-boundary travel.

The model treats a person flagged `bus_pass_eligible` as travelling free,
matching Microcosm's pricing assumption. The dataset owns that eligibility
flag; the model does not infer concessionary eligibility from age or change
it when a concessionary scheme is reformed. Supply `bus_pass_eligible` alongside
journey inputs, including in household calculators; an omitted flag defaults to
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.

On loading a UK `Simulation`, a supplied household `bus_fare_spending` moves
to `bus_fare_spending_reported`. The stored total therefore cannot freeze the
journey formula in a reform. Without journey inputs, the model retains this
reported total and allocates it using `fare_allocation_weight_by_age`.
Reported totals retain CPI uprating. Wales and unknown regions retain the
reported total even when journey inputs exist, following Microcosm's decision
to leave areas without published receipts unpriced. Before 2024 the model
also uses this legacy route. Direct core/YAML tests can still override the
household output explicitly.

## Published price benchmark

Microcosm prices journeys using FY2024–25 published facts. The model uses the
same inputs. For each area, receipts `R`, boardings `B`, concessionary
boardings `C`, annual trips per resident `T` and population `P` give:

- Fare-paying yield per boarding: `y = R / (B - C)`.
- Boardings per resident trip: `k = B / (T * P)`.

| Area | R (£) | B | C | T | P | y (£) | k |
|---|---:|---:|---:|---:|---:|---:|---:|
| London | 1,347,434,943.01459 | 1,821,485,000 | 497,523,765.08908 | 13.1155774642333 | 58,620,101 | 1.017729905895 | 2.369144880275 |
| England outside London | 2,069,953,713.42079 | 1,850,509,887.26131 | 519,107,608.59444 | 28.0685543170643 | 58,620,101 | 1.554716967657 | 1.124669202640 |
| Scotland | 391,000,000 | 334,000,000 | 183,599,374.01433 | 28.0685543170643 | 5,546,900 | 2.599723222144 | 2.145240985363 |
| Northern Ireland | 150,082,817.49 | 67,794,551.35 | 8,960,000 | 28.0685543170643 | 1,927,855 | 2.550929922065 | 1.252853758464 |

Sources: [DfT BUS01 and BUS05i](https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables),
[NTS0705a](https://www.gov.uk/government/statistical-data-sets/nts07-car-ownership-and-access),
[Scottish Transport Statistics 2025, tables 2.2a and 2.8](https://www.transport.gov.scot/publication/scottish-transport-statistics-2025/chapter-2-bus-and-coach-travel/),
[NI Public Transport Statistics 2024–25, figures 3, 4 and 6](https://www.infrastructure-ni.gov.uk/publications/public-transport-statistics-northern-ireland-2024-25),
and [Microcosm's fact extraction and pricing implementation](https://github.com/PolicyEngine/microcosm/pull/954).
Population denominators use ONS mid-2024 estimates. London uses all English
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.

## Caps and the uncapped counterfactual

`gov.dft.bus.fares.cap` records the national cap on participating single-ticket
services in England outside London: £2 from January 2023, £3 from January 2025,
and £2 from January through December 2027. After December 2027 it is infinite,
representing the end of the announced scheme. These dates follow the
[DfT evaluation](https://www.gov.uk/government/publications/evaluation-of-the-2-bus-fare-cap),
[£3 scheme guidance](https://www.gov.uk/guidance/3-national-bus-fare-cap) and
[2027 announcement](https://www.gov.uk/government/speeches/2-bus-fares-from-january-2027).
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 published yield already includes ticket discounts and the benchmark cap.
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
```

`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:

```
u = 2 + grant / (F * 0.70 * 270/365)
```

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
floor.

## Other reform controls and limits

`fare_index / prior_law_fare_index` multiplies both journey-priced and legacy
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
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%
reduction. A cap scenario changes `gov.dft.bus.fares.cap`; leave the reference
schedule and benchmark yield unchanged. Set the cap to infinity to remove it.
The fixture-scale tests exercise both routes through UK dataset loading and
Scenario, including baseline isolation and the January cap transitions.
3 changes: 2 additions & 1 deletion myst.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ project:
- title: Policy
children:
- file: docs/engineering/excise-duties.md
- file: docs/engineering/bus-fares.md
- file: docs/book/policy/model-baseline
- file: docs/book/policy/uc-rebalancing
site:
Expand All @@ -47,4 +48,4 @@ site:
html_css_files:
- style.css
execute:
execute_notebooks: off
execute_notebooks: off
1 change: 1 addition & 0 deletions policyengine_uk/data/uprating_indices.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ gov.economic_assumptions.yoy_growth.obr.consumer_price_index:
- afcs_reported
- alcohol_and_tobacco_consumption
- bus_fare_spending
- bus_fare_spending_reported
- bsp_reported
- carers_allowance_reported
- child_benefit_reported
Expand Down
26 changes: 26 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/boardings_per_trip.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
description: Published boardings divided by resident NTS trips in 2024-25. Scottish and
Northern Irish translations use the English other-local-bus trip rate as a proxy, matching
Microcosm. London uses all England residents because visitors also use London buses.
metadata:
unit: /1
period: year
label: bus boardings per trip
reference:
- title: DfT bus statistics, BUS01 and BUS05i, 2024-25
href: https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables
- title: DfT National Travel Survey, NTS0705a, 2024
href: https://www.gov.uk/government/statistical-data-sets/nts07-car-ownership-and-access
- title: Scottish Transport Statistics 2025, tables 2.2a and 2.8
href: https://www.transport.gov.scot/publication/scottish-transport-statistics-2025/chapter-2-bus-and-coach-travel/
- title: Northern Ireland Public Transport Statistics 2024-25, figures 3, 4 and 6
href: https://www.infrastructure-ni.gov.uk/publications/public-transport-statistics-northern-ireland-2024-25
- title: Microcosm 954, published-fact extraction and pricing derivation
href: https://github.com/PolicyEngine/microcosm/pull/954
LONDON:
'2024-01-01': 2.369144880275
ENGLAND_OUTSIDE_LONDON:
'2024-01-01': 1.12466920264
SCOTLAND:
'2024-01-01': 2.145240985363
NORTHERN_IRELAND:
'2024-01-01': 1.252853758464
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: Share of other-local-bus fare-paying boardings paid at the point of use
in the 2024 National Travel Survey; used only when no person share is supplied.
values:
'0001-01-01': 0.7
metadata:
unit: /1
period: year
label: default single fare share
reference:
- title: DfT National Travel Survey 2024
href: https://www.gov.uk/government/statistics/national-travel-survey-2024
- title: Microcosm 954, NTS and published-receipts pricing evidence
href: https://github.com/PolicyEngine/microcosm/pull/954
13 changes: 13 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/fare_index.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: Proportional multiplier on bus fares; a neutral reform lever, not a measured
historical fare index.
values:
'0001-01-01': 1
metadata:
unit: /1
period: year
label: fare index
reference:
- title: DfT bus statistics data tables, BUS01 and BUS05i
href: https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables
- title: Microcosm 954, NTS and published-receipts pricing evidence
href: https://github.com/PolicyEngine/microcosm/pull/954
18 changes: 18 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/fares/cap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
description: National single-bus-fare cap on participating services in England outside London.
values:
0001-01-01: .inf
2023-01-01: 2
2025-01-01: 3
2027-01-01: 2
2028-01-01: .inf
metadata:
unit: currency-GBP
period: year
label: national single bus fare cap
reference:
- title: DfT evaluation of the two-pound bus fare cap, 2023 to 2024
href: https://www.gov.uk/government/publications/evaluation-of-the-2-bus-fare-cap
- title: DfT three-pound national bus fare cap, through December 2026
href: https://www.gov.uk/guidance/3-national-bus-fare-cap
- title: DfT two-pound bus fares from January to December 2027
href: https://www.gov.uk/government/speeches/2-bus-fares-from-january-2027
2 changes: 2 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/fares/index.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
metadata:
preserve_calendar_dates: true
13 changes: 13 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/prior_law_fare_index.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: Reference multiplier for proportional bus-fare reforms; keep positive
and equal to one for the published price benchmark.
values:
'0001-01-01': 1
metadata:
unit: /1
period: year
label: prior law fare index
reference:
- title: DfT bus statistics data tables, BUS01 and BUS05i
href: https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables
- title: Microcosm 954, NTS and published-receipts pricing evidence
href: https://github.com/PolicyEngine/microcosm/pull/954
18 changes: 18 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/reference_fares/cap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
description: Fixed national cap schedule for the bus-fare yield benchmark. Read in reference_year; leave unchanged when reforming fares.cap.
values:
0001-01-01: .inf
2023-01-01: 2
2025-01-01: 3
2027-01-01: 2
2028-01-01: .inf
metadata:
unit: currency-GBP
period: year
label: benchmark single bus fare cap
reference:
- title: DfT evaluation of the two-pound bus fare cap, 2023 to 2024
href: https://www.gov.uk/government/publications/evaluation-of-the-2-bus-fare-cap
- title: DfT three-pound national bus fare cap, through December 2026
href: https://www.gov.uk/guidance/3-national-bus-fare-cap
- title: DfT two-pound bus fares from January to December 2027
href: https://www.gov.uk/government/speeches/2-bus-fares-from-january-2027
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
metadata:
preserve_calendar_dates: true
13 changes: 13 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/reference_year.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: Fiscal year of the published bus-fare yield benchmark, used only to price
the reference single-fare cap.
values:
'0001-01-01': 2024
metadata:
unit: year
period: year
label: reference year
reference:
- title: DfT bus statistics data tables, BUS01 and BUS05i
href: https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables
- title: Microcosm 954, NTS and published-receipts pricing evidence
href: https://github.com/PolicyEngine/microcosm/pull/954
13 changes: 13 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/ridership_index.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: Multiplier on supplied local-bus journeys; held at one without an explicit
ridership scenario.
values:
'0001-01-01': 1
metadata:
unit: /1
period: year
label: ridership index
reference:
- title: DfT bus statistics data tables, BUS01 and BUS05i
href: https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables
- title: Microcosm 954, NTS and published-receipts pricing evidence
href: https://github.com/PolicyEngine/microcosm/pull/954
18 changes: 18 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/uncapped_single_fare.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
description: Representative uncapped single fare inferred from the 2024-25 fare-cap grant,
fare-paying boardings and a 70 percent single-ticket share. Assumes no demand response
and full grant pass-through. This is a modelling assumption, not an observed individual
fare. Caps at or above GBP 2.75, including the GBP 3 cap, have no effect relative to
uncapped travel with this default GBP 2.748 fare. Supply person-specific
local_bus_uncapped_single_fare inputs to represent fares above those caps.
See docs/engineering/bus-fares.md.
values:
'2024-01-01': 2.748019953976
metadata:
unit: currency-GBP
period: year
label: assumed uncapped single bus fare
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
26 changes: 26 additions & 0 deletions policyengine_uk/parameters/gov/dft/bus/yield_per_boarding.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
description: Passenger receipts divided by fare-paying boardings in 2024-25, including
single and season tickets. This is a benchmark yield, before subsequent cap changes and
explicit fare-index reforms; held nominally constant unless reformed.
metadata:
unit: currency-GBP
period: year
label: bus yield per boarding
reference:
- title: DfT bus statistics, BUS01 and BUS05i, 2024-25
href: https://www.gov.uk/government/statistical-data-sets/bus-statistics-data-tables
- title: DfT National Travel Survey, NTS0705a, 2024
href: https://www.gov.uk/government/statistical-data-sets/nts07-car-ownership-and-access
- title: Scottish Transport Statistics 2025, tables 2.2a and 2.8
href: https://www.transport.gov.scot/publication/scottish-transport-statistics-2025/chapter-2-bus-and-coach-travel/
- title: Northern Ireland Public Transport Statistics 2024-25, figures 3, 4 and 6
href: https://www.infrastructure-ni.gov.uk/publications/public-transport-statistics-northern-ireland-2024-25
- title: Microcosm 954, published-fact extraction and pricing derivation
href: https://github.com/PolicyEngine/microcosm/pull/954
LONDON:
'2024-01-01': 1.017729905895
ENGLAND_OUTSIDE_LONDON:
'2024-01-01': 1.554716967657
SCOTLAND:
'2024-01-01': 2.599723222144
NORTHERN_IRELAND:
'2024-01-01': 2.550929922065
Loading
Loading