PSLmodels/Tax-Calculator

ACTC Revenue Estimation Question

Closed this issue · 3 comments

Hi TaxCalculator folks—I’m getting implausible results modeling the costs of changing the ACTC_c parameter (the “refundability cap” of the CTC), and I’d appreciate reactions on whether it’s me or the model making a mistake. I could be misunderstanding current policy or how to program reforms correctly.

When I tinker with the ACTC_c parameter, the model behaves as I’d expect after 2025, but in years through 2025 I’m seeing two peculiarities. First, the model appears not to recognize there’s a limited valid range for the ACTC_c through 2025, and second, the model tells me the revenue impact of reforms to the ACTC_c is exactly zero dollars.

Here’s some of the code I’m working with. I’d like to increase the refundability cap (ACTC_c) to the maximum child tax credit amount (CTC_c), which is $2,000 this year:

ACTC_1 = {"ACTC_c": {"2023": 2000}}

When I try to estimate the cost of that reform, as expected I get an error because beginning in 2026, the CTC_c is only $1,000, and the ACTC_c cannot exceed the CTC_c. So instead I run this:

ACTC_2 = {"ACTC_c": {"2023": 2000}, "ACTC_c": {"2026": 1000}}

For this ACTC_2 reform, the model gives me a 2023 revenue impact of $0 (using standard calculator code I’ve copied at the bottom). TPC has a recent estimate (Option 2 here) of $2-3 billion per year. 

Next is an example that looks to show the model is taking invalid ACTC_c levels for years through 2025. I expected this to throw an error (like in ACTC_1), but it doesn’t:

ACTC_3 = {"ACTC_c": {"2023": 10000}, "ACTC_c": {"2026": 1000}}

Again for ACTC_3 I’m getting a $0 revenue change between the baseline and reform in 2023. And the model runs this reform (with a $10,000 ACTC_c through 2025) even though the ACTC_c isn’t allowed to exceed the CTC_c.

Changes to ACTC_c after 2025 give me more sensible results. Here I’ve set the refundability cap to $0 starting in 2026 (which should raise revenue) and kept the large 2023 value:

ACTC_4 = {"ACTC_c": {"2023": 10000}, "ACTC_c": {"2026": 0}}

The model tells me the revenue impact of this reform is $0 in 2023 and positive $23 billion in 2026.

Am I missing another parameter I need to adjust to do these ACTC_c reforms properly? Is there something TCJA-related driving the different behavior before and after 2025? I’m using the 2011 PUF and have tried this with versions 3.4.1 (current) and 3.4.0 of the model.

Thanks in advance for your help!

# Revenue code:  
# Create an instance of the calculator class for baseline policy 
recs = tc.Records() 
pol = tc.Policy() 
calc1 = tc.Calculator(policy=pol, records=recs) 

# Create an instance of the calculator class for reform policy 
reform = tc.Policy.read_json_reform("ACTC_X.json") 
pol.implement_reform(reform) 
calc2 = tc.Calculator(policy=pol, records=recs) 

# Calculate difference in tax revenue for year Y
CY = Y
calc1.advance_to_year(CY) 
calc2.advance_to_year(CY) 
calc1.calc_all() 
calc2.calc_all() 
iitax_rev1 = calc1.weighted_total('iitax') 
iitax_rev2 = calc2.weighted_total('iitax') 
diff = iitax_rev2-iitax_rev1 
print(f'{CY}_reform_tax_rev= ${diff:,.0f}') 

Hi @gmfenton, I'm not sure why Tax-Calculator gives a $0 impact, but just as another benchmark, PolicyEngine estimates that raising the ACTC from $1,600 to $2,000 in 2023 would cost about $800 million in 2023. TPC's 2023 estimate of $2.8 billion may exceed this in part if they assumed a $1,500 baseline ACTC for 2023, and also because PolicyEngine currently uses the CPS rather than the PUF.

Have you examined a sample household with Tax-Calculator? Sometimes that can help diagnose issues; e.g., here's how PolicyEngine shows it affecting a single parent of one:
image

@gmfenton I think the issues here is just how you are writing your reform. If you want to change the ACTC_c parameter for two different ranges of years, you need to do that in the same dictionary. e.g., see the specification of the json string in the code below:

import taxcalc as tc
recs = tc.Records() 
pol = tc.Policy() 
calc1 = tc.Calculator(policy=pol, records=recs) 

# Create an instance of the calculator class for reform policy 
json_str = '{"ACTC_c": {"2023": 2000, "2026": 1000}}'
reform = tc.Policy.read_json_reform(json_str)
pol.implement_reform(reform) 
calc2 = tc.Calculator(policy=pol, records=recs) 

# Calculate difference in tax revenue for year Y
for Y in range(2023, 2032):
    CY = Y
    calc1.advance_to_year(CY) 
    calc2.advance_to_year(CY) 
    calc1.calc_all() 
    calc2.calc_all() 
    iitax_rev1 = calc1.weighted_total('iitax') 
    iitax_rev2 = calc2.weighted_total('iitax') 
    diff = iitax_rev2-iitax_rev1 
    print(f'{CY}_reform_tax_rev= ${diff:,.0f}') 

Which uses the CPS file and gives results similar to what you cite from TPC (around $2 billion per year):

2023_reform_tax_rev= $-1,804,884,226
2024_reform_tax_rev= $-1,937,256,092
2025_reform_tax_rev= $-2,020,715,288
2026_reform_tax_rev= $0
2027_reform_tax_rev= $0
2028_reform_tax_rev= $0
2029_reform_tax_rev= $0
2030_reform_tax_rev= $0
2031_reform_tax_rev= $0

Thank you @MaxGhenis and @jdebacker for your quick responses!

Yes Jason, including the separate year ranges in the same dictionary fixed it, much appreciated.