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
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Tax 28 percent rate and unrecaptured section 1250 gain at the regular rates on taxable income up to the top of the 24 percent bracket, the amount taxed below 25 percent under 26 U.S.C. 1(h)(1)(A), and enter Schedule D Tax Worksheet line 21 on Form 6251 Part III line 27.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: The IRS taxes capital gain at the regular rates on taxable income that the regular rate schedule taxes below this rate, up to taxable income less adjusted net capital gain.
values:
# Pub. L. 107-16, section 101(c)(2)(A), substituted "25 percent" for
# "28 percent".
2001-01-01: 0.25
metadata:
unit: /1
label: Capital gains regular rate limit
reference:
- title: 26 U.S.C. § 1(h)(1)(A)(ii)(I)
href: https://www.law.cornell.edu/uscode/text/26/1#h_1_A_ii_I
- title: 2025 Instructions for Schedule D (Form 1040), Schedule D Tax Worksheet, line 19
href: https://www.irs.gov/pub/irs-pdf/i1040sd.pdf#page=15
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from policyengine_core.periods import period as period_
from policyengine_core.periods import instant
from policyengine_us.variables.gov.irs.tax.federal_income.before_credits.tax_at_main_rates import (
amount_taxed_below_rate,
tax_at_main_rates,
)
from policyengine_us.variables.gov.irs.tax.federal_income.foreign_earned_income_exclusion.schedule_d_tax_worksheet_after_capital_gain_excess import (
Expand Down Expand Up @@ -109,10 +110,33 @@ def formula(tax_unit, period, parameters):
tax_on_excluded = tax_at_main_rates(excluded, filing_status, bracket)
return where(excluded > 0, max_(0, tax - tax_on_excluded), tax)

class taxable_income_taxed_below_25_percent(Variable):
value_type = float
entity = TaxUnit
label = "Taxable income taxed at a rate below 25 percent"
unit = USD
definition_period = YEAR
reference = "https://www.law.cornell.edu/uscode/text/26/1#h_1_A_ii_I"

def formula(tax_unit, period, parameters):
# 26 U.S.C. 1(h)(1)(A)(ii)(I) on the reform's rate schedule, as
# in the baseline formula on the baseline schedule.
taxable_income = tax_unit(
"taxable_income_plus_section_911_exclusion", period
)
filing_status = tax_unit("filing_status", period)
return amount_taxed_below_rate(
taxable_income,
filing_status,
parameters(period).gov.contrib.additional_tax_bracket.bracket,
parameters(period).gov.irs.capital_gains.regular_rate_limit,
)

class reform(Reform):
def apply(self):
self.update_variable(income_tax_main_rates)
self.update_variable(regular_tax_before_credits)
self.update_variable(taxable_income_taxed_below_25_percent)

return reform

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
from policyengine_us.variables.gov.irs.tax.federal_income.foreign_earned_income_exclusion.section_911_net_capital_gain_other_than_dividends import (
section_911_net_capital_gain_other_than_dividends,
)
from policyengine_us.variables.gov.irs.tax.federal_income.capital_gains.capital_gains_tax import (
rate_gain_taxed_at_28_percent,
)


def create_capital_gains_tax_increase() -> Reform:
Expand Down Expand Up @@ -130,8 +133,16 @@ def formula(tax_unit, period, parameters):
cg.unrecaptured_s_1250_rate * taxable_unrecaptured_gain
)

remaining_cg_tax = (
tax_unit("section_911_28_percent_rate_gain", period) * cg.other_cg_rate
# As in the baseline formula, 28 percent of the rest of taxable
# income (26 U.S.C. 1(h)(1)(F)): the 28 percent rate gain less
# any of it taxed at the regular rates.
remaining_cg_tax = cg.other_cg_rate * rate_gain_taxed_at_28_percent(
tax_unit,
period,
taxable_income,
non_cg_taxable_income,
adjusted_net_cg,
taxable_unrecaptured_gain,
)
return main_cg_tax + unrecaptured_gain_tax + remaining_cg_tax

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
from policyengine_us.variables.gov.irs.tax.federal_income.foreign_earned_income_exclusion.section_911_net_capital_gain_other_than_dividends import (
section_911_net_capital_gain_other_than_dividends,
)
from policyengine_us.variables.gov.irs.tax.federal_income.capital_gains.capital_gains_tax import (
rate_gain_taxed_at_28_percent,
)


def create_harris_capital_gains() -> Reform:
Expand Down Expand Up @@ -119,8 +122,16 @@ def formula(tax_unit, period, parameters):
cg.unrecaptured_s_1250_rate * taxable_unrecaptured_gain
)

remaining_cg_tax = (
tax_unit("section_911_28_percent_rate_gain", period) * cg.other_cg_rate
# As in the baseline formula, 28 percent of the rest of taxable
# income (26 U.S.C. 1(h)(1)(F)): the 28 percent rate gain less
# any of it taxed at the regular rates.
remaining_cg_tax = cg.other_cg_rate * rate_gain_taxed_at_28_percent(
tax_unit,
period,
taxable_income,
non_cg_taxable_income,
adjusted_net_cg,
taxable_unrecaptured_gain,
)

return main_cg_tax + unrecaptured_gain_tax + remaining_cg_tax
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
dwks10: 0
dwks13: 0
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
amt_tax_including_cg: 13_000
Expand All @@ -18,6 +19,7 @@
dwks10: 0
dwks13: 0
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
amt_tax_including_cg: 26_000
Expand All @@ -30,6 +32,7 @@
dwks10: 50_000
dwks13: 30_000
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
# AMTI - exemption = $100k; ordinary AMTI = $70k * 26% = $18,200.
Expand All @@ -45,6 +48,7 @@
dwks10: 200_000
dwks13: 150_000
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
# Ordinary AMTI tax: 26% * $220,700 + 28% * $229,300 = $121,586.
Expand All @@ -61,6 +65,7 @@
dwks10: 500_000
dwks13: 300_000
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 200_000
output:
# Ordinary AMTI tax: 26% * $220,700 + 28% * $279,300 = $135,586.
Expand All @@ -81,6 +86,7 @@
dwks10: 44_625
dwks13: 44_625
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
# L22 = L23 = $44,625; L24 = $0; nothing in 15% or 20%; L17 = $0.
Expand All @@ -97,6 +103,7 @@
dwks10: 492_300
dwks13: 492_300
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
# 0% bracket consumes $44,625; remaining $447,675 at 15% =
Expand All @@ -113,6 +120,7 @@
dwks10: 600_000
dwks13: 600_000
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
# 0%: $44,625; 15%: $447,675 (= $492,300 - $44,625) * 15% =
Expand All @@ -132,6 +140,7 @@
dwks10: 100_000
dwks13: 100_000
dwks14: 50_000
dwks19: 50_000
unrecaptured_section_1250_gain: 0
output:
# Ordinary AMTI tax: 26% * $200,000 = $52,000.
Expand All @@ -151,6 +160,7 @@
dwks10: 400_000
dwks13: 400_000
dwks14: 0
dwks19: 0
unrecaptured_section_1250_gain: 0
output:
# 0%: $89,250 (joint); 15%: $310,750 * 15% = $46,612.50;
Expand All @@ -173,6 +183,7 @@
dwks10: 925_000
dwks13: 925_000
dwks14: 136_000
dwks19: 136_000
unrecaptured_section_1250_gain: 0
output:
# Line 12: $1,061,000. Line 13: $925,000 ($25,000 of qualified
Expand All @@ -197,6 +208,7 @@
dwks10: 50_000
dwks13: 50_000
dwks14: 200_000
dwks19: 200_000
unrecaptured_section_1250_gain: 0
output:
# Line 12: $250,000. Lines 13, 15 and 16: $50,000. Line 17: $200,000.
Expand All @@ -215,6 +227,7 @@
dwks10: 50_000
dwks13: 50_000
dwks14: 119_550
dwks19: 119_550
unrecaptured_section_1250_gain: 0
output:
# Line 17: $119,550, which is "$119,550 or less", so line 18 is 26% *
Expand All @@ -231,6 +244,7 @@
dwks10: 50_000
dwks13: 50_000
dwks14: 119_551
dwks19: 119_551
unrecaptured_section_1250_gain: 0
output:
# Line 17: $119,551. Line 18: 28% * $119,551 - $2,391 = $31,083.28
Expand All @@ -246,6 +260,7 @@
dwks10: 100_000
dwks13: 100_000
dwks14: 300_000
dwks19: 300_000
unrecaptured_section_1250_gain: 0
output:
# Line 17: $300,000. Line 18: 28% * $300,000 - $2,391 = $81,609 (the
Expand All @@ -263,18 +278,25 @@
dwks10: 300_000
dwks13: 200_000
dwks14: 200_000
# Schedule D Tax Worksheet with taxable income (line 1) of $400,000:
# line 18 = $400,000 - $300,000 = $100,000; line 19 = $197,300 (the
# smaller of line 1 or $197,300); line 20 = the smaller of line 14 or
# line 19 = $197,300; line 21 = the larger of line 18 or line 20.
dwks19: 197_300
unrecaptured_section_1250_gain: 100_000
output:
# Line 12: $500,000. Line 13: $200,000. Line 14: $100,000.
# Line 15: min($200,000 + $100,000, $300,000) = $300,000. Line 16:
# $300,000. Line 17: $200,000. Line 18: 28% * $200,000 - $2,391 =
# $53,609. Line 21: $0. Line 22: $200,000. Line 23: $0. Line 24:
# $200,000. Line 29: $300,000 - $200,000 = $100,000. Line 30: $100,000.
# Line 31: $15,000. Line 32: $100,000. Line 33: $100,000. Line 34:
# $20,000. Line 35: $200,000 + $100,000 + $100,000 = $400,000.
# Line 36: $100,000. Line 37: 25% = $25,000.
# Line 38: $53,609 + $15,000 + $20,000 + $25,000 = $113,609.
amt_tax_including_cg: 113_609
# $53,609. Line 20: $200,000. Line 21: $0. Line 22: $200,000. Line 23:
# $0. Line 24: $200,000. Line 27: $197,300 (worksheet line 21, not
# line 14). Line 28: $197,300. Line 29: $300,000 - $197,300 =
# $102,700. Line 30: $102,700. Line 31: $15,405. Line 32: $102,700.
# Line 33: $97,300. Line 34: $19,460. Line 35: $200,000 + $102,700 +
# $97,300 = $400,000. Line 36: $100,000. Line 37: 25% = $25,000.
# Line 38: $53,609 + $15,405 + $19,460 + $25,000 = $113,474. (Line 14
# of the worksheet on line 27 would give $113,609.)
amt_tax_including_cg: 113_474

- name: Single filer with the amounts of the first separate case keeps the full breakpoint
period: 2025
Expand All @@ -284,6 +306,7 @@
dwks10: 925_000
dwks13: 925_000
dwks14: 136_000
dwks19: 136_000
unrecaptured_section_1250_gain: 0
output:
# Line 17: $136,000 <= $239,100, so line 18 is 26% * $136,000 =
Expand All @@ -301,6 +324,7 @@
dwks10: 0
dwks13: 0
dwks14: 136_000
dwks19: 136_000
unrecaptured_section_1250_gain: 0
output:
# Rev. Proc. 2025-32, section 3.10: for 2026 the 28 percent rate applies
Expand Down Expand Up @@ -334,6 +358,9 @@
# Line 22 = 211,900, line 23 = 0, line 29 = 533,400 - 100,000 = 433,400,
# line 30 = 211,900, line 31 = 31,785, line 33 = 0. Line 38 = 57,785.
dwks14: 100_000
# Line 27: worksheet line 21, also 100,000 with no 28 percent rate or
# unrecaptured section 1250 gain.
dwks19: 100_000
amt_tax_including_cg: 57_785

- name: The same gains without the exclusion
Expand Down
Loading
Loading