Skip to content

Extend IRS SOI uprating series to tax year 2023 - #10132

Draft
MaxGhenis wants to merge 1 commit into
fill-soi-uprating-gapsfrom
soi-uprating-ty2023
Draft

MaxGhenis wants to merge 1 commit into
fill-soi-uprating-gapsfrom
soi-uprating-ty2023

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #10128 (head c96ccb7ba4). Do not merge before it. This rebases onto main once #10128 squash-merges.

Summary

The IRS SOI national-total uprating series under calibration/gov/irs/soi/ end at 2020, 2021 or 2022 after #10128, except long-term capital gains, which reaches 2023. IRS SOI has published Publication 1304 Tables 1.4 and 1.4A through tax year 2023 (24in14ar.xls returns 404). This PR adds every year from each series' last value to 2023, using the column #10128 documents in each file's header comment. It also adds a guard so that no series lags the others again.

Series Column (all returns) 2021 2022 2023 Old 2023 projection Factor from 2023
non_qualified_dividend_income ordinary less qualified dividends 91.1 99.1 168.2 94.3 x1.7837
qualified_dividend_income qualified dividends 295.9 313.2 336.1 362.8 x0.9264
self_employment_income business or profession net income 517.1 543.6 530.4 634.5 x0.8359
tax_exempt_interest_income tax-exempt interest 55.5 55.6 66.1 70.7 x0.9342
tax_exempt_pension_income pensions and annuities, total less taxable 648.9 616.7 662.8 711.3 x0.9318
taxable_interest_income taxable interest 103.5 133.6 313.8 151.6 x2.0702
taxable_pension_income pensions and annuities, taxable 858.0 911.7 932.1 1,014.3 x0.9190
alimony_income alimony received 7.4 6.7 8.8 x0.7575
employment_income salaries and wages; from 2022, total wages, total (line 1z) 9,739.0 10,204.1 10,260.2 x0.9945
farm_income farm net income less net loss -25.3 -27.8 -27.1 x1.0245
farm_rent_income farm rental net income less net loss 6.1 6.3 5.8 x1.0896
rental_income rent and royalty net income less net loss 51.4 56.4 48.3 x1.1663
social_security social security benefits, total 871.3 973.6 963.0 x1.0111
partnership_s_corp_income partnership and S corporation net income less net loss 991.1 1,126.5 x0.8798
short_term_capital_gains Table 1.4A net short-term capital gain 70.5 59.3 x1.1882
unemployment_compensation unemployment compensation 30.9 32.1 x0.9644

$ billions. Each file stores the exact thousands-of-dollars figure times 1,000 and cites one Table 1.4 or 1.4A file per tax year. "Old 2023 projection" is what the series held at 2023 before this PR: its last authored value grown by its CBO uprater. The factor is new / old at 2023.

Columns are located by their header labels, not by position. TY2022 inserted six wage-component columns, so every later column moved 12 places. The extraction is #10128's script plus the TY2022+ wage labels. It reproduces every value already in #10128's files with zero mismatches (the 2018 pension estimates are skipped because they are not table values). The TY2021-2023 files re-downloaded today match the copies #10128 used (sha256).

Wage concept from tax year 2022

From TY2022, Table 1.4 replaces "Salaries and wages" with "Total wages", which has a "Total" column followed by its parts ("Total from Form W-2 wages", household employee wages, unreported tips, dependent care benefits, Form 8919 wages, other earned income). The series takes the Total:

  • It is Form 1040 line 1z, the successor of line 1. In Publication 4801 (line item estimates), TY2021 line 1 is $9,022,352,941K, equal to Table 1.4 TY2021 "Salaries and wages". TY2023 line 1z is $10,204,095,705K, equal to Table 1.4 TY2023 "Total wages, total". SOI's TY2022 state data documentation guide also maps A00200 ("salaries and wages amount") to 1040 line 1z.
  • What changed in 2022. The 2022 Form 1040 instructions ("What's New", file page 6) say line 1 became lines 1a to 1z and three amounts moved to Schedule 1: scholarships not reported on Form W-2 (line 8r), pensions from nonqualified deferred compensation and nongovernmental section 457 plans (8t), and wages earned while incarcerated (8u). In TY2023 these total $28.6B ($4.60B + $23.65B + $0.38B, Publication 4801), or 0.28% of line 1z. The 2021 instructions list the other line 1 items: household employee wages, unreported tips, Medicaid waiver payments, dependent care and adoption benefits, excess deferrals, disability pensions, corrective distributions, and Form 8919 wages. All of them are on lines 1b to 1h in 2022. The series keeps the published total and does not adjust for the 0.3% break. The file's header comment says so.
  • Not the W-2 column. The listed parts do not add up to the total: TY2022 parts $9,419.3B vs total $9,739.0B; TY2023 $10,115.2B vs $10,204.1B. Publication 4801's TY2023 lines 1a to 1h, including 1d and 1f, sum to $10,115.8B against line 1z's $10,204.1B. The total grows 7.9% from TY2021 "Salaries and wages". The W-2 column alone would show 3.7%. A test pins the 2022 and 2023 values to the total.

