owlplanner 2025.2.23__tar.gz → 2025.2.25__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.2.23 → owlplanner-2025.2.25}/PKG-INFO +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/case_jack+jill.toml +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/case_joe.toml +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/case_john+sally.toml +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/case_jon+jane.toml +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/case_kim+sam-bequest.toml +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/case_kim+sam-spending.toml +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/pyproject.toml +1 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/plan.py +4 -1
- owlplanner-2025.2.25/src/owlplanner/version.py +1 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Documentation.py +11 -4
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/requirements.txt +1 -1
- owlplanner-2025.2.23/src/owlplanner/version.py +0 -1
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/.flake8 +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/.gitattributes +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/.gitignore +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/INSTALL.md +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/LICENSE +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/README.md +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/USER_GUIDE.md +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docker/Dockerfile +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docker/README.md +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docker/fastentrypoint.sh +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/allocations.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/owl.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/profile.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/owl.pdf +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/docs/owl.tex +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/joe.xlsx +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/examples/template.xlsx +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/notebooks/template.ipynb +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/notebooks/tutorial_1.ipynb +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/notebooks/tutorial_2.ipynb +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/notebooks/tutorial_3.ipynb +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/owlplanner.cmd +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/owlplanner.sh +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/requirements.txt +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/abcapi.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/config.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/logging.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/rates.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/tax2025.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/tests/test_logger.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/tests/test_regressions.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/tests/test_repro.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/tests/test_toml_cases.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/tests/test_units.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ttt.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/About_Owl.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Assets.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Create_Case.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Graphs.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Historical_Range.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Logs.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Monte_Carlo.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Optimization_Parameters.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Output_Files.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Quick_Start.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/README.md +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Rates_Selection.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Settings.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Wages_And_Contributions.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/Worksheets.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/main+fonts.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/main.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/owlbridge.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/plots.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/progress.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/sskeys.py +0 -0
- {owlplanner-2025.2.23 → owlplanner-2025.2.25}/ui/style.css +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"Plan Name" = "jack+jill"
|
|
2
|
-
Description = "This example case
|
|
2
|
+
Description = "This example case aims to demonstrate some of Owl's capabilities. Jack and Jill are a married couple a few years from retirement. A wages and contributions file called 'jack+jill.xlsx' is associated with this case."
|
|
3
3
|
|
|
4
4
|
["Basic Info"]
|
|
5
5
|
Status = "married"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"Plan Name" = "joe"
|
|
2
|
-
Description = "This example
|
|
2
|
+
Description = "This is an example of a case involving a single individual. Joe is single and will retire in a few years. His wages and contributions are contained in the 'joe.xlsx' spreadsheet."
|
|
3
3
|
|
|
4
4
|
["Basic Info"]
|
|
5
5
|
Status = "single"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"Plan Name" = "john+sally"
|
|
2
|
-
Description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak."
|
|
2
|
+
Description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak. This case can be used to compare the heuristic strategy of surfing a tax bracket for performing Roth conversions to a solution optimized by linear programming. The former is a good approach when one assumes fixed rates. When rates are varying, and the market drops, an optimized solution shows that it is sometime advantageous to convert above the target tax bracket. File 'john+sally.xlsx' contains wages and contributions associated with this case. Run this case with different rates to see the effect on Roth conversions."
|
|
3
3
|
|
|
4
4
|
["Basic Info"]
|
|
5
5
|
Status = "married"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"Plan Name" = "Jon+Jane"
|
|
2
|
-
Description = "
|
|
2
|
+
Description = "This case is similar to a case discussed by i-orp. It involve Jon and Jane close to retirement, and assumes a base case of optimistic returns of 10% with an inflation of 3.5%. A wages and contributions file called 'jon+jane.xlsx' is associated with this case."
|
|
3
3
|
|
|
4
4
|
["Basic Info"]
|
|
5
5
|
Status = "married"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"Plan Name" = "kim+sam-bequest"
|
|
2
|
-
Description = "Kim and Sam
|
|
2
|
+
Description = "This is the case of Kim and Sam used as an example case for optimizing bequest and Roth conversions. No wages and contributions file is associated with this case."
|
|
3
3
|
|
|
4
4
|
["Basic Info"]
|
|
5
5
|
Status = "married"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"Plan Name" = "kim+sam-spending"
|
|
2
|
-
Description = "Kim and Sam
|
|
2
|
+
Description = "This is the case of Kim and Sam used as an example case for optimizing spending and Roth conversions. No wages and contributions is associated with this case."
|
|
3
3
|
|
|
4
4
|
["Basic Info"]
|
|
5
5
|
Status = "married"
|
|
@@ -34,6 +34,10 @@ from owlplanner import logging
|
|
|
34
34
|
from owlplanner import progress
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
# This makes all graphs appear have the same height.
|
|
38
|
+
plt.rcParams.update({'figure.autolayout': True})
|
|
39
|
+
|
|
40
|
+
|
|
37
41
|
def _genGamma_n(tau):
|
|
38
42
|
"""
|
|
39
43
|
Utility function to generate a cumulative inflation multiplier
|
|
@@ -2077,7 +2081,6 @@ class Plan(object):
|
|
|
2077
2081
|
dic = {}
|
|
2078
2082
|
# Results
|
|
2079
2083
|
dic["Plan name"] = self._name
|
|
2080
|
-
dic["Brief description"] = self._description
|
|
2081
2084
|
dic[f"Net yearly spending basis in {now}$"] = u.d(self.g_n[0] / self.xi_n[0])
|
|
2082
2085
|
dic[f"Net yearly spending for year {now}"] = u.d(self.g_n[0] / self.yearFracLeft)
|
|
2083
2086
|
dic[f"Net spending remaining in year {now}"] = u.d(self.g_n[0])
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2025.02.25"
|
|
@@ -135,14 +135,21 @@ The wages and contributions data contains 9 columns titled as follows:
|
|
|
135
135
|
| ... | | | | | | | | |
|
|
136
136
|
|20XX | | | | | | | | |
|
|
137
137
|
|
|
138
|
-
Here, 20XX represents the last row which could be the last year based on the life
|
|
138
|
+
Here, 20XX represents the last row which could be the last year based on the life
|
|
139
|
+
expectancy values provided.
|
|
139
140
|
While loading an Excel workbook, missing years or empty cells will be filled with zero values,
|
|
140
141
|
while years outside the time span of the plan will be ignored.
|
|
141
142
|
For the columns, *anticipated wages* is the annual amount
|
|
142
|
-
(gross minus tax-deferred contributions) that you anticipate to receive from employment
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
(gross minus tax-deferred contributions) that you anticipate to receive from employment
|
|
144
|
+
or other sources (e.g. rentals).
|
|
145
|
+
This column does not include dividends from your taxable investment accounts,
|
|
146
|
+
as they will be calculated based on your return rate assumptions.
|
|
147
|
+
|
|
148
|
+
Note that column names are case sensitive and all entries must be in lower case.
|
|
149
|
+
The easiest way to complete the process of filling this file is either to start from the template
|
|
145
150
|
file provided [here](https://raw.github.com/mdlacasse/Owl/main/examples/template.xlsx).
|
|
151
|
+
Values can also be filled in the user interface, but this approach does not have
|
|
152
|
+
Excel capabilities for cross-column calculations.
|
|
146
153
|
|
|
147
154
|
For the purpose of planning, there is no clear definition of retirement age. There will be a year,
|
|
148
155
|
however, from which you will stop having anticipated income, or diminished income due to decreasing your
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2025.02.23"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|