owlplanner 2025.4.22__tar.gz → 2025.4.28__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.
Files changed (121) hide show
  1. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/PKG-INFO +27 -23
  2. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/README.md +26 -22
  3. owlplanner-2025.4.28/docs/images/piecewiseConstant.png +0 -0
  4. owlplanner-2025.4.28/docs/owl.pdf +0 -0
  5. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/owl.tex +547 -264
  6. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/pyproject.toml +1 -1
  7. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/abcapi.py +2 -0
  8. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/plan.py +273 -285
  9. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/tax2025.py +31 -2
  10. owlplanner-2025.4.28/src/owlplanner/version.py +1 -0
  11. owlplanner-2025.4.28/tests/test_irmaa.py +58 -0
  12. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_repro.py +3 -2
  13. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Documentation.py +22 -14
  14. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Optimization_Parameters.py +4 -4
  15. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/owlbridge.py +5 -4
  16. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/requirements.txt +1 -1
  17. owlplanner-2025.4.22/docs/owl.pdf +0 -0
  18. owlplanner-2025.4.22/src/owlplanner/.plan.py.swo +0 -0
  19. owlplanner-2025.4.22/src/owlplanner/version.py +0 -1
  20. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.devcontainer/devcontainer.json +0 -0
  21. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.flake8 +0 -0
  22. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.gitattributes +0 -0
  23. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.github/workflows/github-actions-runtests.yml +0 -0
  24. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.gitignore +0 -0
  25. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/INSTALL.md +0 -0
  26. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/LICENSE +0 -0
  27. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/BF01580653.pdf +0 -0
  28. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
  29. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
  30. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +0 -0
  31. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +0 -0
  32. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
  33. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
  34. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
  35. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/bv_cvxbook.pdf +0 -0
  36. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/s10436-006-0062-y.pdf +0 -0
  37. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/USER_GUIDE.md +0 -0
  38. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/Dockerfile +0 -0
  39. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/README.md +0 -0
  40. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/docker-compose.yml +0 -0
  41. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/fastentrypoint.sh +0 -0
  42. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/AD-taxDef.png +0 -0
  43. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/AD-taxFree.png +0 -0
  44. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/AD-taxable.png +0 -0
  45. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/Hist_Bequest.png +0 -0
  46. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/Hist_Spending.png +0 -0
  47. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/MC-tutorial2a.png +0 -0
  48. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/MC-tutorial2b.png +0 -0
  49. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/OwlUI.png +0 -0
  50. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/allocations.png +0 -0
  51. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/owl.png +0 -0
  52. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/profile.png +0 -0
  53. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/ratesCorrelations.png +0 -0
  54. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/ratesPlot.png +0 -0
  55. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/savingsPlot.png +0 -0
  56. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/sourcesPlot.png +0 -0
  57. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/spendingPlot.png +0 -0
  58. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/taxIncomePlot.png +0 -0
  59. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/taxesPlot.png +0 -0
  60. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/newowl.tex +0 -0
  61. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_jack+jill.toml +0 -0
  62. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_joe.toml +0 -0
  63. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_john+sally.toml +0 -0
  64. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_jon+jane.toml +0 -0
  65. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_kim+sam-bequest.toml +0 -0
  66. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_kim+sam-spending.toml +0 -0
  67. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/jack+jill.xlsx +0 -0
  68. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/joe.xlsx +0 -0
  69. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/john+sally.xlsx +0 -0
  70. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/jon+jane.xlsx +0 -0
  71. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/template.xlsx +0 -0
  72. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/john+sally.ipynb +0 -0
  73. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/kim+sam.ipynb +0 -0
  74. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/template.ipynb +0 -0
  75. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/tutorial_1.ipynb +0 -0
  76. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/tutorial_2.ipynb +0 -0
  77. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/tutorial_3.ipynb +0 -0
  78. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/owlplanner.cmd +0 -0
  79. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/owlplanner.sh +0 -0
  80. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/reponse.txt +0 -0
  81. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/requirements.txt +0 -0
  82. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/__init__.py +0 -0
  83. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/config.py +0 -0
  84. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/data/__init__.py +0 -0
  85. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/data/rates.csv +0 -0
  86. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/logging.py +0 -0
  87. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/progress.py +0 -0
  88. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/rates.py +0 -0
  89. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/timelists.py +0 -0
  90. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/utils.py +0 -0
  91. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_logger.py +0 -0
  92. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_regressions.py +0 -0
  93. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_toml_cases.py +0 -0
  94. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_units.py +0 -0
  95. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ttt.py +0 -0
  96. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ttt2.py +0 -0
  97. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ttt3.py +0 -0
  98. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/About_Owl.py +0 -0
  99. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Asset_Allocation.py +0 -0
  100. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Create_Case.py +0 -0
  101. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Current_Assets.py +0 -0
  102. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Fixed_Income.py +0 -0
  103. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Graphs.py +0 -0
  104. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Historical_Range.py +0 -0
  105. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Logs.py +0 -0
  106. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Monte_Carlo.py +0 -0
  107. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Output_Files.py +0 -0
  108. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Quick_Start.py +0 -0
  109. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/README.md +0 -0
  110. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Rates_Selection.py +0 -0
  111. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Settings.py +0 -0
  112. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Wages_And_Contributions.py +0 -0
  113. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Worksheets.py +0 -0
  114. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/main+fonts.py +0 -0
  115. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/main.py +0 -0
  116. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/plots.py +0 -0
  117. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/progress.py +0 -0
  118. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/sskeys.py +0 -0
  119. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/sskeys.py.color +0 -0
  120. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/style.css +0 -0
  121. {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/tomlexamples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.4.22
3
+ Version: 2025.4.28
4
4
  Summary: Owl: 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
@@ -719,7 +719,8 @@ or fixed rates either derived from historical averages, or set by the user.
719
719
 
720
720
  There are a few ways to run Owl:
721
721
 
722
- - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
722
+ - Run Owl directly on the Streamlit Community Server at
723
+ [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
723
724
 
724
725
  - Run locally on your computer using a Docker image.
725
726
  Follow these [instructions](docker/README.md) for this option.
@@ -758,8 +759,8 @@ while providing a codebase where they can learn and contribute. There are and we
758
759
  good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
759
760
  collecting your data, or academic papers that share the results without really sharing the details of
760
761
  the underlying mathematical models.
761
- The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
762
- detailed description of the underlying
762
+ The algorithms in Owl rely on the open-source HiGHS linear programming solver.
763
+ The complete formulation and detailed description of the underlying
763
764
  mathematical model can be found [here](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
764
765
 
765
766
  It is anticipated that most end users will use Owl through the graphical interface
@@ -772,16 +773,18 @@ Not every retirement decision strategy can be framed as an easy-to-solve optimiz
772
773
  In particular, if one is interested in comparing different withdrawal strategies,
773
774
  [FI Calc](ficalc.app) is an elegant application that addresses this need.
774
775
  If, however, you also want to optimize spending, bequest, and Roth conversions, with
775
- an approach also considering Medicare and federal income tax over the next few years,
776
+ an approach also considering Medicare costs and federal income tax over the next few years,
776
777
  then Owl is definitely a tool that can help guide your decisions.
777
778
 
778
779
  --------------------------------------------------------------------------------------
779
780
  ## Capabilities
780
- Owl can optimize for either maximum net spending under the constraint of a given bequest (which can be zero),
781
+ Owl can optimize for either the maximum net spending amount under the constraint
782
+ of a given bequest (which can be zero),
781
783
  or maximize the after-tax value of a bequest under the constraint of a desired net spending profile,
782
- and under the assumption of a heirs marginal tax rate.
783
- Roth conversions are also considered, subject to an optional maximum conversion amount,
784
- and optimized to suit the goals of the selected objective function.
784
+ under the assumption of a heirs marginal tax rate.
785
+ Roth conversions are also considered, subject to an optional maximum Roth conversion amount,
786
+ and optimized to suit the goals of the selected objective function, while considering
787
+ Medicare costs, and federal income tax under different rates of return assumptions.
785
788
  All calculations are indexed for inflation, which is either provided as a fixed rate,
786
789
  or through historical values, as are all other rates used for the calculations.
787
790
  These rates can be used for backtesting different scenarios by choosing
@@ -839,29 +842,29 @@ which are all tracked separately for married individuals. Asset transition to th
839
842
  is done according to beneficiary fractions for each type of savings account.
840
843
  Tax status covers married filing jointly and single, depending on the number of individuals reported.
841
844
 
842
- Medicare and IRMAA calculations are performed through a self-consistent loop on cash flow constraints.
845
+ Federal income tax, Medicare part B premiums, and IRMAA calculations are part of the optimization.
843
846
  Future values are simple projections of current values with the assumed inflation rates.
844
847
 
845
848
  ### Limitations
846
849
  Owl is work in progress. At the current time:
847
850
  - Only the US federal income tax is considered (and minimized through the optimization algorithm).
848
851
  Head of household filing status has not been added but can easily be.
849
- - Required minimum distributions are calculated, but tables for spouses more than 10 years apart are not included.
852
+ - Required minimum distributions are always performed and calculated,
853
+ but tables for spouses more than 10 years apart are not included.
850
854
  These cases are detected and will generate an error message.
851
855
  - Social security rule for surviving spouse assumes that benefits were taken at full retirement age.
852
- - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
853
- If there is interest, that could be added in the future.
854
856
  - In the current implementation, social securiy is always taxed at 85%.
855
- - Medicare calculations are done through a self-consistent loop.
856
- This means that the Medicare premiums are calculated after an initial solution is generated,
857
- and then a new solution is re-generated with these premiums as a constraint.
858
- In some situations, when the income (MAGI) is near an IRMAA bracket, oscillatory solutions can arise.
859
- While the solutions generated are very close to one another, Owl will pick the smallest solution
860
- for being conservative.
857
+ - Medicare calculations require the use of binary variables which add to the computational costs.
858
+ I've observed run requiring up to 10 seconds.
859
+ These calculations can be turned off when shorter time to solutions are required.
860
+ The use of a commercial solver (e.g. MOSEK) can substantially reduce computing time
861
+ but require a license.
861
862
  - Part D is not included in the IRMAA calculations. Being considerably more significant,
862
863
  only Part B is taken into account.
863
- - Future tax brackets are pure speculations derived from the little we know now and projected to the next 30 years.
864
- Your guesses are as good as mine.
864
+ - Future tax brackets are pure speculations derived from the little we know now and projected
865
+ to the next 30 years. Your guesses are as good as mine.
866
+ - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
867
+ If there is interest, that could be added in the future.
865
868
 
866
869
  The solution from an optimization algorithm has only two states: feasible and infeasible.
867
870
  Therefore, unlike event-driven simulators that can tell you that your distribution strategy runs
@@ -874,7 +877,8 @@ assets to support, even with no estate being left.
874
877
  ---------------------------------------------------------------
875
878
  ## Documentation
876
879
 
877
- - Documentation for the app user interface is available from the interface [itself](https://owlplanner.streamlit.app/Documentation).
880
+ - Documentation for the app user interface is available from the interface
881
+ [itself](https://owlplanner.streamlit.app/Documentation).
878
882
  - Installation guide and software requirements can be found [here](INSTALL.md).
879
883
  - User guide for the underlying Python package as used in a Jupyter notebook can be found [here](USER_GUIDE.md).
880
884
 
@@ -891,7 +895,7 @@ assets to support, even with no estate being left.
891
895
 
892
896
  ---------------------------------------------------------------------
893
897
 
894
- Copyright © 2024 - Martin-D. Lacasse
898
+ Copyright © 2025 - Martin-D. Lacasse
895
899
 
896
900
  Disclaimers: I am not a financial planner. You make your own decisions.
897
901
  This program comes with no guarantee. Use at your own risk.
@@ -16,7 +16,8 @@ or fixed rates either derived from historical averages, or set by the user.
16
16
 
17
17
  There are a few ways to run Owl:
18
18
 
19
- - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
19
+ - Run Owl directly on the Streamlit Community Server at
20
+ [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
20
21
 
21
22
  - Run locally on your computer using a Docker image.
22
23
  Follow these [instructions](docker/README.md) for this option.
@@ -55,8 +56,8 @@ while providing a codebase where they can learn and contribute. There are and we
55
56
  good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
56
57
  collecting your data, or academic papers that share the results without really sharing the details of
57
58
  the underlying mathematical models.
58
- The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
59
- detailed description of the underlying
59
+ The algorithms in Owl rely on the open-source HiGHS linear programming solver.
60
+ The complete formulation and detailed description of the underlying
60
61
  mathematical model can be found [here](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
61
62
 
62
63
  It is anticipated that most end users will use Owl through the graphical interface
@@ -69,16 +70,18 @@ Not every retirement decision strategy can be framed as an easy-to-solve optimiz
69
70
  In particular, if one is interested in comparing different withdrawal strategies,
70
71
  [FI Calc](ficalc.app) is an elegant application that addresses this need.
71
72
  If, however, you also want to optimize spending, bequest, and Roth conversions, with
72
- an approach also considering Medicare and federal income tax over the next few years,
73
+ an approach also considering Medicare costs and federal income tax over the next few years,
73
74
  then Owl is definitely a tool that can help guide your decisions.
74
75
 
75
76
  --------------------------------------------------------------------------------------
76
77
  ## Capabilities
77
- Owl can optimize for either maximum net spending under the constraint of a given bequest (which can be zero),
78
+ Owl can optimize for either the maximum net spending amount under the constraint
79
+ of a given bequest (which can be zero),
78
80
  or maximize the after-tax value of a bequest under the constraint of a desired net spending profile,
79
- and under the assumption of a heirs marginal tax rate.
80
- Roth conversions are also considered, subject to an optional maximum conversion amount,
81
- and optimized to suit the goals of the selected objective function.
81
+ under the assumption of a heirs marginal tax rate.
82
+ Roth conversions are also considered, subject to an optional maximum Roth conversion amount,
83
+ and optimized to suit the goals of the selected objective function, while considering
84
+ Medicare costs, and federal income tax under different rates of return assumptions.
82
85
  All calculations are indexed for inflation, which is either provided as a fixed rate,
83
86
  or through historical values, as are all other rates used for the calculations.
84
87
  These rates can be used for backtesting different scenarios by choosing
@@ -136,29 +139,29 @@ which are all tracked separately for married individuals. Asset transition to th
136
139
  is done according to beneficiary fractions for each type of savings account.
137
140
  Tax status covers married filing jointly and single, depending on the number of individuals reported.
138
141
 
139
- Medicare and IRMAA calculations are performed through a self-consistent loop on cash flow constraints.
142
+ Federal income tax, Medicare part B premiums, and IRMAA calculations are part of the optimization.
140
143
  Future values are simple projections of current values with the assumed inflation rates.
141
144
 
142
145
  ### Limitations
143
146
  Owl is work in progress. At the current time:
144
147
  - Only the US federal income tax is considered (and minimized through the optimization algorithm).
145
148
  Head of household filing status has not been added but can easily be.
146
- - Required minimum distributions are calculated, but tables for spouses more than 10 years apart are not included.
149
+ - Required minimum distributions are always performed and calculated,
150
+ but tables for spouses more than 10 years apart are not included.
147
151
  These cases are detected and will generate an error message.
148
152
  - Social security rule for surviving spouse assumes that benefits were taken at full retirement age.
149
- - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
150
- If there is interest, that could be added in the future.
151
153
  - In the current implementation, social securiy is always taxed at 85%.
152
- - Medicare calculations are done through a self-consistent loop.
153
- This means that the Medicare premiums are calculated after an initial solution is generated,
154
- and then a new solution is re-generated with these premiums as a constraint.
155
- In some situations, when the income (MAGI) is near an IRMAA bracket, oscillatory solutions can arise.
156
- While the solutions generated are very close to one another, Owl will pick the smallest solution
157
- for being conservative.
154
+ - Medicare calculations require the use of binary variables which add to the computational costs.
155
+ I've observed run requiring up to 10 seconds.
156
+ These calculations can be turned off when shorter time to solutions are required.
157
+ The use of a commercial solver (e.g. MOSEK) can substantially reduce computing time
158
+ but require a license.
158
159
  - Part D is not included in the IRMAA calculations. Being considerably more significant,
159
160
  only Part B is taken into account.
160
- - Future tax brackets are pure speculations derived from the little we know now and projected to the next 30 years.
161
- Your guesses are as good as mine.
161
+ - Future tax brackets are pure speculations derived from the little we know now and projected
162
+ to the next 30 years. Your guesses are as good as mine.
163
+ - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
164
+ If there is interest, that could be added in the future.
162
165
 
163
166
  The solution from an optimization algorithm has only two states: feasible and infeasible.
164
167
  Therefore, unlike event-driven simulators that can tell you that your distribution strategy runs
@@ -171,7 +174,8 @@ assets to support, even with no estate being left.
171
174
  ---------------------------------------------------------------
172
175
  ## Documentation
173
176
 
174
- - Documentation for the app user interface is available from the interface [itself](https://owlplanner.streamlit.app/Documentation).
177
+ - Documentation for the app user interface is available from the interface
178
+ [itself](https://owlplanner.streamlit.app/Documentation).
175
179
  - Installation guide and software requirements can be found [here](INSTALL.md).
176
180
  - User guide for the underlying Python package as used in a Jupyter notebook can be found [here](USER_GUIDE.md).
177
181
 
@@ -188,7 +192,7 @@ assets to support, even with no estate being left.
188
192
 
189
193
  ---------------------------------------------------------------------
190
194
 
191
- Copyright © 2024 - Martin-D. Lacasse
195
+ Copyright © 2025 - Martin-D. Lacasse
192
196
 
193
197
  Disclaimers: I am not a financial planner. You make your own decisions.
194
198
  This program comes with no guarantee. Use at your own risk.
Binary file