Effect

How the level moves. policyengine-core uprate_parameter (parameters/operations/uprate_parameters.py) gives every uprater instant after a series' last authored instant the value value_at_last * uprater(t) / uprater(last). Moving the last authored year to 2023 therefore replaces the projected 2021/2022–2023 values with actuals and multiplies every year from 2023 on by one factor (table above). Ratios between any two years at or after 2023 are unchanged.

Full parameter tree (every leaf after system init, before = c96ccb7ba4, after = this PR; scripts from #10128):

  • 32 parameters change: the 16 totals and their 16 _per_capita siblings. Nothing else moves, and the variable-to-series map (384 variables) is unchanged.
  • For every series, new / old is identical at all 78 instants from 2023 to 2100 (to 1e-12). The per-capita sibling shifts by the same factor, and no value before a series' old last year changes.

Microsimulation: no change.

  • extend_single_year_dataset (policyengine_us/data/economic_assumptions.py) multiplies each year by value(t) / value(t-1) starting from the dataset's year, and the default dataset is 2024.
  • Microcosm's static aging (microcosm-calibrate static_aging.py) uses series(year) / series(base_year) with base year 2024.
  • Both ratios start at or after 2023. A dataset based in 2022 or earlier would see the household-input changes below.

Other readers (GitHub code search of the PolicyEngine org for calibration.gov.irs.soi):

  • Microcosm: above.
  • spm-threshold-paper: reads employment income as a 2025/2024 ratio, unchanged.
  • ACA-Calc: test_get_uprating_factor prints employment income at 2026, which moves x0.9945. It is a print in a test helper, with no assertion.
  • crfb-tob-impacts and code-snippets (docs) and ai-inequality (a metadata CSV) read no values.
  • In this repo, the Trustees 2025 long-run extension grows each SOI total from its 2036 level, so its ratios carry through.

Household inputs dated 2015-2022 and projected to 2023 or later are what change. The factor to 2025 for an input dated January 1 of year Y, old to new, by series (number of variables that follow it):

Series (variables) 2016 2019 2020 2021 2022
employment_income (17) 1.481 to 1.473 1.317 to 1.310 1.300 to 1.293 1.218 to 1.211 1.133 to 1.127
taxable_pension_income (13) 1.811 to 1.664 1.632 to 1.500 1.554 to 1.428 1.386 to 1.382 1.308 to 1.307
tax_exempt_pension_income (6) 2.126 to 1.981 1.773 to 1.652 1.554 to 1.448 1.386 to 1.300 1.308 to 1.374
self_employment_income (5) 1.628 to 1.361 1.458 to 1.219 1.486 to 1.242 1.185 to 1.052 1.126 to 1.006
social_security (4) 1.669 to 1.687 1.467 to 1.483 1.368 to 1.383 1.343 to 1.358 1.242 to 1.239
qualified_dividend_income (3) 1.794 to 1.662 1.489 to 1.379 1.426 to 1.321 1.190 to 1.166 1.129 to 1.107
alimony_income (2) 0.922 to 0.698 0.910 to 0.689 1.023 to 0.775 1.165 to 0.883 1.169 to 1.015
farm_income (2) 1.678 to 1.719 1.270 to 1.301 1.388 to 1.422 1.165 to 1.194 1.169 to 1.237
partnership_s_corp_income (2) 1.789 to 1.574 1.693 to 1.489 1.627 to 1.432 1.184 to 1.042 1.126 to 0.991
farm_rent_income (1) 1.520 to 1.656 1.429 to 1.557 1.318 to 1.437 1.165 to 1.270 1.169 to 1.167
non_qualified_dividend_income (1) 1.810 to 3.229 1.148 to 2.049 1.426 to 2.543 1.190 to 1.896 1.129 to 1.751
rental_income (1) 1.269 to 1.480 1.125 to 1.312 1.351 to 1.576 1.165 to 1.359 1.169 to 1.237
short_term_capital_gains (1) 2.393 to 2.843 1.618 to 1.923 0.635 to 0.754 0.459 to 0.546 1.238 to 1.471
tax_exempt_interest_income (1) 1.239 to 1.157 1.244 to 1.162 1.294 to 1.209 1.608 to 1.299 1.352 to 1.304
taxable_interest_income (1) 1.666 to 3.449 1.071 to 2.217 1.294 to 2.679 1.608 to 3.308 1.352 to 2.576
unemployment_compensation (1) 1.313 to 1.267 1.591 to 1.534 0.084 to 0.081 0.164 to 0.158 1.140 to 1.099

The largest moves come from actuals that left the CBO-grown path. Taxable interest went from $133.6B to $313.8B in 2023, and non-qualified dividends from $99.1B to $168.2B. Self-employment net income came in 16% below its old projection.

Blast radius

  • Static scan of all 4,998 YAML test files (34,302 cases). A case is flagged when it has an input of a variable that follows a changed series, dated in year Y, with an output in a later year T where index(T)/index(Y) changes. Two cases match, and neither asserts a value that moves. In both the input is 0, and the variable is read at its own dated year (IRMAA uses income from two years prior):
    • medicare_cost.yaml "unit test 5 - 2021 data, premium-free": tax_exempt_interest_income 2019 to 2021.
    • income_adjusted_part_d_premium_surcharge.yaml "unit test 3 - separate filer top bracket": tax_exempt_interest_income 2022 to 2024.
  • No variable formula reads a later period. The forward offsets in the code are in_effect loops over parameter periods in reforms, the SC and MD care-expense parameter year, and same-year months in TX CEAP. So dated inputs are the only path to a test.
  • Local tests on the snapshot. test_parameter_files.py, tests/core/test_uprating_series.py and test_uprating_extensions.py: 186 passed, 1 failed. The failure is the CBO AGI gap Fill IRS SOI uprating series gaps with Publication 1304 actuals #10128 already reports, which Fill CBO total AGI for 2015-2018 with IRS SOI actuals #10114 fixes.
  • Instrumented runs, queued under heavy_run (a sitecustomize hook logs each runtime uprating on a changed series from a period in 2022 or earlier to a later one; checked to log $1,000 of 2019 taxable interest becoming $2,216.85 in 2025):
    • YAML shards: HHS, SSA, IRS and household.
    • Python: the uprating tests, plus the Rest core and policy groups.
    • They are behind the load gate. Results will follow.

Tests and invariants

Invariants, each checked exhaustively over the finite set of series and years:

  • Every SOI series ends at the latest published tax year (test_soi_series_run_to_the_latest_published_tax_year, new). It fails on Fill IRS SOI uprating series gaps with Publication 1304 actuals #10128's head for 16 of the 17 series. When TY2024 is added, the constant moves and every series has to follow.
  • The wage series takes the line 1z total, not the W-2 column (test_soi_wages_use_the_line_1z_total, new).
  • Fill IRS SOI uprating series gaps with Publication 1304 actuals #10128's guards now cover the new years:
    • each value cites its own tax year's Table 1.4/1.4A file;
    • every series has a January value for each year;
    • from its last authored year (now 2023 for all), each series grows exactly with its uprater.
  • Constant level factor from 2023, siblings matching, earlier years unchanged. This is checked between the two parameter dumps (level_check.py), not in the repo, because it compares two commits.
  • Differential. This extraction reproduces every value Fill IRS SOI uprating series gaps with Publication 1304 actuals #10128 authored. An independent reviewer re-extracts every added value blind.

Review

Pending: independent GPT-6.1 Sol review (blind re-extraction of every added value, the wage concept, the mechanism claims, the tests).

Evidence and scripts: ~/reviews/soi-ty2023-2026-10-11/ (extraction, parameter dumps and diff, level factors, impact table, YAML scan, Publication 4801 and Form 1040 instruction excerpts, consumer files).

axiom: n/a: calibration and uprating data, no policy rule

🤖 Generated with Claude Code

Add Publication 1304 Table 1.4 and 1.4A values for tax years 2021-2023 to
every SOI national-total uprating series that ended before 2023, using the
column each series already documents. From tax year 2022 the wage series
takes Table 1.4's "total wages, total" (Form 1040 line 1z). Add a guard
that every SOI series ends at the latest published tax year.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant