Skip to content

Commit bf2cbcb

Browse files
authored
Default property_purchased to False to stop phantom stamp duty (#1752)
property_purchased had default_value=True, introduced incidentally in the 2025 one-variable-per-file refactor (#1139). Because main_residential_property_purchased is computed as main_residence_value * property_purchased, a True default charges every household in a population dataset full SDLT/LBTT/LTT on its entire home value (~£370bn of phantom stamp duty, 26x real receipts). This inflated the first income decile's effective tax rate to 251% and broke the policyengine-uk-data build (test_first_decile_tax_rate_ reasonable) for ~2 weeks, blocking all new UK data releases. Flip the default to False (fail-safe: a household has not bought all its property this year). The household calculator and YAML tests set main_residential_property_purchased directly, so they are unaffected (all 16 SDLT/LTT tests still pass). Population datasets explicitly set property_purchased for the ~3.85% of genuine purchasers. Adds a regression test: a household with main_residence_value but no purchase now pays £0 stamp duty.
1 parent 0dd45b7 commit bf2cbcb

3 files changed

Lines changed: 18 additions & 1 deletion

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix property_purchased default from True to False so households are not charged stamp duty on their entire property wealth unless they explicitly purchased this year. The True default charged every household in population datasets full SDLT/LBTT/LTT on its home value, inflating the first income decile's effective tax rate to 251% and breaking the data pipeline.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- name: Household with a home but no purchase pays no stamp duty (property_purchased defaults False)
2+
period: 2026
3+
input:
4+
main_residence_value: 400_000
5+
output:
6+
property_purchased: false
7+
main_residential_property_purchased: 0
8+
stamp_duty_land_tax: 0

policyengine_uk/variables/input/consumption/property/property_purchased.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,12 @@ class property_purchased(Variable):
77
entity = Household
88
definition_period = YEAR
99
value_type = bool
10-
default_value = True
10+
# Fail-safe default: a household has NOT bought all its property this year.
11+
# main_residential_property_purchased is computed as
12+
# main_residence_value * property_purchased, so a True default charges
13+
# every household stamp duty on its full property wealth (~£370bn of
14+
# phantom SDLT). Population datasets set this explicitly for the small
15+
# share of genuine purchasers; the household calculator and tests set
16+
# main_residential_property_purchased directly. False is the correct
17+
# neutral default for any household where it is not set.
18+
default_value = False

0 commit comments

Comments
 (0)