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/ky-hb13-hb152-graduated-income-tax.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added Kentucky HB 13 and HB 152 graduated income tax reforms with cliff design.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
description: Kentucky HB 13 graduated income tax brackets for income at or below the cliff threshold.

metadata:
type: marginal_rate
threshold_unit: currency-USD
rate_unit: /1
period: year
label: Kentucky HB 13 graduated income tax brackets
reference:
- title: Kentucky HB 13 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb13/orig_bill.pdf#page=1

brackets:
- threshold:
2027-01-01: 0
rate:
2027-01-01: 0.035
- threshold:
2027-01-01: 250_000
rate:
2027-01-01: 0.06
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Kentucky House Bill 13 sets this as the income threshold above which the flat rate applies to the entire income.

values:
2027-01-01: 300_000

metadata:
unit: currency-USD
period: year
label: Kentucky HB 13 cliff threshold
reference:
- title: Kentucky HB 13 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb13/orig_bill.pdf#page=1
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Kentucky HB 13 flat rate applied to entire income when income exceeds the cliff threshold.

values:
2027-01-01: 0.06

metadata:
unit: /1
period: year
label: Kentucky HB 13 flat rate for high earners
reference:
- title: Kentucky HB 13 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb13/orig_bill.pdf#page=1
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
description: Whether Kentucky HB 13 graduated income tax reform is in effect.

values:
0000-01-01: false

metadata:
unit: bool
label: Kentucky HB 13 graduated income tax reform in effect
period: year
reference:
- title: Kentucky HB 13 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb13/orig_bill.pdf#page=1
- title: Kentucky Legislature - HB 13 (bill status)
href: https://apps.legislature.ky.gov/record/26RS/hb13.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
description: Kentucky HB 152 graduated income tax brackets for income at or below the cliff threshold.

metadata:
type: marginal_rate
threshold_unit: currency-USD
rate_unit: /1
period: year
label: Kentucky HB 152 graduated income tax brackets
reference:
- title: Kentucky HB 152 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb152/orig_bill.pdf#page=1

brackets:
- threshold:
2027-01-01: 0
rate:
2027-01-01: 0.04
- threshold:
2027-01-01: 100_000
rate:
2027-01-01: 0.05
- threshold:
2027-01-01: 125_000
rate:
2027-01-01: 0.06
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Kentucky House Bill 152 sets this as the income threshold at or above which the flat rate applies to the entire income.

values:
2027-01-01: 150_000

metadata:
unit: currency-USD
period: year
label: Kentucky HB 152 cliff threshold
reference:
- title: Kentucky HB 152 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb152/orig_bill.pdf#page=1
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Kentucky HB 152 flat rate applied to entire income when income exceeds the cliff threshold.

values:
2027-01-01: 0.06

metadata:
unit: /1
period: year
label: Kentucky HB 152 flat rate for high earners
reference:
- title: Kentucky HB 152 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb152/orig_bill.pdf#page=1
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
description: Whether Kentucky HB 152 graduated income tax reform is in effect.

values:
0000-01-01: false

