diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..e1746727b37 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,13 @@ +- bump: minor + changes: + added: + - Qualified BDC dividend income variable + - Qualified REIT and PTP income variable + - Farm operations income variable + - Variables showing whether income types would be qualified business income (estate, farm operations, farm rent, partnership/S corp, rental, self employment) + - Parameter for sources of QBI deductions (deduction_definition.yaml) + - QBID reconciliation parameters (in_effect, phase_out_rate, use_bdc_income) + - Marginal tax rate including health benefits variable + - Tax code references to income variables where they were missing + changed: + - marginal_tax_rate and marginal_tax_rate_including_health_benefits now use emp_self_emp_ratio with no logic change diff --git a/policyengine_us/parameters/gov/contrib/reconciliation/qbid/use_bdc_income.yaml b/policyengine_us/parameters/gov/contrib/reconciliation/qbid/use_bdc_income.yaml new file mode 100644 index 00000000000..32bd5107def --- /dev/null +++ b/policyengine_us/parameters/gov/contrib/reconciliation/qbid/use_bdc_income.yaml @@ -0,0 +1,12 @@ +description: The Qualified Business Income Deduction (QBID) under reconciliation includes business development company (BDC) dividend income if this is true. + +values: + 0000-01-01: false + +metadata: + unit: bool + period: year + label: Whether qualified business income (QBI) under reconciliation includes business development company (BDC) dividend income at the same rate as QBI (23% as initially proposed) + reference: + - title: Providing for reconciliation pursuant to H.Con.Res. 14, the Concurrent Resolution on the Budget for Fiscal Year 2025 + href: "https://docs.house.gov/meetings/WM/WM00/20250513/118260/BILLS-119CommitteePrintih.pdf#page=9" diff --git a/policyengine_us/parameters/gov/irs/deductions/qbi/deduction_definition.yaml b/policyengine_us/parameters/gov/irs/deductions/qbi/deduction_definition.yaml index 912396912fe..9751cc77cf5 100644 --- a/policyengine_us/parameters/gov/irs/deductions/qbi/deduction_definition.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/qbi/deduction_definition.yaml @@ -7,3 +7,6 @@ values: metadata: unit: list label: Qualified business income deductions + reference: + - title: 26 U.S. Code § 199A(c)(1) - Qualified business income + href: https://www.law.cornell.edu/uscode/text/26/199A#c_1 diff --git a/policyengine_us/parameters/gov/irs/deductions/qbi/max/business_property/rate.yaml b/policyengine_us/parameters/gov/irs/deductions/qbi/max/business_property/rate.yaml index ce47b6ff3c5..964df4bccae 100644 --- a/policyengine_us/parameters/gov/irs/deductions/qbi/max/business_property/rate.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/qbi/max/business_property/rate.yaml @@ -2,6 +2,9 @@ description: Alternative QBID cap rate on pass-through business property owned metadata: unit: /1 label: Alternative QBID rate on business property + reference: + - title: 26 U.S. Code § 199A(b)(2)(B)(ii) - Qualified business income + href: https://www.law.cornell.edu/uscode/text/26/199A#b_2_B_ii values: 2013-01-01: 0.0 2014-01-01: 0.0 diff --git a/policyengine_us/parameters/gov/irs/deductions/qbi/max/rate.yaml b/policyengine_us/parameters/gov/irs/deductions/qbi/max/rate.yaml index 88330f71def..d2601d9803a 100644 --- a/policyengine_us/parameters/gov/irs/deductions/qbi/max/rate.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/qbi/max/rate.yaml @@ -2,6 +2,9 @@ description: Pass-through qualified business income deduction rate. metadata: label: Qualified business income deduction rate unit: /1 + reference: + - title: 26 U.S. Code § 199A(a)(2) - Qualified business income + href: https://www.law.cornell.edu/uscode/text/26/199A#a_2 values: 2013-01-01: 0.0 2014-01-01: 0.0 diff --git a/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/alt_rate.yaml b/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/alt_rate.yaml index 3addf24cce3..56380e834e5 100644 --- a/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/alt_rate.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/alt_rate.yaml @@ -2,6 +2,9 @@ description: Alternative QBID cap rate on pass-through business W-2 wages paid. metadata: label: Alternative QBID rate on W-2 wages unit: /1 + reference: + - title: 26 U.S. Code § 199A(b)(2)(B)(ii) - Qualified business income + href: https://www.law.cornell.edu/uscode/text/26/199A#b_2_B_ii values: 2013-01-01: 0.0 2014-01-01: 0.0 diff --git a/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/rate.yaml b/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/rate.yaml index 434bb39d524..68fed5db620 100644 --- a/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/rate.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/qbi/max/w2_wages/rate.yaml @@ -2,6 +2,9 @@ description: QBID cap rate on pass-through business W-2 wages paid. metadata: label: QBID rate on W-2 wages unit: /1 + reference: + - title: 26 U.S. Code § 199A(b)(2)(B)(i) - Qualified business income + href: https://www.law.cornell.edu/uscode/text/26/199A#b_2_B_i values: 2013-01-01: 0.0 2014-01-01: 0.0 diff --git a/policyengine_us/parameters/gov/irs/deductions/qbi/phase_out/length.yaml b/policyengine_us/parameters/gov/irs/deductions/qbi/phase_out/length.yaml index 02672494e60..b8d60578c00 100644 --- a/policyengine_us/parameters/gov/irs/deductions/qbi/phase_out/length.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/qbi/phase_out/length.yaml @@ -1,6 +1,9 @@ description: Dollar gap between upper and lower threshold of pre-QBID taxable income metadata: unit: currency-USD + reference: + - title: 26 U.S. Code § 199A(b)(3)(B) - Qualified business income + href: https://www.law.cornell.edu/uscode/text/26/199A#b_3_B HEAD_OF_HOUSEHOLD: 2013-01-01: 1.0 2018-01-01: 50_000.0 diff --git a/policyengine_us/variables/household/emp_self_emp_ratio.py b/policyengine_us/variables/household/emp_self_emp_ratio.py new file mode 100644 index 00000000000..9edd6b2795b --- /dev/null +++ b/policyengine_us/variables/household/emp_self_emp_ratio.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class emp_self_emp_ratio(Variable): + value_type = float + entity = Person + label = "Share of earnings from wages and salaries" + unit = "/1" + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/1402" + + def formula(person, period, parameters): + employment_income = person("employment_income", period) + self_employment_income = person("self_employment_income", period) + earnings = employment_income + self_employment_income + res = np.ones_like(earnings) + mask = earnings > 0 + res[mask] = employment_income[mask] / earnings[mask] + return res diff --git a/policyengine_us/variables/household/income/person/dividends/qualified_bdc_income.py b/policyengine_us/variables/household/income/person/dividends/qualified_bdc_income.py new file mode 100644 index 00000000000..45aac1cac1d --- /dev/null +++ b/policyengine_us/variables/household/income/person/dividends/qualified_bdc_income.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class qualified_bdc_income(Variable): + value_type = float + entity = Person + label = "Business Development Company dividend income" + unit = USD + documentation = "Business Development Company Dividend Income. Part of the QBID calculation." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/1#h_11" + uprating = "calibration.gov.irs.soi.qualified_dividend_income" diff --git a/policyengine_us/variables/household/income/person/dividends/qualified_reit_and_ptp_income.py b/policyengine_us/variables/household/income/person/dividends/qualified_reit_and_ptp_income.py new file mode 100644 index 00000000000..f3f9aa8a6f9 --- /dev/null +++ b/policyengine_us/variables/household/income/person/dividends/qualified_reit_and_ptp_income.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class qualified_reit_and_ptp_income(Variable): + value_type = float + entity = Person + label = "REIT and PTP Income" + unit = USD + documentation = "REIT and Publically Traded Partnership Income. Part of the QBID calclulation." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/1#h_11" + uprating = "calibration.gov.irs.soi.qualified_dividend_income" diff --git a/policyengine_us/variables/household/income/person/estate/estate_income_would_be_qualified.py b/policyengine_us/variables/household/income/person/estate/estate_income_would_be_qualified.py new file mode 100644 index 00000000000..2b567091a8c --- /dev/null +++ b/policyengine_us/variables/household/income/person/estate/estate_income_would_be_qualified.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class estate_income_would_be_qualified(Variable): + value_type = bool + entity = Person + label = "Estate income would be qualified" + documentation = "Whether income from estates would be considered qualified business income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/199A#c_3_A" + default_value = True diff --git a/policyengine_us/variables/household/income/person/farm/farm_operations_income.py b/policyengine_us/variables/household/income/person/farm/farm_operations_income.py new file mode 100644 index 00000000000..d6afaa5e972 --- /dev/null +++ b/policyengine_us/variables/household/income/person/farm/farm_operations_income.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class farm_operations_income(Variable): + value_type = float + entity = Person + label = "farm operations income" + unit = USD + documentation = "Income from active farming operations. Schedule F. Do not include this income in self-employment income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/199A#c_3_A" + uprating = "calibration.gov.irs.soi.farm_income" diff --git a/policyengine_us/variables/household/income/person/farm/farm_operations_income_would_be_qualified.py b/policyengine_us/variables/household/income/person/farm/farm_operations_income_would_be_qualified.py new file mode 100644 index 00000000000..be21540dd6e --- /dev/null +++ b/policyengine_us/variables/household/income/person/farm/farm_operations_income_would_be_qualified.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class farm_operations_income_would_be_qualified(Variable): + value_type = bool + entity = Person + label = "Farm operations income would be qualified" + documentation = "Whether farm operations income would be considered qualified business income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/199A#c_3_A" + default_value = True diff --git a/policyengine_us/variables/household/income/person/farm/farm_rent_income.py b/policyengine_us/variables/household/income/person/farm/farm_rent_income.py index 499108dc74c..dd5d723a63d 100644 --- a/policyengine_us/variables/household/income/person/farm/farm_rent_income.py +++ b/policyengine_us/variables/household/income/person/farm/farm_rent_income.py @@ -7,4 +7,5 @@ class farm_rent_income(Variable): label = "farm rental income" unit = USD definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/1402" uprating = "calibration.gov.irs.soi.farm_rent_income" diff --git a/policyengine_us/variables/household/income/person/farm/farm_rent_income_would_be_qualified.py b/policyengine_us/variables/household/income/person/farm/farm_rent_income_would_be_qualified.py new file mode 100644 index 00000000000..7ad140ef7e1 --- /dev/null +++ b/policyengine_us/variables/household/income/person/farm/farm_rent_income_would_be_qualified.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class farm_rent_income_would_be_qualified(Variable): + value_type = bool + entity = Person + label = "Farm rent income would be qualified" + documentation = "Whether farm rental income would be considered qualified business income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/199A#c_3_A" + default_value = True diff --git a/policyengine_us/variables/household/income/person/misc/rental_income_would_be_qualified.py b/policyengine_us/variables/household/income/person/misc/rental_income_would_be_qualified.py new file mode 100644 index 00000000000..4e0a6d57a21 --- /dev/null +++ b/policyengine_us/variables/household/income/person/misc/rental_income_would_be_qualified.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class rental_income_would_be_qualified(Variable): + value_type = bool + entity = Person + label = "Rental income would be qualified" + documentation = ( + "Whether rental income would be considered qualified business income." + ) + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/199A#c_3_A" + default_value = True diff --git a/policyengine_us/variables/household/income/person/self_employment/partnership_s_corp_income_would_be_qualified.py b/policyengine_us/variables/household/income/person/self_employment/partnership_s_corp_income_would_be_qualified.py new file mode 100644 index 00000000000..717e446cf58 --- /dev/null +++ b/policyengine_us/variables/household/income/person/self_employment/partnership_s_corp_income_would_be_qualified.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class partnership_s_corp_income_would_be_qualified(Variable): + value_type = bool + entity = Person + label = "Partnership and S-corp income would be qualified" + documentation = "Whether income from partnerships and S corporations would be considered qualified business income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/199A#c_3_A" + default_value = True diff --git a/policyengine_us/variables/household/income/person/self_employment/self_employment_income_would_be_qualified.py b/policyengine_us/variables/household/income/person/self_employment/self_employment_income_would_be_qualified.py new file mode 100644 index 00000000000..b2bac36ef83 --- /dev/null +++ b/policyengine_us/variables/household/income/person/self_employment/self_employment_income_would_be_qualified.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class self_employment_income_would_be_qualified(Variable): + value_type = bool + entity = Person + label = "Self-employment income would be qualified" + documentation = "Whether self-employment income would be considered qualified business income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/199A#c_3_A" + default_value = True diff --git a/policyengine_us/variables/household/marginal_tax_rate.py b/policyengine_us/variables/household/marginal_tax_rate.py index 0c066d88fc4..9a9704b8240 100644 --- a/policyengine_us/variables/household/marginal_tax_rate.py +++ b/policyengine_us/variables/household/marginal_tax_rate.py @@ -18,14 +18,7 @@ def formula(person, period, parameters): adult_indexes = person("adult_earnings_index", period) employment_income = person("employment_income", period) self_employment_income = person("self_employment_income", period) - total_earnings = employment_income + self_employment_income - - emp_self_emp_ratio = np.divide( - employment_income, - total_earnings, - out=np.ones_like(total_earnings, dtype=np.float32), - where=total_earnings > 0, - ) + emp_self_emp_ratio = person("emp_self_emp_ratio", period) for adult_index in range(1, 1 + adult_count): alt_sim = sim.get_branch(f"mtr_for_adult_{adult_index}") diff --git a/policyengine_us/variables/household/marginal_tax_rate_including_health_benefits.py b/policyengine_us/variables/household/marginal_tax_rate_including_health_benefits.py index 0752a942722..dc2e7eece4f 100644 --- a/policyengine_us/variables/household/marginal_tax_rate_including_health_benefits.py +++ b/policyengine_us/variables/household/marginal_tax_rate_including_health_benefits.py @@ -20,14 +20,7 @@ def formula(person, period, parameters): adult_indexes = person("adult_earnings_index", period) employment_income = person("employment_income", period) self_employment_income = person("self_employment_income", period) - total_earnings = employment_income + self_employment_income - - emp_self_emp_ratio = np.divide( - employment_income, - total_earnings, - out=np.ones_like(total_earnings, dtype=np.float32), - where=total_earnings > 0, - ) + emp_self_emp_ratio = person("emp_self_emp_ratio", period) for adult_index in range(1, 1 + adult_count): alt_sim = sim.get_branch(f"mtr_for_adult_{adult_index}") diff --git a/policyengine_us/variables/input/employment_income.py b/policyengine_us/variables/input/employment_income.py new file mode 100644 index 00000000000..feab9b621d5 --- /dev/null +++ b/policyengine_us/variables/input/employment_income.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class employment_income(Variable): + value_type = float + entity = Person + label = "employment income" + documentation = "Wages and salaries, including tips and commissions." + unit = USD + definition_period = YEAR + adds = [ + "employment_income_before_lsr", + "employment_income_behavioral_response", + ] + reference = "https://www.law.cornell.edu/uscode/text/26/3401#a" + uprating = "calibration.gov.irs.soi.employment_income" diff --git a/policyengine_us/variables/input/employment_income_before_lsr.py b/policyengine_us/variables/input/employment_income_before_lsr.py new file mode 100644 index 00000000000..ec3c3e1151b --- /dev/null +++ b/policyengine_us/variables/input/employment_income_before_lsr.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class employment_income_before_lsr(Variable): + value_type = float + entity = Person + label = "employment income before labor supply responses" + unit = USD + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/3401#a" + uprating = "calibration.gov.irs.soi.employment_income" diff --git a/policyengine_us/variables/input/farm_income.py b/policyengine_us/variables/input/farm_income.py new file mode 100644 index 00000000000..f29558fc984 --- /dev/null +++ b/policyengine_us/variables/input/farm_income.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class farm_income(Variable): + value_type = float + entity = Person + label = "farm income" + unit = USD + documentation = "Income averaging for farmers and fishermen. Schedule J. Seperate from QBI and self-employment income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/1301" + uprating = "calibration.gov.irs.soi.farm_income" diff --git a/policyengine_us/variables/input/income.py b/policyengine_us/variables/input/income.py deleted file mode 100644 index 02a1995bdf3..00000000000 --- a/policyengine_us/variables/input/income.py +++ /dev/null @@ -1,77 +0,0 @@ -from policyengine_us.model_api import * - - -label = "Income" - - -class employment_income_before_lsr(Variable): - value_type = float - entity = Person - label = "employment income before labor supply responses" - unit = USD - definition_period = YEAR - uprating = "calibration.gov.irs.soi.employment_income" - - -class self_employment_income_before_lsr(Variable): - value_type = float - entity = Person - label = "self-employment income before labor supply responses" - unit = USD - definition_period = YEAR - uprating = "calibration.gov.irs.soi.self_employment_income" - - -class employment_income(Variable): - value_type = float - entity = Person - label = "employment income" - documentation = "Wages and salaries, including tips and commissions." - unit = USD - definition_period = YEAR - adds = [ - "employment_income_before_lsr", - "employment_income_behavioral_response", - ] - uprating = "calibration.gov.irs.soi.employment_income" - - -class self_employment_income(Variable): - value_type = float - entity = Person - label = "self-employment income" - unit = USD - documentation = "Self-employment non-farm income." - definition_period = YEAR - adds = [ - "self_employment_income_before_lsr", - "self_employment_income_behavioral_response", - ] - uprating = "calibration.gov.irs.soi.self_employment_income" - - -class emp_self_emp_ratio(Variable): - value_type = float - entity = Person - label = "employment-to-self-employment income ratio" - unit = "/1" - definition_period = YEAR - - def formula(person, period, parameters): - employment_income = person("employment_income", period) - self_employment_income = person("self_employment_income", period) - earnings = employment_income + self_employment_income - res = np.ones_like(earnings) - mask = earnings > 0 - res[mask] = employment_income[mask] / earnings[mask] - return res - - -class farm_income(Variable): - value_type = float - entity = Person - label = "farm income" - unit = USD - documentation = "Income from agricultural businesses. Do not include this income in self-employment income." - definition_period = YEAR - uprating = "calibration.gov.irs.soi.farm_income" diff --git a/policyengine_us/variables/input/self_employment_income.py b/policyengine_us/variables/input/self_employment_income.py new file mode 100644 index 00000000000..8f4db220852 --- /dev/null +++ b/policyengine_us/variables/input/self_employment_income.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class self_employment_income(Variable): + value_type = float + entity = Person + label = "self-employment income" + unit = USD + documentation = "Self-employment non-farm income." + definition_period = YEAR + adds = [ + "self_employment_income_before_lsr", + "self_employment_income_behavioral_response", + ] + reference = "https://www.law.cornell.edu/uscode/text/26/1402#a" + uprating = "calibration.gov.irs.soi.self_employment_income" diff --git a/policyengine_us/variables/input/self_employment_income_before_lsr.py b/policyengine_us/variables/input/self_employment_income_before_lsr.py new file mode 100644 index 00000000000..dc48f651ff6 --- /dev/null +++ b/policyengine_us/variables/input/self_employment_income_before_lsr.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class self_employment_income_before_lsr(Variable): + value_type = float + entity = Person + label = "self-employment income before labor supply responses" + unit = USD + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/1402#a" + uprating = "calibration.gov.irs.soi.self_employment_income"