diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..2cf3a8f0ae0 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,8 @@ +- bump: minor + changes: + added: + - Add liquid asset input variables (bank_account_assets, stock_assets, bond_assets), ssi_countable_resources, and spm_unit_cash_assets aggregation + - Add takes_up_ssi_if_eligible variable for SSI takeup modeling + changed: + - SSI resource test now uses actual imputed assets instead of random pass rate + - SSI benefit now applies takeup in microsimulation diff --git a/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/README.md b/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/README.md index f45448fdd0e..4035ff7cebc 100644 --- a/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/README.md +++ b/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/README.md @@ -1,10 +1,16 @@ # Resources -[SSA reported $5.293 billion in SSI expenditures in February 2023](https://www.ssa.gov/policy/docs/quickfacts/stat_snapshot/#table3). -Adjust `pass_rate.yaml` to match this for SSI in 2023 ($5.293 billion * 12 = $63.5 billion). +SSI countable resources are now calculated from imputed liquid assets +(bank accounts, stocks, bonds) rather than using a random pass rate. + +The assets are imputed from SIPP in policyengine-us-data and flow through +to the SSI resource test via `ssi_countable_resources`. -Check with this code: +Check SSI expenditures with: ```python from policyengine_us import Microsimulation Microsimulation().calc("ssi", map_to="person", period=2023).sum() / 1e9 ``` + +[SSA reported $5.293 billion in SSI expenditures in February 2023](https://www.ssa.gov/policy/docs/quickfacts/stat_snapshot/#table3). +Annual target: $5.293 billion * 12 = $63.5 billion. diff --git a/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/countable.yaml b/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/countable.yaml new file mode 100644 index 00000000000..0183ec8cb12 --- /dev/null +++ b/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/countable.yaml @@ -0,0 +1,20 @@ +description: >- + The US counts these asset types as countable resources for SSI eligibility. + Excludes home, one vehicle, household goods, burial plots, and retirement accounts. +values: + 1975-01-01: + # Liquid assets counted as resources + - bank_account_assets # Checking, savings, money market + - stock_assets # Stocks and mutual funds + - bond_assets # Bonds and government securities +metadata: + label: SSI countable resource sources + reference: + - title: SSA POMS SI 01140.200 - Checking and Savings Accounts + href: https://secure.ssa.gov/poms.nsf/lnx/0501140200 + - title: SSA POMS SI 01140.220 - Stocks + href: https://secure.ssa.gov/poms.nsf/lnx/0501140220 + - title: SSA POMS SI 01140.240 - U.S. Savings Bonds + href: https://secure.ssa.gov/poms.nsf/lnx/0501140240 + - title: SSA POMS SI 01140.250 - Municipal, Corporate and Government Bonds + href: https://secure.ssa.gov/poms.nsf/lnx/0501140250 diff --git a/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/pass_rate.yaml b/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/pass_rate.yaml deleted file mode 100644 index cab81f450c9..00000000000 --- a/policyengine_us/parameters/gov/ssa/ssi/eligibility/resources/pass_rate.yaml +++ /dev/null @@ -1,3 +0,0 @@ -description: Proportion of SSI-aged-blind-disabled recipients who meet the asset test. -values: - 0000-01-01: 0.4 diff --git a/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/meets_ssi_resource_test.py b/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/meets_ssi_resource_test.py index 06839203514..590103a2268 100644 --- a/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/meets_ssi_resource_test.py +++ b/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/meets_ssi_resource_test.py @@ -5,8 +5,8 @@ class meets_ssi_resource_test(Variable): value_type = bool entity = Person label = "Meets SSI resource test" - unit = USD definition_period = YEAR + reference = "https://secure.ssa.gov/poms.nsf/lnx/0501110000" def formula(person, period, parameters): p = parameters(period).gov.ssa.ssi diff --git a/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/ssi_countable_resources.py b/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/ssi_countable_resources.py index ad4498b61a1..3d6043b017e 100644 --- a/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/ssi_countable_resources.py +++ b/policyengine_us/variables/gov/ssa/ssi/eligibility/resources/ssi_countable_resources.py @@ -5,5 +5,15 @@ class ssi_countable_resources(Variable): value_type = float entity = Person label = "SSI countable resources" + documentation = ( + "Countable resources for SSI eligibility. Includes liquid assets " + "(bank accounts, stocks, bonds) but excludes home, one vehicle, " + "household goods, and retirement accounts per SSI rules." + ) unit = USD definition_period = YEAR + reference = ( + "https://secure.ssa.gov/poms.nsf/lnx/0501140000", # POMS SI 01140.000 - Types of Countable Resources + ) + + adds = "gov.ssa.ssi.eligibility.resources.countable" diff --git a/policyengine_us/variables/gov/ssa/ssi/ssi.py b/policyengine_us/variables/gov/ssa/ssi/ssi.py index 47d6d6b74c9..922b94a7271 100644 --- a/policyengine_us/variables/gov/ssa/ssi/ssi.py +++ b/policyengine_us/variables/gov/ssa/ssi/ssi.py @@ -30,8 +30,11 @@ def formula(person, period, parameters): individual_max = p.individual * MONTHS_IN_YEAR capped_benefit = min_(benefit, individual_max) - return where( + final_benefit = where( deeming_applies, capped_benefit, benefit, ) + + takes_up = person("takes_up_ssi_if_eligible", period) + return final_benefit * takes_up diff --git a/policyengine_us/variables/gov/ssa/ssi/takes_up_ssi_if_eligible.py b/policyengine_us/variables/gov/ssa/ssi/takes_up_ssi_if_eligible.py new file mode 100644 index 00000000000..cd8d6d376df --- /dev/null +++ b/policyengine_us/variables/gov/ssa/ssi/takes_up_ssi_if_eligible.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class takes_up_ssi_if_eligible(Variable): + value_type = bool + entity = Person + label = "Takes up SSI if eligible" + definition_period = YEAR + default_value = True diff --git a/policyengine_us/variables/household/assets/bank_account_assets.py b/policyengine_us/variables/household/assets/bank_account_assets.py new file mode 100644 index 00000000000..1dbfdbc151e --- /dev/null +++ b/policyengine_us/variables/household/assets/bank_account_assets.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class bank_account_assets(Variable): + value_type = float + entity = Person + label = "Bank account assets" + documentation = ( + "Value of checking, savings, and money market accounts. " + "Imputed from SIPP TVAL_BANK." + ) + unit = USD + definition_period = YEAR + uprating = "gov.bls.cpi.cpi_u" + reference = "https://secure.ssa.gov/poms.nsf/lnx/0501140200" diff --git a/policyengine_us/variables/household/assets/bond_assets.py b/policyengine_us/variables/household/assets/bond_assets.py new file mode 100644 index 00000000000..6497eabf6d6 --- /dev/null +++ b/policyengine_us/variables/household/assets/bond_assets.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class bond_assets(Variable): + value_type = float + entity = Person + label = "Bond assets" + documentation = ( + "Value of bonds and government securities. " + "Imputed from SIPP TVAL_BOND." + ) + unit = USD + definition_period = YEAR + uprating = "gov.bls.cpi.cpi_u" + reference = ( + "https://secure.ssa.gov/poms.nsf/lnx/0501140240", + "https://secure.ssa.gov/poms.nsf/lnx/0501140250", + ) diff --git a/policyengine_us/variables/household/assets/spm_unit_cash_assets.py b/policyengine_us/variables/household/assets/spm_unit_cash_assets.py index 954a3a86217..fc143cd39e2 100644 --- a/policyengine_us/variables/household/assets/spm_unit_cash_assets.py +++ b/policyengine_us/variables/household/assets/spm_unit_cash_assets.py @@ -7,3 +7,5 @@ class spm_unit_cash_assets(Variable): label = "SPM unit cash assets" definition_period = YEAR unit = USD + + adds = ["bank_account_assets", "stock_assets", "bond_assets"] diff --git a/policyengine_us/variables/household/assets/stock_assets.py b/policyengine_us/variables/household/assets/stock_assets.py new file mode 100644 index 00000000000..9343c3679c1 --- /dev/null +++ b/policyengine_us/variables/household/assets/stock_assets.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class stock_assets(Variable): + value_type = float + entity = Person + label = "Stock assets" + documentation = ( + "Value of stocks and mutual funds. " "Imputed from SIPP TVAL_STMF." + ) + unit = USD + definition_period = YEAR + uprating = "gov.bls.cpi.cpi_u" + reference = "https://secure.ssa.gov/poms.nsf/lnx/0501140220"