owlplanner 2025.12.20__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-2025.12.20 → owlplanner-2026.2.2}/.github/workflows/github-actions-runtests.yml +1 -1
- owlplanner-2026.2.2/.gitignore +91 -0
- owlplanner-2026.2.2/.streamlit/config.toml +3 -0
- owlplanner-2026.2.2/AUTHORS +15 -0
- owlplanner-2026.2.2/Adamodar_Rates_2026.xlsx +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/INSTALL.md +1 -1
- owlplanner-2026.2.2/PARAMETERS.md +295 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/PKG-INFO +11 -3
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/README.md +7 -2
- owlplanner-2026.2.2/RELEASE_NOTES.md +259 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/USER_GUIDE.md +90 -36
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/README.md +1 -1
- owlplanner-2026.2.2/docker/buildContainers.sh +8 -0
- owlplanner-2026.2.2/docs/papers +1 -0
- owlplanner-2026.2.2/examples/Case_alex+jamie.toml +64 -0
- owlplanner-2026.2.2/examples/Case_drawdowncalc-comparison-1.toml +57 -0
- owlplanner-2026.2.2/examples/Case_jack+jill.toml +62 -0
- owlplanner-2026.2.2/examples/Case_joe.toml +57 -0
- owlplanner-2026.2.2/examples/Case_john+sally.toml +59 -0
- owlplanner-2026.2.2/examples/Case_jon+jane.toml +60 -0
- owlplanner-2026.2.2/examples/Case_kim+sam-bequest.toml +63 -0
- owlplanner-2026.2.2/examples/Case_kim+sam-spending.toml +63 -0
- owlplanner-2026.2.2/examples/HFP_jack+jill.xlsx +0 -0
- owlplanner-2026.2.2/examples/HFP_jack+jill_house.xlsx +0 -0
- owlplanner-2026.2.2/examples/HFP_joe.xlsx +0 -0
- owlplanner-2026.2.2/examples/HFP_john+sally.xlsx +0 -0
- owlplanner-2026.2.2/examples/HFP_jon+jane.xlsx +0 -0
- owlplanner-2026.2.2/examples/HFP_kim+sam.xlsx +0 -0
- owlplanner-2026.2.2/examples/HFP_template.xlsx +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/notebooks/john+sally.ipynb +2 -2
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/notebooks/kim+sam.ipynb +2 -2
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/notebooks/template.ipynb +2 -1
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/notebooks/tutorial_1.ipynb +2 -1
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/notebooks/tutorial_2.ipynb +2 -1
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/notebooks/tutorial_3.ipynb +2 -1
- owlplanner-2026.2.2/papers/owl.pdf +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/owl.tex +517 -292
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/pyproject.toml +6 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/pytest.ini +3 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/requirements.txt +2 -1
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/README.md +1 -1
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/index.qmd +2 -2
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/install-uv.qmd +9 -9
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/installation.qmd +2 -2
- owlplanner-2026.2.2/src/owlplanner/__init__.py +27 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/abcapi.py +18 -17
- owlplanner-2026.2.2/src/owlplanner/cli/README.md +50 -0
- owlplanner-2026.2.2/src/owlplanner/cli/_main.py +52 -0
- owlplanner-2026.2.2/src/owlplanner/cli/cli_logging.py +56 -0
- owlplanner-2026.2.2/src/owlplanner/cli/cmd_list.py +83 -0
- owlplanner-2026.2.2/src/owlplanner/cli/cmd_run.py +86 -0
- owlplanner-2026.2.2/src/owlplanner/config.py +512 -0
- owlplanner-2026.2.2/src/owlplanner/data/__init__.py +21 -0
- owlplanner-2026.2.2/src/owlplanner/data/rates.csv +99 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/debts.py +36 -8
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/fixedassets.py +95 -21
- owlplanner-2026.2.2/src/owlplanner/mylogging.py +216 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/plan.py +938 -390
- owlplanner-2026.2.2/src/owlplanner/plotting/__init__.py +25 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/plotting/base.py +17 -3
- owlplanner-2026.2.2/src/owlplanner/plotting/factory.py +50 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/plotting/matplotlib_backend.py +30 -7
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/plotting/plotly_backend.py +32 -9
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/progress.py +16 -3
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/rates.py +50 -34
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/socialsecurity.py +28 -19
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/tax2026.py +119 -38
- owlplanner-2026.2.2/src/owlplanner/timelists.py +406 -0
- owlplanner-2026.2.2/src/owlplanner/utils.py +302 -0
- owlplanner-2026.2.2/src/owlplanner/version.py +20 -0
- owlplanner-2026.2.2/tests/test_abcapi_coverage.py +305 -0
- owlplanner-2026.2.2/tests/test_config_coverage.py +340 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/tests/test_debts.py +22 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/tests/test_fixedassets.py +331 -3
- owlplanner-2026.2.2/tests/test_historical.py +84 -0
- owlplanner-2026.2.2/tests/test_logger.py +49 -0
- owlplanner-2026.2.2/tests/test_ltcg.py +45 -0
- owlplanner-2026.2.2/tests/test_mc.py +65 -0
- owlplanner-2026.2.2/tests/test_medicare.py +92 -0
- owlplanner-2026.2.2/tests/test_mylogging_coverage.py +287 -0
- owlplanner-2026.2.2/tests/test_plan_edge_cases.py +426 -0
- owlplanner-2026.2.2/tests/test_rates.py +514 -0
- owlplanner-2026.2.2/tests/test_rates_reverse_roll.py +275 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/tests/test_regressions.py +41 -8
- owlplanner-2026.2.2/tests/test_repro.py +250 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/tests/test_socsec.py +22 -0
- owlplanner-2026.2.2/tests/test_summary.py +271 -0
- owlplanner-2026.2.2/tests/test_timelists.py +410 -0
- owlplanner-2026.2.2/tests/test_timelists_coverage.py +364 -0
- owlplanner-2026.2.2/tests/test_toml_cases.py +166 -0
- owlplanner-2026.2.2/tests/test_ui_asset_allocation.py +36 -0
- owlplanner-2026.2.2/tests/test_ui_compare_summaries.py +40 -0
- owlplanner-2026.2.2/tests/test_ui_sskeys.py +45 -0
- owlplanner-2026.2.2/tests/test_units.py +31 -0
- owlplanner-2026.2.2/tests/test_utils_coverage.py +283 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/About_Owl.py +31 -5
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Asset_Allocation.py +24 -1
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Create_Case.py +90 -21
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Documentation.py +293 -147
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Fixed_Income.py +60 -22
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Graphs.py +23 -1
- owlplanner-2026.2.2/ui/Historical_Range.py +89 -0
- owlplanner-2026.2.2/ui/Household_Financial_Profile.py +305 -0
- owlplanner-2026.2.2/ui/Logs.py +113 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Monte_Carlo.py +24 -2
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Optimization_Parameters.py +77 -31
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Output_Files.py +24 -2
- owlplanner-2026.2.2/ui/Parameters_Reference.py +37 -0
- owlplanner-2026.2.2/ui/Quick_Start.py +171 -0
- owlplanner-2026.2.2/ui/Rates_Selection.py +339 -0
- owlplanner-2026.2.2/ui/Savings_Assets.py +106 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/Settings.py +22 -0
- owlplanner-2026.2.2/ui/Worksheets.py +41 -0
- owlplanner-2026.2.2/ui/__init__.py +21 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/case_progress.py +43 -15
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/main.py +26 -5
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/owlbridge.py +282 -63
- owlplanner-2026.2.2/ui/progress.py +46 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/sskeys.py +126 -58
- owlplanner-2026.2.2/ui/tomlexamples.py +104 -0
- owlplanner-2025.12.20/.gitignore +0 -11
- owlplanner-2025.12.20/.streamlit/config.toml +0 -3
- owlplanner-2025.12.20/RELEASE_NOTES.md +0 -72
- owlplanner-2025.12.20/docs/papers/owl.pdf +0 -0
- owlplanner-2025.12.20/examples/Case_jack+jill.toml +0 -57
- owlplanner-2025.12.20/examples/Case_joe.toml +0 -54
- owlplanner-2025.12.20/examples/Case_john+sally.toml +0 -53
- owlplanner-2025.12.20/examples/Case_jon+jane.toml +0 -56
- owlplanner-2025.12.20/examples/Case_kim+sam-bequest.toml +0 -56
- owlplanner-2025.12.20/examples/Case_kim+sam-spending.toml +0 -56
- owlplanner-2025.12.20/examples/HFP_jack+jill.xlsx +0 -0
- owlplanner-2025.12.20/examples/HFP_jack+jill_house.xlsx +0 -0
- owlplanner-2025.12.20/examples/HFP_joe.xlsx +0 -0
- owlplanner-2025.12.20/examples/HFP_john+sally.xlsx +0 -0
- owlplanner-2025.12.20/examples/HFP_jon+jane.xlsx +0 -0
- owlplanner-2025.12.20/examples/HFP_kim+sam.xlsx +0 -0
- owlplanner-2025.12.20/examples/HFP_template.xlsx +0 -0
- owlplanner-2025.12.20/examples/case_drawdowncalc-comparison-1.toml +0 -57
- owlplanner-2025.12.20/papers/owl.pdf +0 -0
- owlplanner-2025.12.20/paste.py +0 -68
- owlplanner-2025.12.20/site-src/papers/images/AD-taxDef.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/AD-taxFree.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/AD-taxable.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/Hist_Bequest.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/Hist_Spending.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/MC-tutorial2a.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/MC-tutorial2b.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/OwlUI.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/allocations.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/piecewiseConstant.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/profile.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/ratesCorrelations.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/ratesPlot.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/savingsPlot.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/sourcesPlot.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/spendingPlot.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/taxIncomePlot.png +0 -0
- owlplanner-2025.12.20/site-src/papers/images/taxesPlot.png +0 -0
- owlplanner-2025.12.20/site-src/papers/owl.pdf +0 -0
- owlplanner-2025.12.20/site-src/papers/owl.tex +0 -1552
- owlplanner-2025.12.20/src/owlplanner/__init__.py +0 -8
- owlplanner-2025.12.20/src/owlplanner/config.py +0 -315
- owlplanner-2025.12.20/src/owlplanner/data/__init__.py +0 -0
- owlplanner-2025.12.20/src/owlplanner/data/rates.csv +0 -98
- owlplanner-2025.12.20/src/owlplanner/mylogging.py +0 -84
- owlplanner-2025.12.20/src/owlplanner/plotting/__init__.py +0 -12
- owlplanner-2025.12.20/src/owlplanner/plotting/factory.py +0 -37
- owlplanner-2025.12.20/src/owlplanner/tax2025.py +0 -359
- owlplanner-2025.12.20/src/owlplanner/timelists.py +0 -230
- owlplanner-2025.12.20/src/owlplanner/utils.py +0 -127
- owlplanner-2025.12.20/src/owlplanner/version.py +0 -1
- owlplanner-2025.12.20/tests/test_logger.py +0 -21
- owlplanner-2025.12.20/tests/test_repro.py +0 -125
- owlplanner-2025.12.20/tests/test_toml_cases.py +0 -57
- owlplanner-2025.12.20/tests/test_ui_asset_allocation.py +0 -14
- owlplanner-2025.12.20/tests/test_ui_compare_summaries.py +0 -18
- owlplanner-2025.12.20/tests/test_ui_sskeys.py +0 -24
- owlplanner-2025.12.20/tests/test_units.py +0 -11
- owlplanner-2025.12.20/ui/AI +0 -48
- owlplanner-2025.12.20/ui/Historical_Range.py +0 -52
- owlplanner-2025.12.20/ui/Household_Financial_Profile.py +0 -259
- owlplanner-2025.12.20/ui/Logs.py +0 -14
- owlplanner-2025.12.20/ui/NewDocumentation.py +0 -987
- owlplanner-2025.12.20/ui/Quick_Start.py +0 -89
- owlplanner-2025.12.20/ui/Rates_Selection.py +0 -262
- owlplanner-2025.12.20/ui/Savings_Assets.py +0 -83
- owlplanner-2025.12.20/ui/Worksheets.py +0 -19
- owlplanner-2025.12.20/ui/__init__.py +0 -0
- owlplanner-2025.12.20/ui/owl.png +0 -0
- owlplanner-2025.12.20/ui/progress.py +0 -29
- owlplanner-2025.12.20/ui/tomlexamples.py +0 -34
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/.flake8 +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/.gitattributes +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/.streamlit/fullconfig.toml +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/LICENSE +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/awi.txt +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/Dockerfile.bare +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/Dockerfile.static +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/buildContainers.cmd +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/buildPackage.cmd +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/buildPackage.sh +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/buildentrypoint.sh +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docker/runentrypoint.sh +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/examples/example-1.html +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/index.html +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/install-uv.html +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/installation.html +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/search.json +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-45a48b56c8ad2523a9a31c69be39928e.min.css +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-icons.css +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-icons.woff +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap.min.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/clipboard/clipboard.min.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/anchor.min.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/axe/axe-check.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/popper.min.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/quarto.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tabsets/tabsets.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tippy.css +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tippy.umd.min.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-nav/headroom.min.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-nav/quarto-nav.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/autocomplete.umd.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/fuse.min.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/quarto-search.js +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/docs/users_guide.html +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/owlplanner.cmd +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/owlplanner.sh +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/AD-taxDef.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/AD-taxFree.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/AD-taxable.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/Hist_Spending.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/OwlUI.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/allocations.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/owl.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/piecewiseConstant.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/profile.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/ratesPlot.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/savingsPlot.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/sourcesPlot.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/spendingPlot.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/papers/images/taxesPlot.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/.gitignore +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/_quarto.yml +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/assets/owl.png +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/examples/example-1.qmd +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/examples/workbook_jack & jill - tutorial.xlsx +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/site-src/users_guide.qmd +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/data/awi.csv +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/data/bendpoints.csv +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/src/owlplanner/data/newawi.csv +0 -0
- {owlplanner-2025.12.20 → owlplanner-2026.2.2}/ui/README.md +0 -0
- {owlplanner-2025.12.20/site-src/papers/images → owlplanner-2026.2.2/ui}/owl.png +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# --------------------------------------------------
|
|
2
|
+
# Python
|
|
3
|
+
# --------------------------------------------------
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.py[cod]
|
|
6
|
+
*.so
|
|
7
|
+
.coverage
|
|
8
|
+
.coverage.*
|
|
9
|
+
.pytest_cache/
|
|
10
|
+
.mypy_cache/
|
|
11
|
+
.ruff_cache/
|
|
12
|
+
|
|
13
|
+
# --------------------------------------------------
|
|
14
|
+
# Virtual environments
|
|
15
|
+
# --------------------------------------------------
|
|
16
|
+
.venv/
|
|
17
|
+
venv/
|
|
18
|
+
.env/
|
|
19
|
+
|
|
20
|
+
# --------------------------------------------------
|
|
21
|
+
# Conda (optional developer use)
|
|
22
|
+
# --------------------------------------------------
|
|
23
|
+
.conda/
|
|
24
|
+
conda-meta/
|
|
25
|
+
*.conda
|
|
26
|
+
*.conda-lock
|
|
27
|
+
environment.lock.yml
|
|
28
|
+
|
|
29
|
+
# --------------------------------------------------
|
|
30
|
+
# uv / packaging
|
|
31
|
+
# --------------------------------------------------
|
|
32
|
+
dist/
|
|
33
|
+
build/
|
|
34
|
+
*.egg-info/
|
|
35
|
+
|
|
36
|
+
# IMPORTANT:
|
|
37
|
+
# uv.lock IS TRACKED (do not ignore) but...
|
|
38
|
+
# Left there for now to prevent Streamlit lock down
|
|
39
|
+
# Added before building packages in docker/scripts
|
|
40
|
+
uv.lock
|
|
41
|
+
|
|
42
|
+
# --------------------------------------------------
|
|
43
|
+
# Quarto
|
|
44
|
+
# --------------------------------------------------
|
|
45
|
+
.quarto/
|
|
46
|
+
*_cache/
|
|
47
|
+
*_files/
|
|
48
|
+
|
|
49
|
+
# --------------------------------------------------
|
|
50
|
+
# Jupyter
|
|
51
|
+
# --------------------------------------------------
|
|
52
|
+
.ipynb_checkpoints/
|
|
53
|
+
|
|
54
|
+
# --------------------------------------------------
|
|
55
|
+
# Streamlit
|
|
56
|
+
# --------------------------------------------------
|
|
57
|
+
.streamlit/secrets.toml
|
|
58
|
+
|
|
59
|
+
# --------------------------------------------------
|
|
60
|
+
# dotenv / secrets
|
|
61
|
+
# --------------------------------------------------
|
|
62
|
+
.env
|
|
63
|
+
.env.*
|
|
64
|
+
!.env.example
|
|
65
|
+
|
|
66
|
+
# --------------------------------------------------
|
|
67
|
+
# Logs & temporary files
|
|
68
|
+
# --------------------------------------------------
|
|
69
|
+
*.log
|
|
70
|
+
*.aux
|
|
71
|
+
*~
|
|
72
|
+
|
|
73
|
+
# --------------------------------------------------
|
|
74
|
+
# OS / editor noise
|
|
75
|
+
# --------------------------------------------------
|
|
76
|
+
.DS_Store
|
|
77
|
+
Thumbs.db
|
|
78
|
+
*.swp
|
|
79
|
+
*.swo
|
|
80
|
+
|
|
81
|
+
# --------------------------------------------------
|
|
82
|
+
# Project-specific ignored folders
|
|
83
|
+
# --------------------------------------------------
|
|
84
|
+
otherFiles/
|
|
85
|
+
myfiles/
|
|
86
|
+
secrets/
|
|
87
|
+
|
|
88
|
+
# --------------------------------------------------
|
|
89
|
+
# GitHub Pages
|
|
90
|
+
# --------------------------------------------------
|
|
91
|
+
# docs/ IS TRACKED (Quarto output)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# This is the list of Owlplanner's significant contributors.
|
|
2
|
+
#
|
|
3
|
+
# This does not necessarily list everyone who has contributed code.
|
|
4
|
+
# To see the full list of contributors, see the revision history in
|
|
5
|
+
# source control.
|
|
6
|
+
Martin-D. Lacasse (mdlacasse, original author)
|
|
7
|
+
Robert E. Anderson (NH-RedAnt)
|
|
8
|
+
Clark Jefcoat (hubcity)
|
|
9
|
+
kg333
|
|
10
|
+
John Leonard (jleonard99)
|
|
11
|
+
Benjamin Quinn (blquinn)
|
|
12
|
+
Dale Seng (sengsational)
|
|
13
|
+
Josh Williams (noimjosh)
|
|
14
|
+
Gene Wood (gene1wood)
|
|
15
|
+
|
|
Binary file
|
|
@@ -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
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# Owl Parameters
|
|
2
|
+
|
|
3
|
+
This document describes all parameters used in Owl TOML configuration files. The TOML file structure is organized into sections for clarity, and can be consumed by both the UI and CLI applications.
|
|
4
|
+
|
|
5
|
+
**Note:** Throughout this document, `N_i` refers to the number of individuals in the plan (1 for single, 2 for married).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Root Level Parameters
|
|
10
|
+
|
|
11
|
+
These parameters are defined at the root level of the TOML file (not within any section).
|
|
12
|
+
|
|
13
|
+
| Parameter | Type | Description |
|
|
14
|
+
|-----------|------|-------------|
|
|
15
|
+
| `case_name` | string | Name of the case/plan |
|
|
16
|
+
| `description` | string | A short text describing the purpose of the case |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## [basic_info]
|
|
21
|
+
|
|
22
|
+
Basic information about the individuals in the plan.
|
|
23
|
+
|
|
24
|
+
| Parameter | Type | Description |
|
|
25
|
+
|-----------|------|-------------|
|
|
26
|
+
| `status` | string | Filing status. Valid values: `"single"`, `"married"` |
|
|
27
|
+
| `names` | list of strings | Names of the individuals in the plan. Must contain 1 or 2 names. Length determines `N_i` |
|
|
28
|
+
| `date_of_birth` | list of `N_i` ISO dates | Date of birth for each individual in ISO format (e.g., `"1967-01-15"`). Defaults to `"1965-01-15"` if not specified |
|
|
29
|
+
| `life_expectancy` | list of `N_i` integers | Life expectancy in years for each individual |
|
|
30
|
+
| `start_date` | string | Start date of the plan (e.g., `"01-01"`, `"01/01"`, `"2026-01-01"`). Only the month and day are used; the plan always starts in the current year. Defaults to `"today"` if not specified |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## [savings_assets]
|
|
35
|
+
|
|
36
|
+
Initial account balances and beneficiary information.
|
|
37
|
+
|
|
38
|
+
| Parameter | Type | Description |
|
|
39
|
+
|-----------|------|-------------|
|
|
40
|
+
| `taxable_savings_balances` | list of `N_i` floats | Initial balance in taxable accounts for each individual (in thousands of dollars) |
|
|
41
|
+
| `tax_deferred_savings_balances` | list of `N_i` floats | Initial balance in tax-deferred accounts (e.g., 401k, traditional IRA) for each individual (in thousands of dollars) |
|
|
42
|
+
| `tax_free_savings_balances` | list of `N_i` floats | Initial balance in tax-free accounts (e.g., Roth IRA, Roth 401k) for each individual (in thousands of dollars) |
|
|
43
|
+
| `beneficiary_fractions` | list of 3 floats | *(Married only)* Fraction of each account type (taxable, tax-deferred, tax-free) bequeathed to the surviving spouse. Each value should be between 0.0 and 1.0 |
|
|
44
|
+
| `spousal_surplus_deposit_fraction` | float | *(Married only)* Fraction of surplus to deposit in the second spouse's taxable account. Value between 0.0 and 1.0 |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## [household_financial_profile]
|
|
49
|
+
|
|
50
|
+
Reference to the Excel file containing wages, contributions, and other time-varying financial data.
|
|
51
|
+
|
|
52
|
+
| Parameter | Type | Description |
|
|
53
|
+
|-----------|------|-------------|
|
|
54
|
+
| `HFP_file_name` | string | Name of the Excel file (`.xlsx`) containing wages, contributions, Roth conversions, and big-ticket items. Use `"None"` if no file is associated with the case |
|
|
55
|
+
|
|
56
|
+
**Note:** The Excel file should contain one sheet per individual with columns for: year, anticipated wages, taxable contributions, 401k contributions, Roth 401k contributions, IRA contributions, Roth IRA contributions, Roth conversions, and big-ticket items.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## [fixed_income]
|
|
61
|
+
|
|
62
|
+
Pension and Social Security information.
|
|
63
|
+
|
|
64
|
+
| Parameter | Type | Description |
|
|
65
|
+
|-----------|------|-------------|
|
|
66
|
+
| `pension_monthly_amounts` | list of `N_i` floats | Monthly pension amount for each individual (in dollars). Use `0` if no pension |
|
|
67
|
+
| `pension_ages` | list of `N_i` floats | Age at which pension starts for each individual |
|
|
68
|
+
| `pension_indexed` | list of `N_i` booleans | Whether each pension is indexed for inflation |
|
|
69
|
+
| `social_security_pia_amounts` | list of `N_i` integers | Primary Insurance Amount (PIA) for Social Security for each individual (in dollars) |
|
|
70
|
+
| `social_security_ages` | list of `N_i` floats | Age at which Social Security benefits start for each individual |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## [rates_selection]
|
|
75
|
+
|
|
76
|
+
Investment return rates and inflation assumptions.
|
|
77
|
+
|
|
78
|
+
| Parameter | Type | Description |
|
|
79
|
+
|-----------|------|-------------|
|
|
80
|
+
| `heirs_rate_on_tax_deferred_estate` | float | Tax rate (as percentage, e.g., `30.0` for 30%) that heirs will pay on inherited tax-deferred accounts |
|
|
81
|
+
| `dividend_rate` | float | Dividend rate as a percentage (e.g., `1.72` for 1.72%) |
|
|
82
|
+
| `obbba_expiration_year` | integer | Year when the OBBBA (One Big Beautiful Bill Act) provisions expire. Default is `2032` |
|
|
83
|
+
| `method` | string | Method for determining rates. Valid values: `"default"`, `"optimistic"`, `"conservative"`, `"user"`, `"historical"`, `"historical average"`, `"stochastic"`, `"histochastic"` |
|
|
84
|
+
|
|
85
|
+
### Conditional Parameters Based on `method`
|
|
86
|
+
|
|
87
|
+
#### For `method = "user"` or `"stochastic"`:
|
|
88
|
+
| Parameter | Type | Description |
|
|
89
|
+
|-----------|------|-------------|
|
|
90
|
+
| `values` | list of 4 floats | Fixed rate values as percentages: [S&P 500 return, Corporate Baa bonds return, 10-year Treasury notes return, Inflation rate] |
|
|
91
|
+
|
|
92
|
+
#### For `method = "stochastic"`:
|
|
93
|
+
| Parameter | Type | Description |
|
|
94
|
+
|-----------|------|-------------|
|
|
95
|
+
| `standard_deviations` | list of 4 floats | Standard deviations (as percentages) for each rate type |
|
|
96
|
+
| `correlations` | array | Correlation matrix (4×4) or flattened upper triangle (6 values) for the four rate types |
|
|
97
|
+
|
|
98
|
+
#### For `method = "stochastic"` or `"histochastic"`:
|
|
99
|
+
| Parameter | Type | Description |
|
|
100
|
+
|-----------|------|-------------|
|
|
101
|
+
| `rate_seed` | integer | Random seed for reproducible stochastic rates |
|
|
102
|
+
| `reproducible_rates` | boolean | Whether stochastic rates should be reproducible |
|
|
103
|
+
|
|
104
|
+
#### For `method = "historical"`, `"historical average"`, or `"histochastic"`:
|
|
105
|
+
| Parameter | Type | Description |
|
|
106
|
+
|-----------|------|-------------|
|
|
107
|
+
| `from` | integer | Starting year for historical data range (must be between 1928 and 2025) |
|
|
108
|
+
| `to` | integer | Ending year for historical data range (must be between 1928 and 2025, and greater than `from`) |
|
|
109
|
+
|
|
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.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## [asset_allocation]
|
|
121
|
+
|
|
122
|
+
Asset allocation strategy and how it changes over time.
|
|
123
|
+
|
|
124
|
+
| Parameter | Type | Description |
|
|
125
|
+
|-----------|------|-------------|
|
|
126
|
+
| `interpolation_method` | string | Method for interpolating asset allocation over time. Valid values: `"linear"`, `"s-curve"` |
|
|
127
|
+
| `interpolation_center` | float | Center point of the interpolation curve (in years from start). Ignored for `"linear"` |
|
|
128
|
+
| `interpolation_width` | float | Width of the interpolation curve (in years). Ignored for `"linear"` |
|
|
129
|
+
| `type` | string | Type of allocation strategy. Valid values: `"account"`, `"individual"`, `"spouses"` |
|
|
130
|
+
|
|
131
|
+
### Conditional Parameters Based on `type`
|
|
132
|
+
|
|
133
|
+
#### For `type = "account"`:
|
|
134
|
+
| Parameter | Type | Description |
|
|
135
|
+
|-----------|------|-------------|
|
|
136
|
+
| `taxable` | 3D array | Asset allocation bounds for taxable accounts. Structure: `[[[initial_stocks, initial_bonds, initial_fixed, initial_real_estate], [final_stocks, final_bonds, final_fixed, final_real_estate]]]` for each individual |
|
|
137
|
+
| `tax-deferred` | 3D array | Asset allocation bounds for tax-deferred accounts (same structure as `taxable`) |
|
|
138
|
+
| `tax-free` | 3D array | Asset allocation bounds for tax-free accounts (same structure as `taxable`) |
|
|
139
|
+
|
|
140
|
+
#### For `type = "individual"` or `"spouses"`:
|
|
141
|
+
| Parameter | Type | Description |
|
|
142
|
+
|-----------|------|-------------|
|
|
143
|
+
| `generic` | 3D array | Generic asset allocation bounds. Structure: `[[[initial_stocks, initial_bonds, initial_fixed, initial_real_estate], [final_stocks, final_bonds, final_fixed, final_real_estate]], ...]` for each individual. For single individuals, only one pair is needed |
|
|
144
|
+
|
|
145
|
+
**Note:** All allocation values are percentages that should sum to 100 for each time point. The four asset classes are: stocks, bonds, fixed assets, and real estate.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## [optimization_parameters]
|
|
150
|
+
|
|
151
|
+
Parameters controlling the optimization objective and spending profile.
|
|
152
|
+
|
|
153
|
+
| Parameter | Type | Description |
|
|
154
|
+
|-----------|------|-------------|
|
|
155
|
+
| `spending_profile` | string | Type of spending profile. Valid values: `"flat"`, `"smile"` |
|
|
156
|
+
| `surviving_spouse_spending_percent` | integer | Percentage of spending amount for the surviving spouse (0-100). Default is `60` |
|
|
157
|
+
| `objective` | string | Optimization objective. Valid values: `"maxSpending"`, `"maxBequest"` |
|
|
158
|
+
|
|
159
|
+
### Conditional Parameters for `spending_profile = "smile"`:
|
|
160
|
+
| Parameter | Type | Description |
|
|
161
|
+
|-----------|------|-------------|
|
|
162
|
+
| `smile_dip` | integer | Percentage to decrease spending during the "slow-go" years (0-100). Default is `15` |
|
|
163
|
+
| `smile_increase` | integer | Percentage to increase (or decrease if negative) spending over the time span (-100 to 100). Default is `12` |
|
|
164
|
+
| `smile_delay` | integer | Number of years from the start before spending begins to decrease (0 to plan duration - 2). Default is `0` |
|
|
165
|
+
|
|
166
|
+
**Note:** The "smile" profile creates a spending pattern that starts high, decreases during middle years, and increases again later in retirement.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## [solver_options]
|
|
171
|
+
|
|
172
|
+
Options controlling the optimization solver and constraints.
|
|
173
|
+
|
|
174
|
+
| Parameter | Type | Description | Default |
|
|
175
|
+
|-----------|------|-------------|---------|
|
|
176
|
+
| `absTol` | float | *(Advanced)* Absolute convergence tolerance for the self-consistent loop objective. | `20` |
|
|
177
|
+
| `amoConstraints` | boolean | *(Advanced)* Whether to use at-most-one (AMO) constraints in the optimization. | `true` |
|
|
178
|
+
| `amoRoth` | boolean | *(Advanced)* Whether to enforce at-most-one (AMO) constraints preventing simultaneous Roth conversions and tax-free withdrawals. | `true` |
|
|
179
|
+
| `amoSurplus` | boolean | *(Advanced)* Whether to enforce XOR constraints preventing simultaneous surplus deposits and withdrawals from taxable or tax-free accounts. | `true` |
|
|
180
|
+
| `bequest` | float | Target bequest value in today's dollars (in `units`). Used when `objective = "maxSpending"`. | `1` (if omitted with `maxSpending`) |
|
|
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` |
|
|
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`) |
|
|
184
|
+
| `maxIter` | integer | *(Advanced)* Maximum number of iterations for the self-consistent loop. Must be at least 1. | `29` |
|
|
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 |
|
|
186
|
+
| `maxTime` | float | *(Advanced)* Solver time limit in seconds. | `900` |
|
|
187
|
+
| `netSpending` | float | Target net spending amount in today's dollars (in `units`). Used when `objective = "maxBequest"`. | Required for `maxBequest` |
|
|
188
|
+
| `noLateSurplus` | boolean | Disallow surplus deposits in the final two years of the plan. | `false` |
|
|
189
|
+
| `noRothConversions` | string | Name of individual for whom Roth conversions are disabled, or `"None"` to allow conversions for all. | `"None"` |
|
|
190
|
+
| `oppCostX` | float | *(Advanced)* Opportunity cost applied to Roth conversions (percent). | `0` |
|
|
191
|
+
| `previousMAGIs` | array | *(Advanced)* Two-element list of prior-year MAGI values (in `units`) for Medicare calculations. | `[0, 0]` |
|
|
192
|
+
| `relTol` | float | *(Advanced)* Relative convergence tolerance for the self-consistent loop objective. | `max(1e-6, gap / 300)` |
|
|
193
|
+
| `solver` | string | Solver to use for optimization. Valid values: `"HiGHS"`, `"PuLP/CBC"`, `"PuLP/HiGHS"`, `"MOSEK"`. | `"HiGHS"` |
|
|
194
|
+
| `spendingSlack` | integer | Percentage allowed to deviate from the spending profile (0-50). | `0` |
|
|
195
|
+
| `startRothConversions` | integer | Year when Roth conversions can begin (clamped to the current year). | Current year |
|
|
196
|
+
| `swapRothConverters` | integer | *(Advanced)* For plans involvng spouses, only allow one spouse to perform Roth conversions per year. The year provided determines a transition year when roles are swapped. The sign selects who converts first: positive means person 1 can convert first and person 2 any time after; negative year means person 2 before and person 1 after. This option overrides the `noRothConversions` option. | `0` |
|
|
197
|
+
| `units` | string | Units for amounts. Valid values: `"1"` (dollars), `"k"` (thousands), `"M"` (millions). | `"k"` |
|
|
198
|
+
| `verbose` | boolean | Enable solver verbosity/output where supported. | `false` |
|
|
199
|
+
| `withMedicare` | string | Medicare IRMAA handling. Valid values: `"None"`, `"loop"`, `"optimize"` (expert). | `"loop"` |
|
|
200
|
+
| `withSCLoop` | boolean | Whether to use the self-consistent loop for solving. | `true` |
|
|
201
|
+
|
|
202
|
+
**Note:** The solver options dictionary is passed directly to the optimization routine. Only the options listed above are validated; other options may be accepted but are not documented here.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## [results]
|
|
207
|
+
|
|
208
|
+
Parameters controlling result display and output.
|
|
209
|
+
|
|
210
|
+
| Parameter | Type | Description |
|
|
211
|
+
|-----------|------|-------------|
|
|
212
|
+
| `default_plots` | string | Default plot display mode. Valid values: `"nominal"` (nominal dollars), `"today"` (today's dollars) |
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Notes on Data Types
|
|
217
|
+
|
|
218
|
+
- **Floats**: All monetary amounts are typically in thousands of dollars unless otherwise specified
|
|
219
|
+
- **Integers**: Used for years, ages, and counts
|
|
220
|
+
- **Booleans**: `true` or `false` in TOML
|
|
221
|
+
- **ISO Dates**: Format `"YYYY-MM-DD"` (e.g., `"1967-01-15"`)
|
|
222
|
+
- **Lists**: Arrays in TOML, e.g., `[1, 2, 3]` or `["Name1", "Name2"]`
|
|
223
|
+
- **3D Arrays**: Nested arrays, e.g., `[[[60, 40, 0, 0], [70, 30, 0, 0]]]`
|
|
224
|
+
|
|
225
|
+
## Example TOML Structure
|
|
226
|
+
|
|
227
|
+
```toml
|
|
228
|
+
case_name = "example"
|
|
229
|
+
description = "Example case description"
|
|
230
|
+
|
|
231
|
+
[basic_info]
|
|
232
|
+
status = "married"
|
|
233
|
+
names = ["Person1", "Person2"]
|
|
234
|
+
date_of_birth = ["1965-01-15", "1967-03-20"]
|
|
235
|
+
life_expectancy = [89, 92]
|
|
236
|
+
start_date = "2026-01-01"
|
|
237
|
+
|
|
238
|
+
[savings_assets]
|
|
239
|
+
taxable_savings_balances = [100.0, 50.0]
|
|
240
|
+
tax_deferred_savings_balances = [500.0, 300.0]
|
|
241
|
+
tax_free_savings_balances = [200.0, 150.0]
|
|
242
|
+
beneficiary_fractions = [1.0, 1.0, 1.0]
|
|
243
|
+
spousal_surplus_deposit_fraction = 0.5
|
|
244
|
+
|
|
245
|
+
[household_financial_profile]
|
|
246
|
+
HFP_file_name = "HFP_example.xlsx"
|
|
247
|
+
|
|
248
|
+
[fixed_income]
|
|
249
|
+
pension_monthly_amounts = [0, 0]
|
|
250
|
+
pension_ages = [65.0, 65.0]
|
|
251
|
+
pension_indexed = [false, false]
|
|
252
|
+
social_security_pia_amounts = [2360, 1642]
|
|
253
|
+
social_security_ages = [70.0, 67.0]
|
|
254
|
+
|
|
255
|
+
[rates_selection]
|
|
256
|
+
heirs_rate_on_tax_deferred_estate = 30.0
|
|
257
|
+
dividend_rate = 1.8
|
|
258
|
+
obbba_expiration_year = 2032
|
|
259
|
+
method = "historical average"
|
|
260
|
+
from = 1969
|
|
261
|
+
to = 2002
|
|
262
|
+
|
|
263
|
+
[asset_allocation]
|
|
264
|
+
interpolation_method = "s-curve"
|
|
265
|
+
interpolation_center = 15.0
|
|
266
|
+
interpolation_width = 5.0
|
|
267
|
+
type = "individual"
|
|
268
|
+
generic = [[[60, 40, 0, 0], [70, 30, 0, 0]], [[60, 40, 0, 0], [80, 20, 0, 0]]]
|
|
269
|
+
|
|
270
|
+
[optimization_parameters]
|
|
271
|
+
spending_profile = "smile"
|
|
272
|
+
surviving_spouse_spending_percent = 60
|
|
273
|
+
smile_dip = 15
|
|
274
|
+
smile_increase = 12
|
|
275
|
+
smile_delay = 0
|
|
276
|
+
objective = "maxSpending"
|
|
277
|
+
|
|
278
|
+
[solver_options]
|
|
279
|
+
maxRothConversion = 100
|
|
280
|
+
noRothConversions = "None"
|
|
281
|
+
startRothConversions = 2025
|
|
282
|
+
withMedicare = "loop"
|
|
283
|
+
bequest = 500
|
|
284
|
+
solver = "HiGHS"
|
|
285
|
+
spendingSlack = 0
|
|
286
|
+
amoRoth = true
|
|
287
|
+
amoSurplus = true
|
|
288
|
+
withSCLoop = true
|
|
289
|
+
maxIter = 29
|
|
290
|
+
maxTime = 900
|
|
291
|
+
|
|
292
|
+
[results]
|
|
293
|
+
default_plots = "nominal"
|
|
294
|
+
```
|
|
295
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owlplanner
|
|
3
|
-
Version:
|
|
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
|
|
@@ -683,6 +683,7 @@ License: GNU GENERAL PUBLIC LICENSE
|
|
|
683
683
|
the library. If this is what you want to do, use the GNU Lesser General
|
|
684
684
|
Public License instead of this License. But first, please read
|
|
685
685
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
686
|
+
License-File: AUTHORS
|
|
686
687
|
License-File: LICENSE
|
|
687
688
|
Classifier: Development Status :: 5 - Production/Stable
|
|
688
689
|
Classifier: Intended Audience :: End Users/Desktop
|
|
@@ -691,8 +692,10 @@ Classifier: Operating System :: OS Independent
|
|
|
691
692
|
Classifier: Programming Language :: Python :: 3
|
|
692
693
|
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
693
694
|
Requires-Python: >=3.10
|
|
695
|
+
Requires-Dist: click>=8.3.1
|
|
694
696
|
Requires-Dist: highspy
|
|
695
697
|
Requires-Dist: jupyter>=1.1.1
|
|
698
|
+
Requires-Dist: loguru>=0.7.3
|
|
696
699
|
Requires-Dist: matplotlib
|
|
697
700
|
Requires-Dist: numpy
|
|
698
701
|
Requires-Dist: odfpy
|
|
@@ -712,7 +715,7 @@ Description-Content-Type: text/markdown
|
|
|
712
715
|
|
|
713
716
|
## A retirement exploration tool based on linear programming
|
|
714
717
|
|
|
715
|
-
<img align=right src="
|
|
718
|
+
<img align="right" src="papers/images/owl.png" width="250">
|
|
716
719
|
|
|
717
720
|
-------------------------------------------------------------------------------------
|
|
718
721
|
|
|
@@ -724,6 +727,10 @@ Users can select varying return rates to perform historical back testing,
|
|
|
724
727
|
stochastic rates for performing Monte Carlo analyses,
|
|
725
728
|
or fixed rates either derived from historical averages, or set by the user.
|
|
726
729
|
|
|
730
|
+
Owl is designed for US retirees as it considers US federal tax laws,
|
|
731
|
+
Medicare premiums, rules for 401k including required minimum distributions,
|
|
732
|
+
maturation rules for Roth accounts and conversions, social security rules, etc.
|
|
733
|
+
|
|
727
734
|
There are three ways to run Owl:
|
|
728
735
|
|
|
729
736
|
- **Streamlit Hub:** Run Owl remotely as hosted on the Streamlit Community Server at
|
|
@@ -763,6 +770,7 @@ Follow these [instructions](INSTALL.md) to install from the source code and self
|
|
|
763
770
|
It can also run on [MOSEK](https://mosek.com) if available on your computer.
|
|
764
771
|
- Owl planner relies on the following [Python](https://python.org) packages:
|
|
765
772
|
- [highspy](https://highs.dev),
|
|
773
|
+
[loguru](https://github.com/Delgan/loguru),
|
|
766
774
|
[Matplotlib](https://matplotlib.org),
|
|
767
775
|
[Numpy](https://numpy.org),
|
|
768
776
|
[odfpy](https://https://pypi.org/project/odfpy),
|
|
@@ -789,7 +797,7 @@ your computer and can be used to reproduce a case at a later time.
|
|
|
789
797
|
|
|
790
798
|
---------------------------------------------------------------------
|
|
791
799
|
|
|
792
|
-
Copyright © 2024 - Martin-D. Lacasse
|
|
800
|
+
Copyright © 2024-2026 - Martin-D. Lacasse
|
|
793
801
|
|
|
794
802
|
Disclaimers: This code is for educatonal purposes only and does not constitute financial advice.
|
|
795
803
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
## A retirement exploration tool based on linear programming
|
|
5
5
|
|
|
6
|
-
<img align=right src="
|
|
6
|
+
<img align="right" src="papers/images/owl.png" width="250">
|
|
7
7
|
|
|
8
8
|
-------------------------------------------------------------------------------------
|
|
9
9
|
|
|
@@ -15,6 +15,10 @@ Users can select varying return rates to perform historical back testing,
|
|
|
15
15
|
stochastic rates for performing Monte Carlo analyses,
|
|
16
16
|
or fixed rates either derived from historical averages, or set by the user.
|
|
17
17
|
|
|
18
|
+
Owl is designed for US retirees as it considers US federal tax laws,
|
|
19
|
+
Medicare premiums, rules for 401k including required minimum distributions,
|
|
20
|
+
maturation rules for Roth accounts and conversions, social security rules, etc.
|
|
21
|
+
|
|
18
22
|
There are three ways to run Owl:
|
|
19
23
|
|
|
20
24
|
- **Streamlit Hub:** Run Owl remotely as hosted on the Streamlit Community Server at
|
|
@@ -54,6 +58,7 @@ Follow these [instructions](INSTALL.md) to install from the source code and self
|
|
|
54
58
|
It can also run on [MOSEK](https://mosek.com) if available on your computer.
|
|
55
59
|
- Owl planner relies on the following [Python](https://python.org) packages:
|
|
56
60
|
- [highspy](https://highs.dev),
|
|
61
|
+
[loguru](https://github.com/Delgan/loguru),
|
|
57
62
|
[Matplotlib](https://matplotlib.org),
|
|
58
63
|
[Numpy](https://numpy.org),
|
|
59
64
|
[odfpy](https://https://pypi.org/project/odfpy),
|
|
@@ -80,7 +85,7 @@ your computer and can be used to reproduce a case at a later time.
|
|
|
80
85
|
|
|
81
86
|
---------------------------------------------------------------------
|
|
82
87
|
|
|
83
|
-
Copyright © 2024 - Martin-D. Lacasse
|
|
88
|
+
Copyright © 2024-2026 - Martin-D. Lacasse
|
|
84
89
|
|
|
85
90
|
Disclaimers: This code is for educatonal purposes only and does not constitute financial advice.
|
|
86
91
|
|