Skip to content
Open
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/8309.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added the Kentucky Homestead Exemption property tax reduction.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
description: Kentucky limits age-based eligibility to filers at or above this age under the Homestead Exemption program.
values:
2025-01-01: 65
metadata:
unit: year
period: year
label: Kentucky homestead exemption age threshold
reference:
- title: Kentucky Department of Revenue | Homestead Exemption
href: https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
description: Kentucky provides this amount as a homestead exemption under the Homestead Exemption program.
values:
1972-01-01: 6_500
1975-01-01: 7_700
1977-01-01: 8_900
1979-01-01: 10_200
1981-01-01: 12_900
1983-01-01: 15_000
1985-01-01: 16_100
1987-01-01: 17_100
1989-01-01: 18_400
1991-01-01: 20_300
1993-01-01: 21_800
1995-01-01: 23_100
1997-01-01: 24_400
1999-01-01: 25_400
2001-01-01: 26_800
2003-01-01: 28_000
2005-01-01: 29_400
2007-01-01: 31_400
2009-01-01: 33_700
2011-01-01: 34_000
2013-01-01: 36_000
2015-01-01: 36_900
2017-01-01: 37_600
2019-01-01: 39_300
2021-01-01: 40_500
2023-01-01: 46_350
2025-01-01: 49_100
metadata:
unit: currency-USD
period: year
label: Kentucky homestead exemption amount
reference:
- title: Kentucky Department of Revenue | Homestead Exemption
href: https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx
- title: Kentucky Department of Revenue | Homestead Exemption Historical Data
href: https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/Pages/HomesteadExemptionHistoricalData.aspx
- title: Kentucky Department of Revenue | DOR Sets 2025-2026 Homestead Exemption
href: https://revenue.ky.gov/News/Pages/DOR-Sets-2025-2026-Homestead-Exemption.aspx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
- name: Case 1, exemption is capped at the statutory amount.
period: 2025
input:
people:
person1:
age: 65
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_exemption: 49_100

- name: Case 2, exemption is limited to assessed property value.
period: 2025
input:
people:
person1:
age: 65
assessed_property_value: 40_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_exemption: 40_000

- name: Case 3, historical exemption amount applies in 2024.
absolute_error_margin: 0.01
period: 2024
input:
people:
person1:
age: 65
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_exemption: 46_350

- name: Case 4, exemption only uses qualifying owner property.
absolute_error_margin: 0.01
period: 2025
input:
people:
person1:
age: 65
is_tax_unit_head: true
is_tax_unit_spouse: false
assessed_property_value: 40_000
person2:
age: 30
is_tax_unit_head: false
is_tax_unit_spouse: false
is_tax_unit_dependent: true
assessed_property_value: 100_000
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: KY
output:
ky_homestead_exemption: 40_000
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
- name: Case 1, senior homeowner is eligible.
period: 2025
input:
people:
person1:
age: 65
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_exemption_eligible: true

- name: Case 2, disabled homeowner under age 65 is eligible.
period: 2025
input:
people:
person1:
age: 40
is_disabled: true
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_exemption_eligible: true

- name: Case 3, non-senior homeowner without disability is ineligible.
period: 2025
input:
people:
person1:
age: 64
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_exemption_eligible: false

- name: Case 4, senior without assessed property is ineligible.
period: 2025
input:
people:
person1:
age: 65
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_exemption_eligible: false

- name: Case 5, senior head is ineligible when only a dependent owns property.
period: 2025
input:
people:
person1:
age: 65
is_tax_unit_head: true
is_tax_unit_spouse: false
assessed_property_value: 0
person2:
age: 30
is_tax_unit_head: false
is_tax_unit_spouse: false
is_tax_unit_dependent: true
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: KY
output:
ky_homestead_exemption_eligible: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
- name: Case 1, reduction equals the property tax on the exempt share of value.
period: 2025
input:
people:
person1:
age: 65
assessed_property_value: 200_000
real_estate_taxes: 2_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_property_tax_reduction: 491

- name: Case 2, reduction cannot exceed property taxes.
period: 2025
input:
people:
person1:
age: 65
assessed_property_value: 40_000
real_estate_taxes: 800
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_property_tax_reduction: 800

- name: Case 3, ineligible filer gets no reduction.
period: 2025
input:
people:
person1:
age: 64
assessed_property_value: 200_000
real_estate_taxes: 2_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: KY
output:
ky_homestead_property_tax_reduction: 0

- name: Case 4, reduction only uses qualifying owner property taxes.
absolute_error_margin: 0.01
period: 2025
input:
people:
person1:
age: 65
is_tax_unit_head: true
is_tax_unit_spouse: false
assessed_property_value: 100_000
real_estate_taxes: 2_000
person2:
age: 30
is_tax_unit_head: false
is_tax_unit_spouse: false
is_tax_unit_dependent: true
assessed_property_value: 200_000
real_estate_taxes: 2_000
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: KY
output:
ky_homestead_property_tax_reduction: 982
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from policyengine_us.model_api import *


class ky_homestead_exemption(Variable):
value_type = float
entity = TaxUnit
label = "Kentucky homestead exemption"
unit = USD
definition_period = YEAR
reference = "https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx"
defined_for = "ky_homestead_exemption_eligible"

def formula(tax_unit, period, parameters):
person = tax_unit.members
p = parameters(period).gov.states.ky.tax.property.homestead_exemption
head_or_spouse = person("is_tax_unit_head_or_spouse", period)
age = person("age", period.this_year)
is_disabled = person("is_disabled", period)
assessed_property_value = person("assessed_property_value", period)
qualifying_owner = (
((age >= p.age_threshold) | is_disabled)
& head_or_spouse
& (assessed_property_value > 0)
)

return min_(
tax_unit.sum(where(qualifying_owner, assessed_property_value, 0)),
p.amount,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from policyengine_us.model_api import *


class ky_homestead_exemption_eligible(Variable):
value_type = bool
entity = TaxUnit
label = "Eligible for the Kentucky Homestead Exemption"
definition_period = YEAR
reference = "https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx"
defined_for = StateCode.KY

def formula(tax_unit, period, parameters):
p = parameters(period).gov.states.ky.tax.property.homestead_exemption
person = tax_unit.members
head_or_spouse = person("is_tax_unit_head_or_spouse", period)
age = person("age", period.this_year)
# Kentucky requires total disability and disability payments; this is the
# closest available person-level proxy.
is_disabled = person("is_disabled", period)
assessed_property_value = person("assessed_property_value", period)

return tax_unit.any(
((age >= p.age_threshold) | is_disabled)
& head_or_spouse
& (assessed_property_value > 0)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from policyengine_us.model_api import *


class ky_homestead_property_tax_reduction(Variable):
value_type = float
entity = TaxUnit
label = "Kentucky homestead property tax reduction"
unit = USD
definition_period = YEAR
reference = "https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx"
defined_for = "ky_homestead_exemption_eligible"

def formula(tax_unit, period, parameters):
person = tax_unit.members
p = parameters(period).gov.states.ky.tax.property.homestead_exemption
head_or_spouse = person("is_tax_unit_head_or_spouse", period)
age = person("age", period.this_year)
is_disabled = person("is_disabled", period)
assessed_property_value = person("assessed_property_value", period)
qualifying_owner = (
((age >= p.age_threshold) | is_disabled)
& head_or_spouse
& (assessed_property_value > 0)
)
qualifying_property_value = tax_unit.sum(
where(qualifying_owner, assessed_property_value, 0)
)
qualifying_property_taxes = tax_unit.sum(
where(qualifying_owner, person("real_estate_taxes", period), 0)
)

return qualifying_property_taxes * (
tax_unit("ky_homestead_exemption", period)
/ max_(qualifying_property_value, 1)
)
Loading