Skip to content

Commit 980e7d9

Browse files
MaxGhenisclaude
andcommitted
Add CTC phase-out threshold reduction analysis (75k/150k) for 2026-2035
This analysis examines the impact of reducing CTC phase-out thresholds: - Joint filers: $150,000 (from higher threshold) - Single/Head of Household: $75,000 (from higher threshold) Key findings over 10 years (2026-2035): - Total net income reduction: $308.6 billion - Total income tax increase: $304.5 billion - Annual impact grows from $21.3B in 2026 to $40.5B in 2035 The reform affects higher-income families who would see their CTC benefits phase out at lower income levels than under current law. Files organized in us/irs/ctc/phase_out_75k_150k/ to clearly indicate the specific threshold levels being analyzed. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent c94de38 commit 980e7d9

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#!/usr/bin/env python
2+
"""
3+
CTC Reform Analysis for 2026-2035
4+
Calculates changes in net income and income tax for each year
5+
"""
6+
7+
from policyengine_us import Microsimulation
8+
from policyengine_core.reforms import Reform
9+
import pandas as pd
10+
import gc
11+
import os
12+
13+
# Define the CTC reform
14+
reform = Reform.from_dict(
15+
{
16+
"gov.irs.credits.ctc.phase_out.threshold.JOINT": {
17+
"2025-01-01.2100-12-31": 150000
18+
},
19+
"gov.irs.credits.ctc.phase_out.threshold.SINGLE": {
20+
"2025-01-01.2100-12-31": 75000
21+
},
22+
"gov.irs.credits.ctc.phase_out.threshold.SEPARATE": {
23+
"2025-01-01.2100-12-31": 75000
24+
},
25+
"gov.irs.credits.ctc.phase_out.threshold.SURVIVING_SPOUSE": {
26+
"2025-01-01.2100-12-31": 150000
27+
},
28+
"gov.irs.credits.ctc.phase_out.threshold.HEAD_OF_HOUSEHOLD": {
29+
"2025-01-01.2100-12-31": 75000
30+
},
31+
},
32+
country_id="us",
33+
)
34+
35+
print("Running CTC Reform Analysis for 2026-2035...")
36+
print("=" * 50)
37+
38+
# CSV filename
39+
csv_filename = "us/ctc_reform_2026_2035_results.csv"
40+
41+
# Remove existing file if it exists
42+
if os.path.exists(csv_filename):
43+
os.remove(csv_filename)
44+
print(f"Removed existing {csv_filename}")
45+
46+
# Store results
47+
results = []
48+
49+
# Analyze each year
50+
for year in range(2026, 2036):
51+
print(f"\nAnalyzing year {year}...")
52+
53+
# Create simulations fresh for each year to avoid memory issues
54+
baseline = Microsimulation()
55+
reformed = Microsimulation(reform=reform)
56+
57+
# Calculate net income
58+
baseline_income = baseline.calculate("household_net_income", period=year)
59+
reformed_income = reformed.calculate("household_net_income", period=year)
60+
income_change = (reformed_income - baseline_income).sum()
61+
62+
# Calculate income tax (aggregated to household level)
63+
baseline_tax = baseline.calculate("income_tax", period=year, map_to="household")
64+
reformed_tax = reformed.calculate("income_tax", period=year, map_to="household")
65+
tax_change = (reformed_tax - baseline_tax).sum()
66+
67+
result = {
68+
"year": year,
69+
"net_income_change": income_change,
70+
"income_tax_change": tax_change
71+
}
72+
results.append(result)
73+
74+
print(f" Net income change: ${income_change:,.0f}")
75+
print(f" Income tax change: ${tax_change:,.0f}")
76+
77+
# Write to CSV incrementally
78+
df_temp = pd.DataFrame(results)
79+
df_temp.to_csv(csv_filename, index=False)
80+
print(f" Saved progress to {csv_filename}")
81+
82+
# Clean up memory
83+
del baseline
84+
del reformed
85+
del baseline_income
86+
del reformed_income
87+
del baseline_tax
88+
del reformed_tax
89+
gc.collect()
90+
91+
# Create final DataFrame with total
92+
df = pd.DataFrame(results)
93+
94+
# Add total row
95+
total_row = pd.DataFrame([{
96+
"year": "Total",
97+
"net_income_change": df["net_income_change"].sum(),
98+
"income_tax_change": df["income_tax_change"].sum()
99+
}])
100+
101+
df = pd.concat([df, total_row], ignore_index=True)
102+
103+
# Save final CSV with total
104+
df.to_csv(csv_filename, index=False)
105+
106+
print("\n" + "=" * 50)
107+
print("SUMMARY RESULTS")
108+
print("=" * 50)
109+
print(df.to_string(index=False))
110+
111+
print(f"\nResults saved to: {csv_filename}")
112+
print("Done!")
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
year,net_income_change,income_tax_change
2+
2026,-21319920026.623302,21327176345.411194
3+
2027,-23334467358.78863,23342990910.804153
4+
2028,-25413250650.04707,25019280284.84611
5+
2029,-27982635607.501617,27542251556.544712
6+
2030,-29864186181.356224,29397985066.77014
7+
2031,-32238075553.132988,31731941956.156883
8+
2032,-33806888859.782974,33277892781.083076
9+
2033,-36206939820.67604,35636937981.324974
10+
2034,-37942321527.10655,37340956600.95574
11+
2035,-40479871308.47856,39837039465.4972
12+
Total,-308588556893.494,304454452949.3942

0 commit comments

Comments
 (0)