diff --git a/changelog.d/added/8351.md b/changelog.d/added/8351.md new file mode 100644 index 00000000000..a033ffcd941 --- /dev/null +++ b/changelog.d/added/8351.md @@ -0,0 +1 @@ +Add primary residence value and derive assessed property value from state assessment rates. diff --git a/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml b/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml new file mode 100644 index 00000000000..7181e39929e --- /dev/null +++ b/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml @@ -0,0 +1,131 @@ +description: Assessed property value equals primary residence market value multiplied by this state-level ratio. +metadata: + unit: /1 + period: year + label: Assessed-to-market property value ratio + breakdown: + - state_code + reference: + - title: Michigan Compiled Laws Section 211.27a(1) + href: https://legislature.mi.gov/Laws/MCL?objectName=mcl-211-27a + - title: West Virginia State Tax Department, Ad Valorem Property Tax + href: https://tax.wv.gov/Business/PropertyTax/Pages/AdValoremPropertyTax.aspx +# Default to 1 until state-specific assessed-to-market value ratios are modeled. +AL: + 0000-01-01: 1 +AK: + 0000-01-01: 1 +AZ: + 0000-01-01: 1 +AR: + 0000-01-01: 1 +CA: + 0000-01-01: 1 +CO: + 0000-01-01: 1 +CT: + 0000-01-01: 1 +DE: + 0000-01-01: 1 +FL: + 0000-01-01: 1 +GA: + 0000-01-01: 1 +HI: + 0000-01-01: 1 +ID: + 0000-01-01: 1 +IL: + 0000-01-01: 1 +IN: + 0000-01-01: 1 +IA: + 0000-01-01: 1 +KS: + 0000-01-01: 1 +KY: + 0000-01-01: 1 +LA: + 0000-01-01: 1 +ME: + 0000-01-01: 1 +MD: + 0000-01-01: 1 +MA: + 0000-01-01: 1 +MI: + 0000-01-01: 0.5 +MN: + 0000-01-01: 1 +MS: + 0000-01-01: 1 +MO: + 0000-01-01: 1 +MT: + 0000-01-01: 1 +NE: + 0000-01-01: 1 +NV: + 0000-01-01: 1 +NH: + 0000-01-01: 1 +NJ: + 0000-01-01: 1 +NM: + 0000-01-01: 1 +NY: + 0000-01-01: 1 +NC: + 0000-01-01: 1 +ND: + 0000-01-01: 1 +OH: + 0000-01-01: 1 +OK: + 0000-01-01: 1 +OR: + 0000-01-01: 1 +PA: + 0000-01-01: 1 +RI: + 0000-01-01: 1 +SC: + 0000-01-01: 1 +SD: + 0000-01-01: 1 +TN: + 0000-01-01: 1 +TX: + 0000-01-01: 1 +UT: + 0000-01-01: 1 +VT: + 0000-01-01: 1 +VA: + 0000-01-01: 1 +WA: + 0000-01-01: 1 +WV: + 0000-01-01: 0.6 +WI: + 0000-01-01: 1 +WY: + 0000-01-01: 1 +DC: + 0000-01-01: 1 +GU: + 0000-01-01: 1 +MP: + 0000-01-01: 1 +PW: + 0000-01-01: 1 +PR: + 0000-01-01: 1 +VI: + 0000-01-01: 1 +AA: + 0000-01-01: 1 +AE: + 0000-01-01: 1 +AP: + 0000-01-01: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml b/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml new file mode 100644 index 00000000000..6cc4dc39a75 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml @@ -0,0 +1,24 @@ +- name: Case 1, assessed property value defaults to primary residence value. + period: 2025 + input: + primary_residence_value: 400_000 + state_code: WA + output: + assessed_property_value: 400_000 + +- name: Case 2, assessed property value applies the state assessment rate. + period: 2025 + input: + primary_residence_value: 400_000 + state_code: MI + output: + assessed_property_value: 200_000 + +- name: Case 3, existing direct assessed property value input is still accepted. + period: 2025 + input: + assessed_property_value: 300_000 + primary_residence_value: 400_000 + state_code: MI + output: + assessed_property_value: 300_000 diff --git a/policyengine_us/variables/gov/local/tax/assessed_property_value.py b/policyengine_us/variables/gov/local/tax/assessed_property_value.py index 46842490ae3..a26666782da 100644 --- a/policyengine_us/variables/gov/local/tax/assessed_property_value.py +++ b/policyengine_us/variables/gov/local/tax/assessed_property_value.py @@ -7,5 +7,9 @@ class assessed_property_value(Variable): label = "Assessed property value" unit = USD quantity_type = STOCK - documentation = "Total assessed value of property owned by this person." definition_period = YEAR + + def formula(person, period, parameters): + state_code = person.household("state_code_str", period) + assessment_rate = parameters(period).gov.local.tax.assessment_rate[state_code] + return person("primary_residence_value", period) * assessment_rate diff --git a/policyengine_us/variables/household/assets/primary_residence_value.py b/policyengine_us/variables/household/assets/primary_residence_value.py new file mode 100644 index 00000000000..ee73fb8d65e --- /dev/null +++ b/policyengine_us/variables/household/assets/primary_residence_value.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class primary_residence_value(Variable): + value_type = float + entity = Person + label = "Primary residence value" + documentation = ( + "Market value of the person's primary residence, not assessed value." + ) + unit = USD + quantity_type = STOCK + definition_period = YEAR + uprating = "gov.bls.cpi.cpi_u" + reference = ( + "https://www.census.gov/programs-surveys/acs/microdata/documentation.html" + )