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.
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/PKG-INFO +27 -23
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/README.md +26 -22
- owlplanner-2025.4.28/docs/images/piecewiseConstant.png +0 -0
- owlplanner-2025.4.28/docs/owl.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/owl.tex +547 -264
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/pyproject.toml +1 -1
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/abcapi.py +2 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/plan.py +273 -285
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/tax2025.py +31 -2
- owlplanner-2025.4.28/src/owlplanner/version.py +1 -0
- owlplanner-2025.4.28/tests/test_irmaa.py +58 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_repro.py +3 -2
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Documentation.py +22 -14
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Optimization_Parameters.py +4 -4
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/owlbridge.py +5 -4
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/requirements.txt +1 -1
- owlplanner-2025.4.22/docs/owl.pdf +0 -0
- owlplanner-2025.4.22/src/owlplanner/.plan.py.swo +0 -0
- owlplanner-2025.4.22/src/owlplanner/version.py +0 -1
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.flake8 +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.gitattributes +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/.gitignore +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/INSTALL.md +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/LICENSE +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/BF01580653.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
- {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
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/bv_cvxbook.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/Papers/s10436-006-0062-y.pdf +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/USER_GUIDE.md +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/Dockerfile +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/README.md +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docker/fastentrypoint.sh +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/allocations.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/owl.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/profile.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/docs/newowl.tex +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_jack+jill.toml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_joe.toml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_john+sally.toml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_jon+jane.toml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_kim+sam-bequest.toml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/case_kim+sam-spending.toml +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/joe.xlsx +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/examples/template.xlsx +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/template.ipynb +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/tutorial_1.ipynb +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/tutorial_2.ipynb +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/notebooks/tutorial_3.ipynb +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/owlplanner.cmd +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/owlplanner.sh +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/reponse.txt +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/requirements.txt +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/config.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/logging.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/rates.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_logger.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_regressions.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_toml_cases.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/tests/test_units.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ttt.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ttt2.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ttt3.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/About_Owl.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Create_Case.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Current_Assets.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Graphs.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Historical_Range.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Logs.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Monte_Carlo.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Output_Files.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Quick_Start.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/README.md +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Rates_Selection.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Settings.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Wages_And_Contributions.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/Worksheets.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/main+fonts.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/main.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/plots.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/progress.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/sskeys.py +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/sskeys.py.color +0 -0
- {owlplanner-2025.4.22 → owlplanner-2025.4.28}/ui/style.css +0 -0
- {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.
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
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
|
|
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
|
|
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 ©
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
|
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
|
|
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 ©
|
|
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
|
|
Binary file
|