Skip to content

Bus fares: follow published fares by area and year, and price cap changes from DfT cap savings instead of one uncapped fare #2542

Closed

Description

@juaristi22

Summary

After 2024-25, person_bus_fare_spending has two problems.

  1. The baseline does not follow published fares. yield_per_boarding keeps its FY2024-25 value in every later year. The only thing that moves it is a cap term, measured against a fixed 2024 cap schedule. At the default 0.70 single share that term lifts the England-outside-London yield per fare-paying boarding 24.9% from 2024-25 to 2025-26. DfT's local bus fares index for the same area (BUS0415a) rose 11.2% over comparable periods, and that movement already contains the cap step and every other fare rise. For England the index rose 5.7%, while the engine's England total rises about 19% (rounded; Microcosm's UK spine at design weights, 2024 to 2025).
  2. The cap term uses one uncapped fare for every single ticket. gov.dft.bus.uncapped_single_fare is £2.748. DfT's evaluation of the £2 cap reports £2.73 as the average pre-cap price of the single tickets that cost more than £2, but those tickets were less than half of pre-cap trips. In the same table all single tickets fell from £2.15 to £1.83, a saving of £0.32. The engine saves £0.75 per single ticket under a £2 cap, and a £3 cap saves nothing, because £2.748 is below £3.

Proposal: (A) price the baseline from the published index for each area and year, and apply the cap term only as the difference between a reform cap and the current-law cap in the same year; (B) replace the single fare with a small table of average cap savings fitted to public DfT data. Datasets can already supply local_bus_uncapped_single_fare per person, and that stays.

Existing issues. None covers this. A search for bus fare across all states returns #1871, #1869 and #1779 (all closed) and two unrelated matches (#2307, #2162). fare cap, uncapped single fare, BUS0415 and yield per boarding return only the same closed issues. #2140, which implemented the model, calls the £2.748 fare an explicit aggregate assumption and records that caps at or above £2.75 have no effect. Neither it nor the docs trace what that does to the 2025-26 baseline.

All figures below are published DfT figures, engine parameters, or arithmetic on them. The one dataset figure is the rounded 19% above.

Mechanism today

Line references are to main at 5f4b81c (2.141.3). The Python and YAML files named are identical in 2.134.4.

  1. variables/gov/dft/person_bus_fare_spending.py:59-63 starts other-local-bus boardings from yield_per_boarding.<AREA> (England outside London £1.5547, FY2024-25 passenger receipts over fare-paying boardings).
  2. :64-70 caps one uncapped fare under the current schedule (fares) and under the reference schedule (reference_fares) at the fixed reference_year 2024. The fare is local_bus_uncapped_single_fare, whose only formula returns uncapped_single_fare.yaml:8-9, £2.748, for every person.
  3. :71-76 adds single_share * (current_single - reference_single) to the yield for England. single_share defaults to 0.70.
  4. :77-82 multiplies by trips and boardings per trip. London-series trips use the London yield with no cap term.

The caps are £2 from 2023, £3 from 1 January 2025, £2 from 1 January 2027 and none from 2028 (fares/cap.yaml:4-7). So the reference year is 270 days at £2 and 95 days at £3, and the reference single fare is £2.195. In 2025-26 the cap is £3 all year, which does not bind at £2.748, so every single ticket costs £2.748. The rise of £0.553 per single ticket is £0.387 per fare-paying boarding, or 24.9% of £1.5547.

Yield per fare-paying boarding, England outside London, default parameters, scheduled caps:

Model year Yield vs 2024-25
2024-25 (benchmark) £1.555 0.0%
2025-26 £1.942 +24.9%
2026-27 £1.806 +16.1%
2027-28 £1.556 +0.1%
2028-29 onward £1.942 +24.9%

Year on year, 2026-27 is -7.0%, 2027-28 is -13.8% and 2028-29 is +24.8%.

Evidence

Fares index. BUS0415a, local bus fares index by metropolitan area status and country (March 2005 = 100), quarter-end values. The values are from the DfT table as vendored in Microcosm (Q1 2026 release). Re-read the current release before fitting.

Quarter end England outside London England London
Jun 2024 181.6 188.6 196.1
Sep 2024 185.7 191.0 196.1
Dec 2024 185.9 191.1 196.1
Mar 2025 206.4 201.8 196.1
Jun 2025 210.5 203.7 196.1
Sep 2025 213.6 205.3 196.1
Dec 2025 214.3 205.7 196.1
Mean, Jun 2024 to Mar 2025 189.9 193.125 196.1
Mean, Mar to Dec 2025 211.2 204.125 196.1
Change in means +11.2% +5.7% 0.0%
Dec 2024 to Mar 2025 +11.0% +5.6% 0.0%

The cap rise on 1 January 2025 shows as a one-quarter step outside London, while the neighbouring quarters moved by 0.1% to 2.3%. London is flat. DfT's January to March 2025 release reports the same pattern (England outside London +14.3% and London 0.0% on the year to March 2025) and attributes the larger change to the £3 cap. On the engine's April-to-March window (quarter ends Jun 2025 to Mar 2026) the changes in means are +12.7% outside London and +6.4% for England.

DfT's evaluation of the £2 cap. Frontier Economics and SYSTRA, Evaluation of the first 10 months of the £2 bus fare cap (report dated 1 May 2025), DfT landing page. It uses ticket and revenue data from the larger operators in England outside London that joined the scheme, which covers about 90% of bus trips. Table 6 (p. 66) compares January to October 2022 with January to October 2023:

Ticket group Average price before the cap After the cap
All ticket types £1.49 £1.40
All single tickets £2.15 £1.83
Single tickets above £2 before the cap £2.73 £2.00

DfT's report says the last group is less than half of pre-cap bus trips. Single tickets were 61% to 64% of tickets sold in 2022 and 85% by October 2023. DfT paid operators £210m for the first 10 months of 2023, against a plan of £245m. The report ranks the South East, South West, East of England and East Midlands as the regions with the largest cuts in single-ticket prices (Table 19, ranks only).

Cap grants. DfT BUS05i fare cap support, the same figure for England and for England outside London:

DfT year Grant Fare-paying boardings Grant per boarding
2022-23 (£2 cap from 1 Jan 2023) £60.2m 1,152m £0.052
2023-24 (£2 all year) £279.0m 1,281m £0.218
2024-25 (£2 to 31 Dec 2024, £3 after) £515.7m 1,331m £0.387

Fare-paying boardings are BUS01 journeys less BUS01c concessionary journeys. Grant per boarding rose 78% between 2023-24 and 2024-25. Over the same year the outside-London index rose 6.7%, receipts per fare-paying boarding rose 2.8%, and the cap was raised for the final quarter. The 2024-25 figure may therefore include more than forgone fare revenue per boarding (timing or coverage of payments; not checked). It is a check here, not an anchor.

Change A: the baseline follows published fares

Parameters:

  • Keep yield_per_boarding and boardings_per_trip as they are (names, areas, the 2024-01-01 date). Microcosm reads them in its parity check.
  • Add a published fares index per area, from BUS0415a quarter-end values: England outside London, London, Scotland, and Wales if wanted. Northern Ireland has no index. Do not reuse the name fare_index, which is the neutral reform lever.
  • A model year's index is the mean of its four quarter ends in the April-to-March window. For 2024-25 that is 189.9 outside London.
  • The yield for model year t is the benchmark yield times index(t) / index(2024-25).
  • After the last published quarter the engine needs a rule. One option is to grow with the engine's CPI index, as bus_fare_spending_reported does for the legacy route, and to add the scheduled cap changes (2027, 2028) with the savings table from Change B. The other is to hold flat and say so.

Formula (person_bus_fare_spending.py:59-76):

  • other_yield starts from the year's yield, not the benchmark.
  • reference_single uses the calculation year, not reference_year (:68-70). reference_fares becomes the current-law schedule, and reference_year.yaml goes.
  • The cap term is single_share * (saving at the reference cap - saving at the fares cap), day-weighted as now. In the baseline fares equals reference_fares, so the term is zero and the baseline equals the published path.
  • A test fails if reference_fares and fares differ in the baseline.

Effect: outside London in 2025-26 the baseline yield is £1.729 on the calendar-2025 window (£1.753 on the April-to-March window), against £1.942 now. Spending for a South East passenger with 100 trips a year (112.5 boardings) goes from £174.85 in 2024-25 to £194.47, against £218.42 now.

Change B: cap savings fitted to DfT data

The yield uses current_single - reference_single, so the level of the fare cancels. The model needs only the average saving from a cap per single ticket, m(c) = E[max(u - c, 0)], where u is the uncapped fare. The engine's point at £2.748 gives m(2) = 0.748 and m(3) = 0.

Replace uncapped_single_fare with a three-band table of uncapped single fares: a share at or below £2, a share above £2 and up to £3 with its mean fare, and a share above £3 with its mean fare. annual_capped_fare takes arrays and needs no change: call it once per band and weight. Caps below £2 need more bands. A scenario that sets the scalar can be read as a one-band table.

Public facts to fit, at the prices of each source:

  • DfT Table 6: all single tickets save £0.32, and those above £2 averaged £2.73 before the cap. £0.32 / (£2.73 - £2.00) puts the share of single tickets above £2 at about 0.44. The yields also contain fare rises and ticket-mix change, so this is rough.
  • BUS0415a step: the part of the +11.0% outside London that is due to the cap, taken as 9% to 11% of a £1.52 yield, gives m(2) - m(3) of £0.20 to £0.24 per single ticket at 2024-25 prices.
  • 2023-24 grant: £279m over 1,281m fare-paying boardings at a 0.70 single share gives m(2) of about £0.31 for a full year at £2.

One mix that matches all three (at 2022-23 prices; an illustration, not a recommended fit): 55% of single tickets at or below £2, 35% between £2 and £3 at an average of £2.37, and 10% above £3 at an average of £4.00.

Check Public fact Mix gives
Share of singles above £2 about 0.44 0.45
Their average price £2.73 £2.73
Average saving per single ticket £0.32 £0.33
m(2) - m(3) £0.20 to £0.24 £0.23
Full-year £2 cap, per single ticket about £0.31 £0.33

That mix has m(3) = 0.10. At 0.70 single share and 1,331m fare-paying boardings, a full year at £2 against no cap is about £0.3bn and a £3 cap against no cap is about £0.1bn a year, against £0.70bn and zero in the engine today.

Dataset-supplied fares:

  • local_bus_uncapped_single_fare stays as the person-level override and prices a point fare for that person (bus_journeys.yaml cases 1 and 6).
  • To tell a supplied fare from the default, add it to SUPPLIED_INPUT_VARIABLES (utils/supplied_inputs.py:40-53), as the trip variables are. supplied_input and supplied_input_periods count a value cached over a supplied input as supplied #2307 (open) concerns the same helper.
  • Microcosm's nts_bus_travel stage supplies local_bus_single_fare_share per person but not the fare, so its datasets take the default for everyone.

Tests

  1. Baseline follows the index. One outside-London passenger with 100 trips, no pass, share 0.70, default parameters: spending is £174.85 in 2024-25 and £194.47 in 2025-26 on the calendar-2025 window. Today it is £218.42.
  2. No cap term in the baseline. With fares equal to reference_fares, spending equals trips × boardings × the year's yield. A baseline with reference_fares different from fares fails.
  3. Reform differences. In 2025-26, fares.cap set to infinity raises the yield by s * m(3). A £2 cap lowers it by s * (m(3) - m(2)).
  4. A £3 cap binds. In 2025-26, yield with no cap > yield at £3 > yield at £2. Today the first two are equal.
  5. Table 6. At 2022-23 prices the fitted table gives an average saving per single ticket of £0.32 within £0.03, and an average pre-cap price of £2.73 for tickets above £2.
  6. January step. s * (m(2) - m(3)) lies between 9% and 11% of the yield at the end-2024 index level (£1.52).
  7. 2023-24 grant. s * F * m(2) is within 15% of £279m.
  8. England total. A fixture with one London-series passenger and one outside-London passenger, trips set so 2024-25 spending is in the published receipts ratio (London £1,347m, England outside London £2,070m): the England total rises by no more than the England index (+5.7%, or +6.4%).
  9. Regression. bus_journeys.yaml cases 1 to 8 pass, adapted where the reference year changes.
  10. Docs. Update docs/engineering/bus-fares.md:70-121 and uncapped_single_fare.yaml:1-7. Remove the statement that caps at or above £2.75 have no effect.

Effect on costing bus fare measures

  • After A, the outside-London baseline for 2025-26 is about 11% lower than today (1.729 / 1.942). Fare spending levels, shares of income and year-on-year baseline changes stop carrying the cap artefact.
  • After B, a cap of £2.75 or more is no longer inert, and a full year at £2 is no longer priced at £0.70bn.
  • Proportional measures (fare_index) scale the corrected yield.
  • Until then, for Budget costings: cost cap changes from the published grants (days at each cap), quote a range, and do not read the engine's 2025-26 baseline as a fare forecast.

Open points

  • The rule after the last published quarter, and the window: April-to-March quarter ends in the engine, calendar-year quarter ends in Microcosm's targets (+12.7% against +11.2% outside London).
  • Participation in the national cap is folded into the fare (docs/engineering/bus-fares.md:80-81). With a table it can be a separate share of single boardings not subject to the cap.
  • Uncapped fares are nominally fixed after 2024. Caps bind harder as fares rise, so a 2027 £2 cap is worth more than a 2025 one.
  • The single share moved with the cap. Singles were 61% to 64% of tickets in 2022 and 85% by October 2023, so the 0.70 default may not hold at £3 or with no cap.
  • Regions differ (above), and BUS0415a splits metropolitan and non-metropolitan areas, but the engine has no metropolitan flag and DfT gives ranks, not values.
  • (B) assumes the index moves with receipts per fare-paying boarding. The data-table page does not describe the index's ticket coverage or weights; check before using it as a target.
  • There is no demand response, so every cap value above is static.

Related

#1871 (the per-journey cap design), #1869 (fare index parameters), #2140 (implemented the model), #2307 (supplied-input helper). Companion issue: PolicyEngine/microcosm#1331. PolicyEngine/microcosm#954 (journeys priced at the published yield), #930 (journeys from the NTS) and #1324 (the national calibration measures the England fare-receipt rows at the engine's 2025).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions