owlplanner 2025.4.28__tar.gz → 2025.5.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.4.28 → owlplanner-2025.5.2}/PKG-INFO +23 -27
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/README.md +22 -26
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/Dockerfile +34 -34
- owlplanner-2025.5.2/docs/owl.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/owl.tex +264 -547
- owlplanner-2025.5.2/git-cheats +11 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/pyproject.toml +1 -1
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/requirements.txt +1 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/abcapi.py +17 -23
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/plan.py +325 -298
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/tax2025.py +2 -31
- owlplanner-2025.5.2/src/owlplanner/version.py +1 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_repro.py +2 -3
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/About_Owl.py +11 -6
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Documentation.py +32 -21
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Optimization_Parameters.py +15 -9
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/owlbridge.py +4 -5
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/requirements.txt +2 -1
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/sskeys.py +1 -1
- owlplanner-2025.4.28/docs/images/piecewiseConstant.png +0 -0
- owlplanner-2025.4.28/docs/owl.pdf +0 -0
- owlplanner-2025.4.28/reponse.txt +0 -20
- owlplanner-2025.4.28/src/owlplanner/version.py +0 -1
- owlplanner-2025.4.28/tests/test_irmaa.py +0 -58
- owlplanner-2025.4.28/ttt.py +0 -13
- owlplanner-2025.4.28/ttt2.py +0 -24
- owlplanner-2025.4.28/ttt3.py +0 -6
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.flake8 +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.gitattributes +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.gitignore +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/INSTALL.md +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/LICENSE +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/BF01580653.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/bv_cvxbook.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/s10436-006-0062-y.pdf +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/USER_GUIDE.md +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/README.md +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/fastentrypoint.sh +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/allocations.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/owl.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/profile.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/newowl.tex +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_jack+jill.toml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_joe.toml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_john+sally.toml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_jon+jane.toml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_kim+sam-bequest.toml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_kim+sam-spending.toml +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/joe.xlsx +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/template.xlsx +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/template.ipynb +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/tutorial_1.ipynb +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/tutorial_2.ipynb +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/tutorial_3.ipynb +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/owlplanner.cmd +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/owlplanner.sh +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/config.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/logging.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/rates.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_logger.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_regressions.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_toml_cases.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_units.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Create_Case.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Current_Assets.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Graphs.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Historical_Range.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Logs.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Monte_Carlo.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Output_Files.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Quick_Start.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/README.md +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Rates_Selection.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Settings.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Wages_And_Contributions.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Worksheets.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/main+fonts.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/main.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/plots.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/progress.py +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/sskeys.py.color +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/style.css +0 -0
- {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/tomlexamples.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owlplanner
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.5.2
|
|
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,8 +719,7 @@ 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
|
|
723
|
-
[owlplanner.streamlit.app](https://owlplanner.streamlit.app).
|
|
722
|
+
- Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
|
|
724
723
|
|
|
725
724
|
- Run locally on your computer using a Docker image.
|
|
726
725
|
Follow these [instructions](docker/README.md) for this option.
|
|
@@ -759,8 +758,8 @@ while providing a codebase where they can learn and contribute. There are and we
|
|
|
759
758
|
good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
|
|
760
759
|
collecting your data, or academic papers that share the results without really sharing the details of
|
|
761
760
|
the underlying mathematical models.
|
|
762
|
-
The algorithms in Owl rely on the open-source HiGHS linear programming solver.
|
|
763
|
-
|
|
761
|
+
The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
|
|
762
|
+
detailed description of the underlying
|
|
764
763
|
mathematical model can be found [here](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
|
|
765
764
|
|
|
766
765
|
It is anticipated that most end users will use Owl through the graphical interface
|
|
@@ -773,18 +772,16 @@ Not every retirement decision strategy can be framed as an easy-to-solve optimiz
|
|
|
773
772
|
In particular, if one is interested in comparing different withdrawal strategies,
|
|
774
773
|
[FI Calc](ficalc.app) is an elegant application that addresses this need.
|
|
775
774
|
If, however, you also want to optimize spending, bequest, and Roth conversions, with
|
|
776
|
-
an approach also considering Medicare
|
|
775
|
+
an approach also considering Medicare and federal income tax over the next few years,
|
|
777
776
|
then Owl is definitely a tool that can help guide your decisions.
|
|
778
777
|
|
|
779
778
|
--------------------------------------------------------------------------------------
|
|
780
779
|
## Capabilities
|
|
781
|
-
Owl can optimize for either
|
|
782
|
-
of a given bequest (which can be zero),
|
|
780
|
+
Owl can optimize for either maximum net spending under the constraint of a given bequest (which can be zero),
|
|
783
781
|
or maximize the after-tax value of a bequest under the constraint of a desired net spending profile,
|
|
784
|
-
under the assumption of a heirs marginal tax rate.
|
|
785
|
-
Roth conversions are also considered, subject to an optional maximum
|
|
786
|
-
and optimized to suit the goals of the selected objective function
|
|
787
|
-
Medicare costs, and federal income tax under different rates of return assumptions.
|
|
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.
|
|
788
785
|
All calculations are indexed for inflation, which is either provided as a fixed rate,
|
|
789
786
|
or through historical values, as are all other rates used for the calculations.
|
|
790
787
|
These rates can be used for backtesting different scenarios by choosing
|
|
@@ -842,29 +839,29 @@ which are all tracked separately for married individuals. Asset transition to th
|
|
|
842
839
|
is done according to beneficiary fractions for each type of savings account.
|
|
843
840
|
Tax status covers married filing jointly and single, depending on the number of individuals reported.
|
|
844
841
|
|
|
845
|
-
|
|
842
|
+
Medicare and IRMAA calculations are performed through a self-consistent loop on cash flow constraints.
|
|
846
843
|
Future values are simple projections of current values with the assumed inflation rates.
|
|
847
844
|
|
|
848
845
|
### Limitations
|
|
849
846
|
Owl is work in progress. At the current time:
|
|
850
847
|
- Only the US federal income tax is considered (and minimized through the optimization algorithm).
|
|
851
848
|
Head of household filing status has not been added but can easily be.
|
|
852
|
-
- Required minimum distributions are
|
|
853
|
-
but tables for spouses more than 10 years apart are not included.
|
|
849
|
+
- Required minimum distributions are calculated, but tables for spouses more than 10 years apart are not included.
|
|
854
850
|
These cases are detected and will generate an error message.
|
|
855
851
|
- 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.
|
|
856
854
|
- In the current implementation, social securiy is always taxed at 85%.
|
|
857
|
-
- Medicare calculations
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
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.
|
|
862
861
|
- Part D is not included in the IRMAA calculations. Being considerably more significant,
|
|
863
862
|
only Part B is taken into account.
|
|
864
|
-
- Future tax brackets are pure speculations derived from the little we know now and projected
|
|
865
|
-
|
|
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.
|
|
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.
|
|
868
865
|
|
|
869
866
|
The solution from an optimization algorithm has only two states: feasible and infeasible.
|
|
870
867
|
Therefore, unlike event-driven simulators that can tell you that your distribution strategy runs
|
|
@@ -877,8 +874,7 @@ assets to support, even with no estate being left.
|
|
|
877
874
|
---------------------------------------------------------------
|
|
878
875
|
## Documentation
|
|
879
876
|
|
|
880
|
-
- Documentation for the app user interface is available from the interface
|
|
881
|
-
[itself](https://owlplanner.streamlit.app/Documentation).
|
|
877
|
+
- Documentation for the app user interface is available from the interface [itself](https://owlplanner.streamlit.app/Documentation).
|
|
882
878
|
- Installation guide and software requirements can be found [here](INSTALL.md).
|
|
883
879
|
- User guide for the underlying Python package as used in a Jupyter notebook can be found [here](USER_GUIDE.md).
|
|
884
880
|
|
|
@@ -895,7 +891,7 @@ assets to support, even with no estate being left.
|
|
|
895
891
|
|
|
896
892
|
---------------------------------------------------------------------
|
|
897
893
|
|
|
898
|
-
Copyright ©
|
|
894
|
+
Copyright © 2024 - Martin-D. Lacasse
|
|
899
895
|
|
|
900
896
|
Disclaimers: I am not a financial planner. You make your own decisions.
|
|
901
897
|
This program comes with no guarantee. Use at your own risk.
|
|
@@ -16,8 +16,7 @@ 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
|
|
20
|
-
[owlplanner.streamlit.app](https://owlplanner.streamlit.app).
|
|
19
|
+
- Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
|
|
21
20
|
|
|
22
21
|
- Run locally on your computer using a Docker image.
|
|
23
22
|
Follow these [instructions](docker/README.md) for this option.
|
|
@@ -56,8 +55,8 @@ while providing a codebase where they can learn and contribute. There are and we
|
|
|
56
55
|
good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
|
|
57
56
|
collecting your data, or academic papers that share the results without really sharing the details of
|
|
58
57
|
the underlying mathematical models.
|
|
59
|
-
The algorithms in Owl rely on the open-source HiGHS linear programming solver.
|
|
60
|
-
|
|
58
|
+
The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
|
|
59
|
+
detailed description of the underlying
|
|
61
60
|
mathematical model can be found [here](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
|
|
62
61
|
|
|
63
62
|
It is anticipated that most end users will use Owl through the graphical interface
|
|
@@ -70,18 +69,16 @@ Not every retirement decision strategy can be framed as an easy-to-solve optimiz
|
|
|
70
69
|
In particular, if one is interested in comparing different withdrawal strategies,
|
|
71
70
|
[FI Calc](ficalc.app) is an elegant application that addresses this need.
|
|
72
71
|
If, however, you also want to optimize spending, bequest, and Roth conversions, with
|
|
73
|
-
an approach also considering Medicare
|
|
72
|
+
an approach also considering Medicare and federal income tax over the next few years,
|
|
74
73
|
then Owl is definitely a tool that can help guide your decisions.
|
|
75
74
|
|
|
76
75
|
--------------------------------------------------------------------------------------
|
|
77
76
|
## Capabilities
|
|
78
|
-
Owl can optimize for either
|
|
79
|
-
of a given bequest (which can be zero),
|
|
77
|
+
Owl can optimize for either maximum net spending under the constraint of a given bequest (which can be zero),
|
|
80
78
|
or maximize the after-tax value of a bequest under the constraint of a desired net spending profile,
|
|
81
|
-
under the assumption of a heirs marginal tax rate.
|
|
82
|
-
Roth conversions are also considered, subject to an optional maximum
|
|
83
|
-
and optimized to suit the goals of the selected objective function
|
|
84
|
-
Medicare costs, and federal income tax under different rates of return assumptions.
|
|
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.
|
|
85
82
|
All calculations are indexed for inflation, which is either provided as a fixed rate,
|
|
86
83
|
or through historical values, as are all other rates used for the calculations.
|
|
87
84
|
These rates can be used for backtesting different scenarios by choosing
|
|
@@ -139,29 +136,29 @@ which are all tracked separately for married individuals. Asset transition to th
|
|
|
139
136
|
is done according to beneficiary fractions for each type of savings account.
|
|
140
137
|
Tax status covers married filing jointly and single, depending on the number of individuals reported.
|
|
141
138
|
|
|
142
|
-
|
|
139
|
+
Medicare and IRMAA calculations are performed through a self-consistent loop on cash flow constraints.
|
|
143
140
|
Future values are simple projections of current values with the assumed inflation rates.
|
|
144
141
|
|
|
145
142
|
### Limitations
|
|
146
143
|
Owl is work in progress. At the current time:
|
|
147
144
|
- Only the US federal income tax is considered (and minimized through the optimization algorithm).
|
|
148
145
|
Head of household filing status has not been added but can easily be.
|
|
149
|
-
- Required minimum distributions are
|
|
150
|
-
but tables for spouses more than 10 years apart are not included.
|
|
146
|
+
- Required minimum distributions are calculated, but tables for spouses more than 10 years apart are not included.
|
|
151
147
|
These cases are detected and will generate an error message.
|
|
152
148
|
- 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.
|
|
153
151
|
- In the current implementation, social securiy is always taxed at 85%.
|
|
154
|
-
- Medicare calculations
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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.
|
|
159
158
|
- Part D is not included in the IRMAA calculations. Being considerably more significant,
|
|
160
159
|
only Part B is taken into account.
|
|
161
|
-
- Future tax brackets are pure speculations derived from the little we know now and projected
|
|
162
|
-
|
|
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.
|
|
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.
|
|
165
162
|
|
|
166
163
|
The solution from an optimization algorithm has only two states: feasible and infeasible.
|
|
167
164
|
Therefore, unlike event-driven simulators that can tell you that your distribution strategy runs
|
|
@@ -174,8 +171,7 @@ assets to support, even with no estate being left.
|
|
|
174
171
|
---------------------------------------------------------------
|
|
175
172
|
## Documentation
|
|
176
173
|
|
|
177
|
-
- Documentation for the app user interface is available from the interface
|
|
178
|
-
[itself](https://owlplanner.streamlit.app/Documentation).
|
|
174
|
+
- Documentation for the app user interface is available from the interface [itself](https://owlplanner.streamlit.app/Documentation).
|
|
179
175
|
- Installation guide and software requirements can be found [here](INSTALL.md).
|
|
180
176
|
- User guide for the underlying Python package as used in a Jupyter notebook can be found [here](USER_GUIDE.md).
|
|
181
177
|
|
|
@@ -192,7 +188,7 @@ assets to support, even with no estate being left.
|
|
|
192
188
|
|
|
193
189
|
---------------------------------------------------------------------
|
|
194
190
|
|
|
195
|
-
Copyright ©
|
|
191
|
+
Copyright © 2024 - Martin-D. Lacasse
|
|
196
192
|
|
|
197
193
|
Disclaimers: I am not a financial planner. You make your own decisions.
|
|
198
194
|
This program comes with no guarantee. Use at your own risk.
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
# docker/Dockerfile
|
|
2
|
-
|
|
3
|
-
FROM python:3.13-slim
|
|
4
|
-
|
|
5
|
-
WORKDIR /app
|
|
6
|
-
|
|
7
|
-
RUN apt-get update; \
|
|
8
|
-
apt-get upgrade; \
|
|
9
|
-
apt-get install -y --no-install-recommends \
|
|
10
|
-
curl \
|
|
11
|
-
git \
|
|
12
|
-
; \
|
|
13
|
-
rm -rf /var/lib/apt/lists/*
|
|
14
|
-
|
|
15
|
-
COPY fastentrypoint.sh /usr/bin/entrypoint.sh
|
|
16
|
-
|
|
17
|
-
RUN chmod 555 /usr/bin/entrypoint.sh
|
|
18
|
-
|
|
19
|
-
# Build in the container for faster starts.
|
|
20
|
-
RUN python -m pip install --no-cache-dir --upgrade pip
|
|
21
|
-
|
|
22
|
-
RUN pip install --no-cache-dir build
|
|
23
|
-
|
|
24
|
-
RUN git clone --depth 1 https://github.com/mdlacasse/Owl.git owl
|
|
25
|
-
|
|
26
|
-
RUN cd /app/owl && python -m build
|
|
27
|
-
|
|
28
|
-
RUN cd /app/owl && pip install --no-cache-dir .
|
|
29
|
-
|
|
30
|
-
EXPOSE 8501
|
|
31
|
-
|
|
32
|
-
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
|
|
33
|
-
|
|
34
|
-
ENTRYPOINT ["/bin/bash", "/usr/bin/entrypoint.sh"]
|
|
1
|
+
# docker/Dockerfile
|
|
2
|
+
|
|
3
|
+
FROM python:3.13-slim
|
|
4
|
+
|
|
5
|
+
WORKDIR /app
|
|
6
|
+
|
|
7
|
+
RUN apt-get update; \
|
|
8
|
+
apt-get upgrade; \
|
|
9
|
+
apt-get install -y --no-install-recommends \
|
|
10
|
+
curl \
|
|
11
|
+
git \
|
|
12
|
+
; \
|
|
13
|
+
rm -rf /var/lib/apt/lists/*
|
|
14
|
+
|
|
15
|
+
COPY fastentrypoint.sh /usr/bin/entrypoint.sh
|
|
16
|
+
|
|
17
|
+
RUN chmod 555 /usr/bin/entrypoint.sh
|
|
18
|
+
|
|
19
|
+
# Build in the container for faster starts.
|
|
20
|
+
RUN python -m pip install --no-cache-dir --upgrade pip
|
|
21
|
+
|
|
22
|
+
RUN pip install --no-cache-dir build
|
|
23
|
+
|
|
24
|
+
RUN git clone --depth 1 https://github.com/mdlacasse/Owl.git owl
|
|
25
|
+
|
|
26
|
+
RUN cd /app/owl && python -m build
|
|
27
|
+
|
|
28
|
+
RUN cd /app/owl && pip install --no-cache-dir .
|
|
29
|
+
|
|
30
|
+
EXPOSE 8501
|
|
31
|
+
|
|
32
|
+
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
|
|
33
|
+
|
|
34
|
+
ENTRYPOINT ["/bin/bash", "/usr/bin/entrypoint.sh"]
|
|
Binary file
|