owlplanner 2026.1.26__tar.gz → 2026.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/INSTALL.md +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/PARAMETERS.md +8 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/PKG-INFO +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/README.md +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/RELEASE_NOTES.md +80 -50
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/USER_GUIDE.md +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/README.md +1 -1
- owlplanner-2026.2.2/examples/Case_alex+jamie.toml +64 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_drawdowncalc-comparison-1.toml +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_jack+jill.toml +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_joe.toml +3 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_john+sally.toml +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_jon+jane.toml +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_kim+sam-bequest.toml +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_kim+sam-spending.toml +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/owl.pdf +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/owl.tex +282 -211
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/config.py +17 -3
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plan.py +188 -84
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/rates.py +377 -366
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/tax2026.py +11 -9
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/version.py +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_historical.py +19 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_mc.py +0 -1
- owlplanner-2026.2.2/tests/test_medicare.py +92 -0
- owlplanner-2026.2.2/tests/test_rates_reverse_roll.py +275 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_repro.py +3 -3
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_summary.py +36 -36
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_toml_cases.py +2 -4
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/About_Owl.py +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Asset_Allocation.py +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Create_Case.py +14 -14
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Documentation.py +45 -24
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Fixed_Income.py +18 -14
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Graphs.py +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Historical_Range.py +15 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Household_Financial_Profile.py +10 -8
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Logs.py +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Monte_Carlo.py +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Optimization_Parameters.py +3 -3
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Output_Files.py +1 -1
- owlplanner-2026.2.2/ui/Quick_Start.py +171 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Rates_Selection.py +339 -313
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Savings_Assets.py +2 -2
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/case_progress.py +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/main.py +1 -1
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/owlbridge.py +48 -6
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/sskeys.py +7 -5
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/tomlexamples.py +1 -2
- owlplanner-2026.1.26/case_test.toml +0 -69
- owlplanner-2026.1.26/convert_rates.py +0 -58
- owlplanner-2026.1.26/iteration_data.csv +0 -32
- owlplanner-2026.1.26/iteration_data_2.csv +0 -57
- owlplanner-2026.1.26/myrates.csv +0 -3
- owlplanner-2026.1.26/myrates.xlsx +0 -0
- owlplanner-2026.1.26/src/owlplanner/In Discussion #58, the case of Kim and Sam.md +0 -307
- owlplanner-2026.1.26/ui/Quick_Start.py +0 -107
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.flake8 +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.gitattributes +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.gitignore +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.streamlit/config.toml +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.streamlit/fullconfig.toml +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/AUTHORS +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/Adamodar_Rates_2026.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/LICENSE +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/awi.txt +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/Dockerfile.bare +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/Dockerfile.static +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildContainers.cmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildContainers.sh +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildPackage.cmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildPackage.sh +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildentrypoint.sh +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/docker-compose.yml +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/runentrypoint.sh +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/examples/example-1.html +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/index.html +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/install-uv.html +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/installation.html +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/papers +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/search.json +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-45a48b56c8ad2523a9a31c69be39928e.min.css +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-icons.css +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-icons.woff +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap.min.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/clipboard/clipboard.min.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/anchor.min.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/axe/axe-check.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/popper.min.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/quarto.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tabsets/tabsets.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tippy.css +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tippy.umd.min.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-nav/headroom.min.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-nav/quarto-nav.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/autocomplete.umd.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/fuse.min.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/quarto-search.js +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/users_guide.html +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_jack+jill.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_jack+jill_house.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_joe.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_john+sally.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_jon+jane.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_kim+sam.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_template.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/template.ipynb +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/tutorial_1.ipynb +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/tutorial_2.ipynb +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/tutorial_3.ipynb +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/owlplanner.cmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/owlplanner.sh +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/AD-taxDef.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/AD-taxFree.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/AD-taxable.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/Hist_Bequest.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/Hist_Spending.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/MC-tutorial2a.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/MC-tutorial2b.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/OwlUI.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/allocations.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/owl.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/piecewiseConstant.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/profile.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/ratesCorrelations.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/ratesPlot.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/savingsPlot.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/sourcesPlot.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/spendingPlot.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/taxIncomePlot.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/taxesPlot.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/pyproject.toml +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/pytest.ini +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/requirements.txt +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/.gitignore +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/README.md +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/_quarto.yml +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/assets/owl.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/examples/example-1.qmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/examples/workbook_jack & jill - tutorial.xlsx +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/index.qmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/install-uv.qmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/installation.qmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/users_guide.qmd +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/abcapi.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/README.md +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/_main.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/cli_logging.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/cmd_list.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/cmd_run.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/awi.csv +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/bendpoints.csv +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/newawi.csv +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/debts.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/fixedassets.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/mylogging.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/__init__.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/base.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/factory.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/matplotlib_backend.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/plotly_backend.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/progress.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/socialsecurity.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/utils.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_abcapi_coverage.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_config_coverage.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_debts.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_fixedassets.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_logger.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ltcg.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_mylogging_coverage.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_plan_edge_cases.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_rates.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_regressions.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_socsec.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_timelists.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_timelists_coverage.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ui_asset_allocation.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ui_compare_summaries.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ui_sskeys.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_units.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_utils_coverage.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Parameters_Reference.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/README.md +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Settings.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Worksheets.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/__init__.py +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/owl.png +0 -0
- {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/progress.py +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## A retirement exploration tool based on linear programming
|
|
4
4
|
|
|
5
|
-
<img align=right src="https://github.com/mdlacasse/Owl/blob/main/
|
|
5
|
+
<img align=right src="https://github.com/mdlacasse/Owl/blob/main/papers/images/owl.png?raw=true" width="250">
|
|
6
6
|
|
|
7
7
|
------------------------------------------------------------------------------------
|
|
8
8
|
### About
|
|
@@ -107,7 +107,13 @@ Investment return rates and inflation assumptions.
|
|
|
107
107
|
| `from` | integer | Starting year for historical data range (must be between 1928 and 2025) |
|
|
108
108
|
| `to` | integer | Ending year for historical data range (must be between 1928 and 2025, and greater than `from`) |
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
#### For `method = "historical"`, `"histochastic"`, or `"stochastic"` (varying rates only):
|
|
111
|
+
| Parameter | Type | Description |
|
|
112
|
+
|-----------|------|-------------|
|
|
113
|
+
| `reverse_sequence` | boolean | If true, reverse the rate sequence along the time axis (e.g. last year first). Default is `false`. Ignored for fixed/constant rate methods. Used for both single-scenario and Historical Range runs. |
|
|
114
|
+
| `roll_sequence` | integer | Number of years to roll (shift) the rate sequence; positive shifts toward the end, values wrap. Default is `0`. Ignored for fixed/constant rate methods. Used for both single-scenario and Historical Range runs. |
|
|
115
|
+
|
|
116
|
+
**Note:** `from`/`to` are stored for all methods in saved case files. Methods that do not use them ignore these fields. When running Historical Range, each year in the range uses the historical rate sequence starting at that year, with `reverse_sequence` and `roll_sequence` applied to each sequence.
|
|
111
117
|
|
|
112
118
|
---
|
|
113
119
|
|
|
@@ -172,8 +178,8 @@ Options controlling the optimization solver and constraints.
|
|
|
172
178
|
| `amoRoth` | boolean | *(Advanced)* Whether to enforce at-most-one (AMO) constraints preventing simultaneous Roth conversions and tax-free withdrawals. | `true` |
|
|
173
179
|
| `amoSurplus` | boolean | *(Advanced)* Whether to enforce XOR constraints preventing simultaneous surplus deposits and withdrawals from taxable or tax-free accounts. | `true` |
|
|
174
180
|
| `bequest` | float | Target bequest value in today's dollars (in `units`). Used when `objective = "maxSpending"`. | `1` (if omitted with `maxSpending`) |
|
|
175
|
-
| `bigMirmaa` | float | *(Advanced)* Big-M value for Medicare IRMAA bracket constraints (used when `withMedicare = "optimize"`). Should exceed any plausible aggregate MAGI. | `5e7` |
|
|
176
181
|
| `bigMamo` | float | *(Advanced)* Big-M value for at-mot-one (AMO) constraints (mutually exclusive operations). Should exceed any individual withdrawal, conversion, or surplus deposit. | `5e7` |
|
|
182
|
+
| `epsilon` | float | *(Advanced)* Lexicographic weight added to the objective to break ties. Adds a small penalty to Roth conversions, and when `N_i = 2`, also penalizes withdrawals of spouse 2 to favor withdrawals from spouse 1. Use a very small value so the primary objective dominates. | `0` |
|
|
177
183
|
| `gap` | float | *(Advanced)* Relative MILP gap used by solvers and to scale convergence tolerances. | `1e-4` (default); if `withMedicare = "optimize"` and unset, set to `1e-3` (or `1e-2` when `maxRothConversion <= 15`) |
|
|
178
184
|
| `maxIter` | integer | *(Advanced)* Maximum number of iterations for the self-consistent loop. Must be at least 1. | `29` |
|
|
179
185
|
| `maxRothConversion` | float or string | Maximum annual Roth conversion amount (in `units`). Use `"file"` to take per-year limits from time lists; omit for no cap (except last year). | No cap unless provided |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owlplanner
|
|
3
|
-
Version: 2026.
|
|
3
|
+
Version: 2026.2.2
|
|
4
4
|
Summary: Owl - Optimal Wealth Lab: Retirement planner with great wisdom
|
|
5
5
|
Project-URL: HomePage, https://github.com/mdlacasse/owl
|
|
6
6
|
Project-URL: Repository, https://github.com/mdlacasse/owl
|
|
@@ -797,7 +797,7 @@ your computer and can be used to reproduce a case at a later time.
|
|
|
797
797
|
|
|
798
798
|
---------------------------------------------------------------------
|
|
799
799
|
|
|
800
|
-
Copyright © 2024 - Martin-D. Lacasse
|
|
800
|
+
Copyright © 2024-2026 - Martin-D. Lacasse
|
|
801
801
|
|
|
802
802
|
Disclaimers: This code is for educatonal purposes only and does not constitute financial advice.
|
|
803
803
|
|
|
@@ -85,7 +85,7 @@ your computer and can be used to reproduce a case at a later time.
|
|
|
85
85
|
|
|
86
86
|
---------------------------------------------------------------------
|
|
87
87
|
|
|
88
|
-
Copyright © 2024 - Martin-D. Lacasse
|
|
88
|
+
Copyright © 2024-2026 - Martin-D. Lacasse
|
|
89
89
|
|
|
90
90
|
Disclaimers: This code is for educatonal purposes only and does not constitute financial advice.
|
|
91
91
|
|
|
@@ -1,13 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
- Updated Jupyter notebooks
|
|
3
|
-
- Improved logging
|
|
1
|
+
# Owl Release Notes
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
- Move "optimize" Medicare option to advanced section
|
|
7
|
-
- Add solver option to disable surpluses in late years
|
|
8
|
-
- Rename XOR -> AMO as correct term
|
|
3
|
+
---
|
|
9
4
|
|
|
10
|
-
|
|
5
|
+
## Version 2026.02.02
|
|
6
|
+
|
|
7
|
+
### Rates
|
|
8
|
+
- **Rate sequence modifiers** (issue #77): Add reverse and roll options for varying rate methods.
|
|
9
|
+
- New `reverse_sequence` (boolean) and `roll_sequence` (integer) in `setRates`, config, and TOML.
|
|
10
|
+
- UI: Reverse toggle and Roll (years) in Rates Selection → Advanced Options.
|
|
11
|
+
- Historical Range: same reverse/roll options in Advanced Options; `runHistoricalRange` accepts `reverse` and `roll` and applies them to each year’s historical sequence.
|
|
12
|
+
- Ignored for fixed/constant rate methods (with warning). Documented in PARAMETERS.md and Documentation.
|
|
13
|
+
|
|
14
|
+
### Landing page and Quick Start
|
|
15
|
+
- Update landing page (layout, link to repo, instructions for beginners).
|
|
16
|
+
- Add short description of what optimization is performed.
|
|
17
|
+
- Fix Quick Start line length (flake8).
|
|
18
|
+
|
|
19
|
+
### UI and examples
|
|
20
|
+
- Highlight current year in timelist and in worksheets (this year’s accounts).
|
|
21
|
+
- Fix case status incorrectly set to modified when visiting Create Case page (getDate/sskeys).
|
|
22
|
+
- Fix Joe’s example missing `withMedicare` option.
|
|
23
|
+
- Fix Social Security URL on Fixed Income page.
|
|
24
|
+
|
|
25
|
+
### Documentation and parameters
|
|
26
|
+
- Sync Documentation.py with UI: TOC (Parameters Reference, Quick Start icon), Create Case labels, Output Files button names, Roth conversion toggle wording, Resources link, case file naming.
|
|
27
|
+
- Update owl.tex description.
|
|
28
|
+
- Document lexicographic weight and self-consistent loop default tolerance in docs.
|
|
29
|
+
- PARAMETERS.md: document `reverse_sequence` and `roll_sequence`.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Version 2026.01.28
|
|
34
|
+
- Recoded Medicare optimization algorithm for SOS1 formulation.
|
|
35
|
+
- Updated documents and parameters.
|
|
36
|
+
- Added lexicographic weight epsilon in solver options.
|
|
37
|
+
|
|
38
|
+
## Version 2026.01.26
|
|
39
|
+
- Updated Jupyter notebooks.
|
|
40
|
+
- Improved logging.
|
|
41
|
+
|
|
42
|
+
## Version 2026.01.21
|
|
43
|
+
- Move "optimize" Medicare option to advanced section.
|
|
44
|
+
- Add solver option to disable surpluses in late years.
|
|
45
|
+
- Rename XOR → AMO as correct term.
|
|
46
|
+
|
|
47
|
+
## Version 2026.01.20
|
|
11
48
|
- Fix negative taxable gains in years of negative returns
|
|
12
49
|
- Fix limits in UI not allowing negative rates
|
|
13
50
|
- Add more control hooks on solver (xor, maxIter)
|
|
@@ -17,37 +54,30 @@
|
|
|
17
54
|
- Enable Python 3.14 in GH CI
|
|
18
55
|
- Investigate tests on GH failing due to different linear solver
|
|
19
56
|
- Disallow conversions and surplus in last 2 years
|
|
20
|
-
- Connect MOSEK logger with verbose keyword
|
|
57
|
+
- Connect MOSEK logger with verbose keyword.
|
|
21
58
|
|
|
22
|
-
|
|
59
|
+
## Version 2026.01.17
|
|
23
60
|
- Add more parameters to control solver
|
|
24
61
|
- Add capability to specify years from last in fixed assets
|
|
25
62
|
- Document negative/zero fixed-asset disposition years and update UI tooltip
|
|
26
63
|
- Add tests for negative/zero fixed-asset disposition years
|
|
27
|
-
- Improved default values for broader case applicability
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
- Add
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- Add non-taxable portion of SS to MAGI
|
|
45
|
-
- Fix cash flow to include all fixed-asset proceeds
|
|
46
|
-
- Apply max Roth conversion cap across both spouses
|
|
47
|
-
- Clarify SS tax fraction vs LTCG effective rate
|
|
48
|
-
- Align documentation and reproducibility baselines with code
|
|
49
|
-
|
|
50
|
-
### Version 2026.01.12
|
|
64
|
+
- Improved default values for broader case applicability.
|
|
65
|
+
|
|
66
|
+
## Version 2026.01.16
|
|
67
|
+
- Extend longevity table to 120 and add safety checks.
|
|
68
|
+
- Add 15% of untaxed SS back to MAGI.
|
|
69
|
+
- Update documentation (TeX).
|
|
70
|
+
- Adjust reproducibility tests.
|
|
71
|
+
|
|
72
|
+
## Version 2026.01.15
|
|
73
|
+
- Fix LTCG tax computation (self-consistent stacking accuracy).
|
|
74
|
+
- Add non-taxable portion of SS to MAGI.
|
|
75
|
+
- Fix cash flow to include all fixed-asset proceeds.
|
|
76
|
+
- Apply max Roth conversion cap across both spouses.
|
|
77
|
+
- Clarify SS tax fraction vs LTCG effective rate.
|
|
78
|
+
- Align documentation and reproducibility baselines with code.
|
|
79
|
+
|
|
80
|
+
## Version 2026.01.12
|
|
51
81
|
- Merge binary exclusion constraints for both spouses (one set per year instead of per individual)
|
|
52
82
|
- Update paper to reflect binary variables $z_{nz}$ shared across both spouses
|
|
53
83
|
- Reduce binary variable count from $4N_iN_n$ to $4N_n$ for married couples
|
|
@@ -56,9 +86,9 @@
|
|
|
56
86
|
- Add 15-minute time limit for solution
|
|
57
87
|
- Fix rare UI condition when starting Upload Case and hopping to Logs
|
|
58
88
|
- Change convergence criteria to only consider objective function (not solution vector)
|
|
59
|
-
- Split bigM between XOR exclusion constraints and IRMAA Medicare conditions
|
|
89
|
+
- Split bigM between XOR exclusion constraints and IRMAA Medicare conditions.
|
|
60
90
|
|
|
61
|
-
|
|
91
|
+
## Version 2026.01.08
|
|
62
92
|
- Fix dividends being taxed twice on taxable account withdrawals
|
|
63
93
|
- Remove int32 normalization of seed (reverted from 2026.01.07)
|
|
64
94
|
- Remove unused file-based rates parameters (rateFile, rateSheetName, workbook_file, worksheet_name)
|
|
@@ -69,16 +99,16 @@
|
|
|
69
99
|
- Update paper PDF to reflect change in dividend tax calculation
|
|
70
100
|
- Replace duplicate owl.tex and images with symlinks to avoid duplication
|
|
71
101
|
- Refactor code in config.py, debts.py, fixedassets.py, and utils.py
|
|
72
|
-
- Add tests to increase coverage and harden code
|
|
102
|
+
- Add tests to increase coverage and harden code.
|
|
73
103
|
|
|
74
|
-
|
|
104
|
+
## Version 2026.01.07
|
|
75
105
|
- Normalize seed to fit in signed int32 (issue #59)
|
|
76
106
|
- Remove animation
|
|
77
107
|
- Update Adamodar rates for 2025
|
|
78
108
|
- Make Kim+Sam cases consistent
|
|
79
|
-
- Make minor edits in About page
|
|
109
|
+
- Make minor edits in About page.
|
|
80
110
|
|
|
81
|
-
|
|
111
|
+
## Version 2026.01.05
|
|
82
112
|
- Migrate examples and TOML configuration to snake_case (closing issue #52)
|
|
83
113
|
- Optimizer still uses camelCase for distinction
|
|
84
114
|
- Add reproducibility flag and merge reproducibility branch
|
|
@@ -100,7 +130,7 @@
|
|
|
100
130
|
- Clean license and authorship
|
|
101
131
|
- Improve Summary output styling
|
|
102
132
|
|
|
103
|
-
|
|
133
|
+
## Version 2025.12.29
|
|
104
134
|
- Integrate loguru logging system with global log and filters
|
|
105
135
|
- Split logger per object
|
|
106
136
|
- Add persistence in TOML file
|
|
@@ -124,7 +154,7 @@
|
|
|
124
154
|
- Make OBBBA expiration year idiot-proof
|
|
125
155
|
- Fix typo (issue #47)
|
|
126
156
|
|
|
127
|
-
|
|
157
|
+
## Version 2025.12.20
|
|
128
158
|
- Implement Debts and Fixed Assets capabilities
|
|
129
159
|
- Mortgages, loans, restricted stocks, etc. and fixed lump-sum annuities can now be modeled
|
|
130
160
|
- Include debts and fixed assets at end of plan in bequest
|
|
@@ -137,7 +167,7 @@
|
|
|
137
167
|
- Improve UI
|
|
138
168
|
- Improve integration with ssa.tools
|
|
139
169
|
|
|
140
|
-
|
|
170
|
+
## Version 2025.12.16
|
|
141
171
|
- Fix error message when dates are empty in Create_Case
|
|
142
172
|
- Add fix to prevent stored TOML age from being out of range
|
|
143
173
|
- Rename duplicate to copy
|
|
@@ -145,27 +175,27 @@
|
|
|
145
175
|
- Prepare for new tax season
|
|
146
176
|
- Carry minor fixes from dev version
|
|
147
177
|
|
|
148
|
-
|
|
178
|
+
## Version 2025.12.11
|
|
149
179
|
- Add more bubble help messages in Create Case
|
|
150
180
|
- Fix bug in rates selection UI
|
|
151
181
|
- Remove reliance on GitHub for graphics and example files
|
|
152
182
|
- Update UI to use new file locations
|
|
153
183
|
- Add new owl.png logo
|
|
154
184
|
|
|
155
|
-
|
|
185
|
+
## Version 2025.12.10
|
|
156
186
|
- Add date of birth due to social security rules when birthday on 1st and 2nd
|
|
157
187
|
- Modify FRA calculations accordingly
|
|
158
188
|
- Add integration to ssa.tools
|
|
159
189
|
- Add Dale's help message for date of birth
|
|
160
190
|
|
|
161
|
-
|
|
191
|
+
## Version 2025.12.09
|
|
162
192
|
- Improve instructions for developers
|
|
163
193
|
- Add link to ssa.tools on Fixed Income page
|
|
164
194
|
- Fix bug on max age range for SS when month != 0
|
|
165
195
|
- Add table of federal income tax itemized by bracket
|
|
166
196
|
- Improve instructions for ssa.tools
|
|
167
197
|
|
|
168
|
-
|
|
198
|
+
## Version 2025.12.05
|
|
169
199
|
- Add instructions for obtaining PIA
|
|
170
200
|
- Enhance documentation for obtaining PIA
|
|
171
201
|
- Add generic reference for PIA calculation
|
|
@@ -173,7 +203,7 @@
|
|
|
173
203
|
- Fix error in month input
|
|
174
204
|
- Add hint for birth month
|
|
175
205
|
|
|
176
|
-
|
|
206
|
+
## Version 2025.12.03
|
|
177
207
|
- Code Social Security to use monthly PIA instead of annual amount
|
|
178
208
|
- Add exact routines for FRA and increase/decrease factors due to claiming age
|
|
179
209
|
- Add exact spousal benefits
|
|
@@ -187,7 +217,7 @@
|
|
|
187
217
|
- Add caveat on account allocation ratios in documentation
|
|
188
218
|
- Fix typo in documentation
|
|
189
219
|
|
|
190
|
-
|
|
220
|
+
## Version 2025.11.09
|
|
191
221
|
- Move development status to production/stable in pyproject
|
|
192
222
|
- Make version propagate everywhere needed
|
|
193
223
|
- Add node limit on MILP to avoid Streamlit server shutdown on memory consumption
|
|
@@ -209,7 +239,7 @@
|
|
|
209
239
|
- Fix graph settings
|
|
210
240
|
- Make case naming consistent
|
|
211
241
|
|
|
212
|
-
|
|
242
|
+
## Version 2025.07.01
|
|
213
243
|
- Add settings option for menu position (top or sidebar) thanks to Streamlit 1.46
|
|
214
244
|
- Default is top menu
|
|
215
245
|
- Add Net Investment Income Tax calculations in self-consistent loop
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## A retirement exploration tool based on linear programming
|
|
4
4
|
|
|
5
|
-
<img align=right src="https://github.com/mdlacasse/Owl/blob/main/
|
|
5
|
+
<img align=right src="https://github.com/mdlacasse/Owl/blob/main/papers/images/owl.png?raw=true" width="250">
|
|
6
6
|
|
|
7
7
|
------------------------------------------------------------------------------------
|
|
8
8
|
### About
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## A retirement exploration tool based on linear programming
|
|
4
4
|
|
|
5
|
-
<img align=right src="https://raw.github.com/mdlacasse/Owl/main/
|
|
5
|
+
<img align=right src="https://raw.github.com/mdlacasse/Owl/main/papers/images/owl.png" width="250">
|
|
6
6
|
|
|
7
7
|
------------------------------------------------------------------------------------
|
|
8
8
|
### About
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
case_name = "Alex+Jamie"
|
|
2
|
+
description = "A case where there is big difference in longevity."
|
|
3
|
+
|
|
4
|
+
[basic_info]
|
|
5
|
+
status = "married"
|
|
6
|
+
names = [ "Alex", "Jamie",]
|
|
7
|
+
date_of_birth = [ "1960-01-15", "1961-01-17",]
|
|
8
|
+
life_expectancy = [ 72, 90,]
|
|
9
|
+
start_date = "2026-01-01"
|
|
10
|
+
|
|
11
|
+
[savings_assets]
|
|
12
|
+
taxable_savings_balances = [ 500.0, 200.0,]
|
|
13
|
+
tax_deferred_savings_balances = [ 1500.0, 400.0,]
|
|
14
|
+
tax_free_savings_balances = [ 50.0, 40.0,]
|
|
15
|
+
beneficiary_fractions = [ 1.0, 1.0, 1.0,]
|
|
16
|
+
spousal_surplus_deposit_fraction = 0.5
|
|
17
|
+
|
|
18
|
+
[household_financial_profile]
|
|
19
|
+
HFP_file_name = "dictionary of DataFrames"
|
|
20
|
+
|
|
21
|
+
[fixed_income]
|
|
22
|
+
pension_monthly_amounts = [ 0, 0,]
|
|
23
|
+
pension_ages = [ 65.0, 65.0,]
|
|
24
|
+
pension_indexed = [ false, false,]
|
|
25
|
+
social_security_pia_amounts = [ 3000, 1200,]
|
|
26
|
+
social_security_ages = [ 69.0, 62.083333333333336,]
|
|
27
|
+
|
|
28
|
+
[rates_selection]
|
|
29
|
+
heirs_rate_on_tax_deferred_estate = 30.0
|
|
30
|
+
dividend_rate = 1.72
|
|
31
|
+
obbba_expiration_year = 2032
|
|
32
|
+
method = "user"
|
|
33
|
+
values = [ 7.000000000000001, 4.0, 3.3000000000000003, 2.8,]
|
|
34
|
+
from = 1928
|
|
35
|
+
to = 2025
|
|
36
|
+
|
|
37
|
+
[asset_allocation]
|
|
38
|
+
interpolation_method = "linear"
|
|
39
|
+
interpolation_center = 15.0
|
|
40
|
+
interpolation_width = 5.0
|
|
41
|
+
type = "individual"
|
|
42
|
+
generic = [ [ [ 60, 40, 0, 0,], [ 60, 40, 0, 0,],], [ [ 60, 40, 0, 0,], [ 60, 40, 0, 0,],],]
|
|
43
|
+
|
|
44
|
+
[optimization_parameters]
|
|
45
|
+
spending_profile = "flat"
|
|
46
|
+
surviving_spouse_spending_percent = 60
|
|
47
|
+
objective = "maxSpending"
|
|
48
|
+
|
|
49
|
+
[solver_options]
|
|
50
|
+
maxRothConversion = 400.0
|
|
51
|
+
noRothConversions = "None"
|
|
52
|
+
startRothConversions = 2026
|
|
53
|
+
bequest = 0
|
|
54
|
+
solver = "HiGHS"
|
|
55
|
+
spendingSlack = 0
|
|
56
|
+
amoRoth = true
|
|
57
|
+
amoSurplus = true
|
|
58
|
+
withSCLoop = true
|
|
59
|
+
withMedicare = "loop"
|
|
60
|
+
noLateSurplus = false
|
|
61
|
+
previousMAGIs = [ 200.0, 200.0,]
|
|
62
|
+
|
|
63
|
+
[results]
|
|
64
|
+
default_plots = "today"
|
|
@@ -48,10 +48,10 @@ objective = "maxBequest"
|
|
|
48
48
|
netSpending = 80.0
|
|
49
49
|
maxRothConversion = 50
|
|
50
50
|
startRothConversions = 2025
|
|
51
|
-
withMedicare = "None"
|
|
52
51
|
solver = "HiGHS"
|
|
53
52
|
spendingSlack = 0
|
|
54
53
|
withSCLoop = false
|
|
54
|
+
withMedicare = "None"
|
|
55
55
|
|
|
56
56
|
[results]
|
|
57
57
|
default_plots = "today"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
case_name = "jack+jill"
|
|
2
|
-
description = "This example aims to demonstrate some of Owl's capabilities. Jack and Jill are a married couple a few years from retirement. A
|
|
2
|
+
description = "This example aims to demonstrate some of Owl's capabilities. Jack and Jill are a married couple a few years from retirement. A Household Financial Profile called 'HFP_jack+jill.xlsx' is associated with this case. This case uses the historical rate sequence of 1969 as a test case for guiding spending amounts from a near worst-case historical scenario. This case also demonstrates that the optimal strategy for Roth conversions does not necessarily involve surfing a tax bracket. \nA good exercise for learning Owl's capabilities is to duplicate this case and compare two scenarios: one with optimized Roth conversions and one without. Another possible exercise could involve comparing a historical retirement in 1969 vs. one taken in 1966. Or anything else you can think of..."
|
|
3
3
|
|
|
4
4
|
[basic_info]
|
|
5
5
|
status = "married"
|
|
@@ -52,11 +52,11 @@ objective = "maxSpending"
|
|
|
52
52
|
maxRothConversion = 100
|
|
53
53
|
noRothConversions = "Jill"
|
|
54
54
|
startRothConversions = 2025
|
|
55
|
+
withSCLoop = true
|
|
55
56
|
withMedicare = "loop"
|
|
56
57
|
bequest = 400
|
|
57
58
|
solver = "HiGHS"
|
|
58
59
|
spendingSlack = 0
|
|
59
|
-
withSCLoop = true
|
|
60
60
|
|
|
61
61
|
[results]
|
|
62
62
|
default_plots = "today"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
case_name = "joe"
|
|
2
|
-
description = "This is an example of a case involving a single individual. Joe is single and will retire in a few years. His wages and contributions are contained in the '
|
|
2
|
+
description = "This is an example of a case involving a single individual. Joe is single and will retire in a few years. His wages and contributions are contained in the 'HFP_joe.xlsx' Household Financial Profile."
|
|
3
3
|
|
|
4
4
|
[basic_info]
|
|
5
5
|
status = "single"
|
|
@@ -50,6 +50,8 @@ objective = "maxSpending"
|
|
|
50
50
|
maxRothConversion = 50
|
|
51
51
|
startRothConversions = 2025
|
|
52
52
|
bequest = 300
|
|
53
|
+
withSCLoop = true
|
|
54
|
+
withMedicare = "loop"
|
|
53
55
|
|
|
54
56
|
[results]
|
|
55
57
|
default_plots = "nominal"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
case_name = "john+sally"
|
|
2
|
-
description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak. This case can be used to compare the heuristic strategy of surfing a tax bracket for performing Roth conversions to a solution optimized by linear programming. The former is a good approach when one assumes fixed rates. When rates are varying, and the market drops, an optimized solution shows that it is sometime advantageous to convert above the target tax bracket. File '
|
|
2
|
+
description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak. This case can be used to compare the heuristic strategy of surfing a tax bracket for performing Roth conversions to a solution optimized by linear programming. The former is a good approach when one assumes fixed rates. When rates are varying, and the market drops, an optimized solution shows that it is sometime advantageous to convert above the target tax bracket. File 'HFP_john+sally.xlsx' contains wages and contributions associated with this case. Run this case with different rates to see the effects on Roth conversions."
|
|
3
3
|
|
|
4
4
|
[basic_info]
|
|
5
5
|
status = "married"
|
|
@@ -50,10 +50,10 @@ netSpending = 100
|
|
|
50
50
|
maxRothConversion = 200
|
|
51
51
|
noRothConversions = "None"
|
|
52
52
|
startRothConversions = 2025
|
|
53
|
+
withSCLoop = true
|
|
53
54
|
withMedicare = "loop"
|
|
54
55
|
solver = "HiGHS"
|
|
55
56
|
spendingSlack = 0
|
|
56
|
-
withSCLoop = true
|
|
57
57
|
|
|
58
58
|
[results]
|
|
59
59
|
default_plots = "today"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
case_name = "Jon+Jane"
|
|
2
|
-
description = "This case reproduces a similar case discussed a while back on i-orp. It involves Jon and Jane close to retirement, and assumes a base case of optimistic returns of 10% with an inflation of 3.5%. A
|
|
2
|
+
description = "This case reproduces a similar case discussed a while back on i-orp. It involves Jon and Jane close to retirement, and assumes a base case of optimistic returns of 10% with an inflation of 3.5%. A Household Financial Profile called 'HFP_jon+jane.xlsx' is associated with this case."
|
|
3
3
|
|
|
4
4
|
[basic_info]
|
|
5
5
|
status = "married"
|
|
@@ -50,11 +50,11 @@ objective = "maxSpending"
|
|
|
50
50
|
maxRothConversion = 0.0
|
|
51
51
|
noRothConversions = "None"
|
|
52
52
|
startRothConversions = 2025
|
|
53
|
-
withMedicare = "loop"
|
|
54
53
|
bequest = 30.0
|
|
55
54
|
solver = "HiGHS"
|
|
56
55
|
spendingSlack = 0
|
|
57
56
|
withSCLoop = true
|
|
57
|
+
withMedicare = "loop"
|
|
58
58
|
|
|
59
59
|
[results]
|
|
60
60
|
default_plots = "today"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
case_name = "kim+sam-bequest"
|
|
2
|
-
description = "This is the case of Kim and Sam used as an example case for optimizing bequest and Roth conversions. A
|
|
2
|
+
description = "This is the case of Kim and Sam used as an example case for optimizing bequest and Roth conversions. A Household Financial Profile called 'HFP_kim+sam.xslx' is associated with this case."
|
|
3
3
|
|
|
4
4
|
[basic_info]
|
|
5
5
|
status = "married"
|
|
@@ -54,10 +54,10 @@ netSpending = 145
|
|
|
54
54
|
maxRothConversion = 100
|
|
55
55
|
noRothConversions = "None"
|
|
56
56
|
startRothConversions = 2026
|
|
57
|
-
withMedicare = "loop"
|
|
58
57
|
solver = "HiGHS"
|
|
59
58
|
spendingSlack = 0
|
|
60
59
|
withSCLoop = true
|
|
60
|
+
withMedicare = "loop"
|
|
61
61
|
|
|
62
62
|
[results]
|
|
63
63
|
default_plots = "today"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
case_name = "kim+sam-spending"
|
|
2
|
-
description = "This is the case of Kim and Sam used as an example case for optimizing spending and Roth conversions.
|
|
2
|
+
description = "This is the case of Kim and Sam used as an example case for optimizing spending and Roth conversions. A Household Financial Profile called 'HFP-kim+sam.xslx' is associated with this case."
|
|
3
3
|
|
|
4
4
|
[basic_info]
|
|
5
5
|
status = "married"
|
|
@@ -53,11 +53,11 @@ objective = "maxSpending"
|
|
|
53
53
|
maxRothConversion = 100
|
|
54
54
|
noRothConversions = "None"
|
|
55
55
|
startRothConversions = 2026
|
|
56
|
-
withMedicare = "loop"
|
|
57
56
|
bequest = 0
|
|
58
57
|
solver = "HiGHS"
|
|
59
58
|
spendingSlack = 0
|
|
60
59
|
withSCLoop = true
|
|
60
|
+
withMedicare = "loop"
|
|
61
61
|
|
|
62
62
|
[results]
|
|
63
63
|
default_plots = "today"
|
|
Binary file
|