metadata:
unit: bool
label: Kentucky HB 152 graduated income tax reform in effect
period: year
reference:
- title: Kentucky HB 152 (2026 Session), Section 1, KRS 141.020(2)
href: https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb152/orig_bill.pdf#page=1
- title: Kentucky Legislature - HB 152 (bill status)
href: https://apps.legislature.ky.gov/record/26RS/hb152.html
7 changes: 7 additions & 0 deletions policyengine_us/reforms/reforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@
from .cdcc import (
create_cdcc_single_parent_work_requirement_reform,
)
from .states.ky.graduated_income_tax import (
create_ky_graduated_income_tax_reform,
)
from .states.pa.ctc import (
create_pa_ctc_flat_amount_reform,
create_pa_ctc_match_reform,
Expand Down Expand Up @@ -355,6 +358,9 @@ def create_structural_reforms_from_parameters(parameters, period):
cdcc_single_parent_work_requirement = (
create_cdcc_single_parent_work_requirement_reform(parameters, period)
)
ky_graduated_income_tax = create_ky_graduated_income_tax_reform(
parameters, period
)
pa_ctc_flat_amount = create_pa_ctc_flat_amount_reform(parameters, period)
pa_ctc_match = create_pa_ctc_match_reform(parameters, period)
ct_sb100 = create_ct_sb100_reform(parameters, period)
Expand Down Expand Up @@ -431,6 +437,7 @@ def create_structural_reforms_from_parameters(parameters, period):
aca_ptc_simplified_bracket,
aca_ptc_700_fpl_cliff,
cdcc_single_parent_work_requirement,
ky_graduated_income_tax,
pa_ctc_flat_amount,
pa_ctc_match,
ct_hb5009,
Expand Down
4 changes: 4 additions & 0 deletions policyengine_us/reforms/states/ky/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from policyengine_us.reforms.states.ky.graduated_income_tax import (
create_ky_graduated_income_tax_reform,
ky_graduated_income_tax,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from policyengine_us.reforms.states.ky.graduated_income_tax.ky_graduated_income_tax_reform import (
create_ky_graduated_income_tax_reform,
ky_graduated_income_tax,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
from policyengine_us.model_api import *
from policyengine_core.periods import period as period_


def create_ky_graduated_income_tax() -> Reform:
"""
Creates reform for Kentucky HB 13 and HB 152 graduated income tax.

Both bills amend KRS 141.020(2) to implement graduated brackets
with a "cliff" design where above a threshold, the flat rate
applies to the ENTIRE income (not just marginal).

See parameter files under gov/contrib/states/ky/hb13/ and hb152/
for specific rates, thresholds, and effective dates.
"""

def calculate_graduated_tax_with_cliff(
taxable_income, p_hb13, p_hb152, p_baseline
):
"""
Calculate tax using graduated brackets with cliff design.

HB 13 takes precedence if both are active. Each bill applies
its flat rate to the entire income when the cliff threshold
is exceeded; otherwise graduated brackets apply.
"""
hb13_active = p_hb13.in_effect
hb152_active = p_hb152.in_effect

# HB 13 calculation
hb13_above_cliff = taxable_income > p_hb13.cliff_threshold
hb13_graduated_tax = p_hb13.brackets.calc(taxable_income)
hb13_flat_tax = taxable_income * p_hb13.flat_rate
hb13_tax = where(hb13_above_cliff, hb13_flat_tax, hb13_graduated_tax)

# HB 152 calculation
hb152_above_cliff = taxable_income >= p_hb152.cliff_threshold
hb152_graduated_tax = p_hb152.brackets.calc(taxable_income)
hb152_flat_tax = taxable_income * p_hb152.flat_rate
hb152_tax = where(
hb152_above_cliff, hb152_flat_tax, hb152_graduated_tax
)

# Baseline calculation
baseline_tax = taxable_income * p_baseline.rate

# Apply appropriate calculation based on which reform is active
# HB 13 takes precedence if both are somehow active
return where(
hb13_active,
hb13_tax,
where(hb152_active, hb152_tax, baseline_tax),
)

class ky_income_tax_before_non_refundable_credits_indiv(Variable):
value_type = float
entity = Person
label = "Kentucky income tax before non-refundable credits when married couples are filing separately"
unit = USD
definition_period = YEAR
defined_for = StateCode.KY
reference = (
"https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb13/orig_bill.pdf#page=1",
"https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb152/orig_bill.pdf#page=1",
)

def formula(person, period, parameters):
taxable_income = person("ky_taxable_income_indiv", period)
p_hb13 = parameters(period).gov.contrib.states.ky.hb13
p_hb152 = parameters(period).gov.contrib.states.ky.hb152
p_baseline = parameters(period).gov.states.ky.tax.income

return calculate_graduated_tax_with_cliff(
taxable_income, p_hb13, p_hb152, p_baseline
)

class ky_income_tax_before_non_refundable_credits_joint(Variable):
value_type = float
entity = Person
label = "Kentucky income tax before non-refundable credits when married filing jointly"
unit = USD
definition_period = YEAR
defined_for = StateCode.KY
reference = (
"https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb13/orig_bill.pdf#page=1",
"https://apps.legislature.ky.gov/recorddocuments/bill/26RS/hb152/orig_bill.pdf#page=1",
)

def formula(person, period, parameters):
taxable_income = person("ky_taxable_income_joint", period)
p_hb13 = parameters(period).gov.contrib.states.ky.hb13
p_hb152 = parameters(period).gov.contrib.states.ky.hb152
p_baseline = parameters(period).gov.states.ky.tax.income

return calculate_graduated_tax_with_cliff(
taxable_income, p_hb13, p_hb152, p_baseline
)

class reform(Reform):
def apply(self):
self.update_variable(
ky_income_tax_before_non_refundable_credits_indiv
)
self.update_variable(
ky_income_tax_before_non_refundable_credits_joint
)

return reform


def create_ky_graduated_income_tax_reform(
parameters, period, bypass: bool = False
):
if bypass:
return create_ky_graduated_income_tax()

p_hb13 = parameters.gov.contrib.states.ky.hb13
p_hb152 = parameters.gov.contrib.states.ky.hb152

reform_active = False
current_period = period_(period)

# Check if either reform will be active in the next 5 years
for i in range(5):
if (
p_hb13(current_period).in_effect
or p_hb152(current_period).in_effect
):
reform_active = True
break
current_period = current_period.offset(1, "year")

if reform_active:
return create_ky_graduated_income_tax()
else:
return None


ky_graduated_income_tax = create_ky_graduated_income_tax_reform(
None, None, bypass=True
)
Loading