Skip to content

Apply ACA PTC formula before 2024 using existing historical SLCSP premiums #8527

@daphnehanse11

Description

@daphnehanse11

Problem

aca_ptc currently returns zero for all years before 2024, even when a tax unit is ACA PTC eligible and the model has historical benchmark premium inputs for that year.

Evidence in the code:

  • policyengine_us/variables/gov/aca/ptc/aca_ptc.py defines a base formula that returns 0 and only applies the real calculation in formula_2024.
  • policyengine_us/parameters/gov/aca/state_rating_area_cost.yaml contains rating-area SLCSP values for historical years, including 2018-2023 for many rating areas, and uses gov.aca.benchmark_premium_uprating.
  • policyengine_us/parameters/gov/aca/benchmark_premium_uprating.yaml includes historical KFF average benchmark premiums from 2014 through 2025.

Reproduction

A simple 2023 household can be eligible and have a nonzero SLCSP, but still receives zero PTC:

from policyengine_us import Simulation

situation = {
    "people": {
        "p": {
            "age": {"2023": 40, "2024": 40},
            "employment_income": {"2023": 30_000, "2024": 30_000},
            "is_tax_unit_head": {"2023": True, "2024": True},
        }
    },
    "tax_units": {"tu": {"members": ["p"]}},
    "families": {"f": {"members": ["p"]}},
    "spm_units": {"spm": {"members": ["p"]}},
    "households": {
        "h": {
            "members": ["p"],
            "state_name": {"2023": "TX", "2024": "TX"},
            "county_str": {"2023": "HARRIS_COUNTY_TX", "2024": "HARRIS_COUNTY_TX"},
        }
    },
}

sim = Simulation(situation=situation)
print("2023 eligible", sim.calculate("is_aca_ptc_eligible", 2023))
print("2023 slcsp", sim.calculate("slcsp", 2023))
print("2023 aca_ptc", sim.calculate("aca_ptc", 2023))
print("2024 eligible", sim.calculate("is_aca_ptc_eligible", 2024))
print("2024 slcsp", sim.calculate("slcsp", 2024))
print("2024 aca_ptc", sim.calculate("aca_ptc", 2024))

Current output:

2023 eligible [ True]
2023 slcsp [5452.8394]
2023 aca_ptc [0.]
2024 eligible [ True]
2024 slcsp [5773.5938]
2024 aca_ptc [5113.5938]

Expected behavior

For years where the model has the required premium, age curve, rating-area, eligibility, and required contribution percentage parameters, aca_ptc should apply the PTC formula instead of returning zero solely because the year is before 2024.

At minimum, the formula should probably start in 2018, since state_rating_area_cost.yaml appears to have rating-area premiums from 2018 onward. If contribution-rate parameters support earlier years, then the start date could be earlier.

Why this matters

This affects both household calculations and budget/backtesting analyses. Historical analyses currently understate household health benefits and federal ACA PTC spending for pre-2024 years, despite having much of the historical premium data needed to calculate the credit.

Possible fix

Move the existing formula_2024 logic into an earlier dated formula, such as formula_2018, after checking the availability of aca_required_contribution_percentage, SLCSP rating-area costs, age curves, and eligibility parameters for those years. Add a regression test showing nonzero 2023 PTC for an eligible marketplace household with nonzero SLCSP.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions