-
Notifications
You must be signed in to change notification settings - Fork 178
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of https://github.com/PolicyEngine/policyengine-us
- Loading branch information
Showing
46 changed files
with
610 additions
and
263 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
policyengine_us/parameters/gov/contrib/biden/budget_2025/capital_gains/README.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# Tax capital gains income as ordinary income |
11 changes: 11 additions & 0 deletions
11
policyengine_us/parameters/gov/contrib/biden/budget_2025/capital_gains/active.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
description: The proposal of President Biden to tax capital income as ordinary is active if this is true. | ||
metadata: | ||
unit: bool | ||
period: year | ||
label: Capital income over threshold taxed as ordinary income | ||
reference: | ||
- title: General Explanations of the Administration's Fiscal Year 2025 Revenue Proposals | ||
href: https://home.treasury.gov/system/files/131/General-Explanations-FY2025.pdf#page=88 | ||
|
||
values: | ||
0000-01-01: false |
22 changes: 22 additions & 0 deletions
22
policyengine_us/parameters/gov/contrib/biden/budget_2025/capital_gains/income_threshold.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
description: President Biden proposed taxing as ordinary income the excess of capital income above these thresholds, by filing status. | ||
metadata: | ||
reference: | ||
- title: General Explanations of the Administration's Fiscal Year 2025 Revenue Proposals | ||
href: https://home.treasury.gov/system/files/131/General-Explanations-FY2025.pdf#page=88 | ||
label: Threshold above which capital income is taxed as ordinary income | ||
unit: currency-USD | ||
period: year | ||
uprating: gov.irs.uprating | ||
|
||
breakdown: | ||
- filing_status | ||
JOINT: | ||
2024-01-01: 1_000_000 | ||
SINGLE: | ||
2024-01-01: 1_000_000 | ||
SEPARATE: | ||
2024-01-01: 500_000 | ||
HEAD_OF_HOUSEHOLD: | ||
2024-01-01: 1_000_000 | ||
WIDOW: | ||
2024-01-01: 1_000_000 |
10 changes: 0 additions & 10 deletions
10
...cyengine_us/parameters/gov/states/md/tax/income/credits/eitc/childless/percent_match.yaml
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
...eters/gov/states/md/tax/income/credits/eitc/non_refundable/unmarried_childless/match.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
description: Maryland matches this percentage of the federal Earned Income Tax Credit to individuals without a qualifying child. | ||
values: | ||
2019-01-01: 1 | ||
metadata: | ||
unit: /1 | ||
period: year | ||
label: Maryland childless EITC match | ||
reference: | ||
- title: Md. Code, Tax-Gen. § 10-704(c)(3)(ii) | ||
href: https://casetext.com/statute/code-of-maryland/article-tax-general/title-10-income-tax/subtitle-7-income-tax-credits/section-10-704-effective-until-6302023-for-earned-income | ||
- title: 2021 Maryland Resident Booklet Individual | ||
href: https://www.marylandtaxes.gov/forms/21_forms/Resident_Booklet.pdf#page=19 | ||
# Individuals filing as single, head of household, or qualifying widow(er) without a qualifying child | ||
# may claim 100% of the federal earned income credit |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,7 @@ | ||
from .medicare_and_investment_tax_increase import ( | ||
create_medicare_and_investment_tax_increase_reform, | ||
) | ||
|
||
from .capital_gains_tax_increase import ( | ||
create_capital_gains_tax_increase_reform, | ||
) |
157 changes: 157 additions & 0 deletions
157
policyengine_us/reforms/biden/budget_2025/capital_gains_tax_increase.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
from policyengine_us.model_api import * | ||
|
||
|
||
def create_capital_gains_tax_increase() -> Reform: | ||
class capital_gains_tax(Variable): | ||
value_type = float | ||
entity = TaxUnit | ||
label = "Maximum income tax after capital gains tax" | ||
unit = USD | ||
definition_period = YEAR | ||
|
||
def formula(tax_unit, period, parameters): | ||
net_cg = tax_unit("net_capital_gain", period) | ||
taxable_income = tax_unit("taxable_income", period) | ||
adjusted_net_cg = min_( | ||
tax_unit("adjusted_net_capital_gain", period), | ||
taxable_income, | ||
) # ANCG is referred to in all cases as ANCG or taxable income if less. | ||
|
||
cg = parameters(period).gov.irs.capital_gains | ||
|
||
excluded_cg = tax_unit( | ||
"capital_gains_excluded_from_taxable_income", period | ||
) | ||
non_cg_taxable_income = max_(0, taxable_income - excluded_cg) | ||
income_less_ancg = max_(0, taxable_income - adjusted_net_cg) | ||
|
||
filing_status = tax_unit("filing_status", period) | ||
|
||
first_threshold = cg.brackets.thresholds["1"][filing_status] | ||
second_threshold = cg.brackets.thresholds["2"][filing_status] | ||
|
||
income_ordinarily_under_second_rate = clip( | ||
taxable_income, 0, first_threshold | ||
) | ||
|
||
income_ordinarily_under_third_rate = clip( | ||
taxable_income, 0, second_threshold | ||
) | ||
|
||
# The 2025 Biden Budget taxes the excess of long-term capital gains and qualified dividends | ||
# over $1 million as ordinary income. | ||
# We apply this only to ANCG, not Unrecaptured Section 1250 Gain or the 28% rate CG. | ||
|
||
p_reform = parameters( | ||
period | ||
).gov.contrib.biden.budget_2025.capital_gains | ||
income_threshold = p_reform.income_threshold[filing_status] | ||
excess_income = max_(0, taxable_income - income_threshold) | ||
|
||
cg_in_top_bracket = min_(adjusted_net_cg, excess_income) | ||
|
||
income_tax = parameters(period).gov.irs.income.bracket.rates["7"] | ||
|
||
new_cg_tax = cg_in_top_bracket * income_tax | ||
|
||
cg_in_first_bracket = max_( | ||
0, income_ordinarily_under_second_rate - income_less_ancg | ||
) | ||
|
||
cg_in_first_bracket_below_top_bracket = max_( | ||
cg_in_first_bracket - cg_in_top_bracket, 0 | ||
) | ||
|
||
cg_in_second_bracket = min_( | ||
max_( | ||
0, adjusted_net_cg - cg_in_first_bracket_below_top_bracket | ||
), | ||
max_( | ||
0, | ||
income_ordinarily_under_third_rate | ||
- ( | ||
non_cg_taxable_income | ||
+ cg_in_first_bracket_below_top_bracket | ||
), | ||
), | ||
) | ||
|
||
cg_in_second_bracket_below_top_bracket = max_( | ||
cg_in_second_bracket - cg_in_top_bracket, 0 | ||
) | ||
|
||
cg_in_third_bracket = max_( | ||
adjusted_net_cg | ||
- cg_in_first_bracket_below_top_bracket | ||
- cg_in_second_bracket_below_top_bracket, | ||
0, | ||
) | ||
|
||
cg_in_third_bracket_below_top_bracket = max_( | ||
cg_in_third_bracket - cg_in_top_bracket, 0 | ||
) | ||
|
||
main_cg_tax = ( | ||
cg_in_first_bracket_below_top_bracket * cg.brackets.rates["1"] | ||
+ cg_in_second_bracket_below_top_bracket | ||
* cg.brackets.rates["2"] | ||
+ cg_in_third_bracket_below_top_bracket | ||
* cg.brackets.rates["3"] | ||
+ new_cg_tax | ||
) | ||
|
||
unrecaptured_s_1250_gain = tax_unit( | ||
"unrecaptured_section_1250_gain", period | ||
) | ||
|
||
qualified_dividends = add( | ||
tax_unit, period, ["qualified_dividend_income"] | ||
) | ||
|
||
max_taxable_unrecaptured_gain = min_( | ||
unrecaptured_s_1250_gain, | ||
max_(0, net_cg - qualified_dividends), | ||
) | ||
unrecaptured_gain_deduction = max_( | ||
non_cg_taxable_income + net_cg - taxable_income, | ||
0, | ||
) | ||
taxable_unrecaptured_gain = max_( | ||
max_taxable_unrecaptured_gain - unrecaptured_gain_deduction, | ||
0, | ||
) | ||
|
||
unrecaptured_gain_tax = ( | ||
cg.unrecaptured_s_1250_rate * taxable_unrecaptured_gain | ||
) | ||
|
||
remaining_cg_tax = ( | ||
tax_unit("capital_gains_28_percent_rate_gain", period) | ||
* cg.other_cg_rate | ||
) | ||
return main_cg_tax + unrecaptured_gain_tax + remaining_cg_tax | ||
|
||
class reform(Reform): | ||
def apply(self): | ||
self.update_variable(capital_gains_tax) | ||
|
||
return reform | ||
|
||
|
||
def create_capital_gains_tax_increase_reform( | ||
parameters, period, bypass: bool = False | ||
): | ||
if bypass: | ||
return create_capital_gains_tax_increase() | ||
|
||
p = parameters(period).gov.contrib.biden.budget_2025.capital_gains | ||
|
||
if p.active: | ||
return create_capital_gains_tax_increase() | ||
else: | ||
return None | ||
|
||
|
||
capital_gains_tax_increase = create_capital_gains_tax_increase_reform( | ||
None, None, bypass=True | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.