owlplanner 2025.5.15__tar.gz → 2025.5.30__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.5.15 → owlplanner-2025.5.30}/.github/workflows/github-actions-runtests.yml +1 -1
- owlplanner-2025.5.30/.streamlit/config.toml +2 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/PKG-INFO +2 -2
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/README.md +1 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/owl.pdf +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/owl.tex +1 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_jack+jill.toml +1 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_joe.toml +1 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_john+sally.toml +1 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_jon+jane.toml +2 -2
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_kim+sam-bequest.toml +1 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_kim+sam-spending.toml +1 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/template.ipynb +23 -18
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/tutorial_1.ipynb +1080 -1091
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/tutorial_2.ipynb +389 -389
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/tutorial_3.ipynb +422 -422
- owlplanner-2025.5.30/owlplanner.sh +9 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/pyproject.toml +3 -3
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/config.py +6 -7
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plan.py +83 -84
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/base.py +3 -3
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/matplotlib_backend.py +18 -21
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/plotly_backend.py +26 -29
- owlplanner-2025.5.30/src/owlplanner/version.py +1 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_regressions.py +86 -65
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_repro.py +18 -18
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_toml_cases.py +4 -4
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/About_Owl.py +1 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Create_Case.py +11 -26
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Current_Assets.py +9 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Documentation.py +319 -199
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Optimization_Parameters.py +2 -3
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Output_Files.py +15 -10
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Quick_Start.py +5 -5
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Rates_Selection.py +17 -8
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Settings.py +11 -2
- owlplanner-2025.5.15/ui/Wages_And_Contributions.py → owlplanner-2025.5.30/ui/Wages_and_Contributions.py +6 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/main.py +1 -11
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/owlbridge.py +36 -17
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/sskeys.py +18 -17
- owlplanner-2025.5.15/owlplanner.sh +0 -10
- owlplanner-2025.5.15/src/owlplanner/version.py +0 -1
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.flake8 +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.gitattributes +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.gitignore +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.streamlit/fullconfig.toml +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/INSTALL.md +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/LICENSE +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/USER_GUIDE.md +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/Dockerfile.build +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/Dockerfile.run +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/README.md +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/buildentrypoint.sh +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/runentrypoint.sh +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/allocations.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/owl.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/profile.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/joe.xlsx +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/template.xlsx +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/owlplanner.cmd +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/pytest.ini +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/requirements.txt +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/abcapi.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/mylogging.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/__init__.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/factory.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/rates.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/tax2025.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_logger.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_ui_asset_allocation.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_ui_compare_summaries.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_ui_sskeys.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_units.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Graphs.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Historical_Range.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Logs.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Monte_Carlo.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/README.md +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Worksheets.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/__init__.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/progress.py +0 -0
- {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/tomlexamples.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owlplanner
|
|
3
|
-
Version: 2025.5.
|
|
3
|
+
Version: 2025.5.30
|
|
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
|
|
@@ -714,7 +714,7 @@ Description-Content-Type: text/markdown
|
|
|
714
714
|
-------------------------------------------------------------------------------------
|
|
715
715
|
|
|
716
716
|
### TL;DR
|
|
717
|
-
Owl is a financial
|
|
717
|
+
Owl is a retirement financial planning tool that uses a linear programming
|
|
718
718
|
optimization algorithm to provide guidance on retirement decisions
|
|
719
719
|
such as contributions, withdrawals, Roth conversions, and more.
|
|
720
720
|
Users can select varying return rates to perform historical back testing,
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
-------------------------------------------------------------------------------------
|
|
9
9
|
|
|
10
10
|
### TL;DR
|
|
11
|
-
Owl is a financial
|
|
11
|
+
Owl is a retirement financial planning tool that uses a linear programming
|
|
12
12
|
optimization algorithm to provide guidance on retirement decisions
|
|
13
13
|
such as contributions, withdrawals, Roth conversions, and more.
|
|
14
14
|
Users can select varying return rates to perform historical back testing,
|
|
Binary file
|
|
@@ -435,7 +435,7 @@ All intermediate variables are in uppercase letters.
|
|
|
435
435
|
Notice that we are using return rates from the previous year.
|
|
436
436
|
The first terms on the right-hand side represent dividends generated by
|
|
437
437
|
equities $(k=0)$ in the $(j=0)$ taxable savings account plus
|
|
438
|
-
half the yearly contributions. The second term
|
|
438
|
+
half the yearly contributions. The second term accounts for withdrawals $w$
|
|
439
439
|
of equities assumed to have been purchased a year ago.
|
|
440
440
|
It does not account for losses, but a market drop
|
|
441
441
|
would most likely result in stock purchase rather than sale.
|
|
@@ -28,7 +28,7 @@ Names = [ "Jack", "Jill",]
|
|
|
28
28
|
["Rates Selection"]
|
|
29
29
|
"Heirs rate on tax-deferred estate" = 30.0
|
|
30
30
|
"Long-term capital gain tax rate" = 15.0
|
|
31
|
-
"Dividend
|
|
31
|
+
"Dividend rate" = 1.8
|
|
32
32
|
"TCJA expiration year" = 2026
|
|
33
33
|
Method = "historical"
|
|
34
34
|
From = 1969
|
|
@@ -26,7 +26,7 @@ Names = [ "Joe",]
|
|
|
26
26
|
["Rates Selection"]
|
|
27
27
|
"Heirs rate on tax-deferred estate" = 30.0
|
|
28
28
|
"Long-term capital gain tax rate" = 15.0
|
|
29
|
-
"Dividend
|
|
29
|
+
"Dividend rate" = 1.8
|
|
30
30
|
"TCJA expiration year" = 2026
|
|
31
31
|
Method = "historical average"
|
|
32
32
|
From = 1969
|
|
@@ -28,7 +28,7 @@ Names = [ "John", "Sally",]
|
|
|
28
28
|
["Rates Selection"]
|
|
29
29
|
"Heirs rate on tax-deferred estate" = 30.0
|
|
30
30
|
"Long-term capital gain tax rate" = 15.0
|
|
31
|
-
"Dividend
|
|
31
|
+
"Dividend rate" = 1.8
|
|
32
32
|
"TCJA expiration year" = 2026
|
|
33
33
|
Method = "historical average"
|
|
34
34
|
From = 1990
|
|
@@ -28,10 +28,10 @@ Names = [ "Jon", "Jane",]
|
|
|
28
28
|
["Rates Selection"]
|
|
29
29
|
"Heirs rate on tax-deferred estate" = 30.0
|
|
30
30
|
"Long-term capital gain tax rate" = 15.0
|
|
31
|
-
"Dividend
|
|
31
|
+
"Dividend rate" = 1.8
|
|
32
32
|
"TCJA expiration year" = 2026
|
|
33
33
|
Method = "user"
|
|
34
|
-
Values = [ 10.0,
|
|
34
|
+
Values = [ 10.0, 6.0, 5.0, 3.5000000000000004,]
|
|
35
35
|
From = 1928
|
|
36
36
|
To = 2024
|
|
37
37
|
|
|
@@ -28,7 +28,7 @@ Names = [ "Kim", "Sam",]
|
|
|
28
28
|
["Rates Selection"]
|
|
29
29
|
"Heirs rate on tax-deferred estate" = 33.0
|
|
30
30
|
"Long-term capital gain tax rate" = 15.0
|
|
31
|
-
"Dividend
|
|
31
|
+
"Dividend rate" = 1.8
|
|
32
32
|
"TCJA expiration year" = 2026
|
|
33
33
|
Method = "conservative"
|
|
34
34
|
From = 1922
|
|
@@ -28,7 +28,7 @@ Names = [ "Kim", "Sam",]
|
|
|
28
28
|
["Rates Selection"]
|
|
29
29
|
"Heirs rate on tax-deferred estate" = 33.0
|
|
30
30
|
"Long-term capital gain tax rate" = 15.0
|
|
31
|
-
"Dividend
|
|
31
|
+
"Dividend rate" = 1.8
|
|
32
32
|
"TCJA expiration year" = 2026
|
|
33
33
|
Method = "conservative"
|
|
34
34
|
From = 1922
|
|
@@ -138,24 +138,6 @@
|
|
|
138
138
|
"plan = owl.Plan(['Kim', 'Sam'], [YYYY, YYYY], [AA, AA], 'Kim+Sam-spending', verbose=True)"
|
|
139
139
|
]
|
|
140
140
|
},
|
|
141
|
-
{
|
|
142
|
-
"cell_type": "markdown",
|
|
143
|
-
"id": "d1b5aabe",
|
|
144
|
-
"metadata": {},
|
|
145
|
-
"source": [
|
|
146
|
-
"By default, the starting date is today, and therefore the returns of the current year are reduced in proportion of how late we are in the year. An arbitrary date can be chosen as a starting point in the current year, using the optional parameter startDate. This will only affect the first year: the plan will still end at the end of the last year. For example, using startDate='01-01' would select January 1st, the beginning of the year. This is useful for reproducibility studies. Here is an example:"
|
|
147
|
-
]
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
"cell_type": "code",
|
|
151
|
-
"execution_count": null,
|
|
152
|
-
"id": "8a106c03",
|
|
153
|
-
"metadata": {},
|
|
154
|
-
"outputs": [],
|
|
155
|
-
"source": [
|
|
156
|
-
"# plan = owl.Plan(['Kim', 'Sam'], [YYYY, YYYY], [AA, AA], 'Kim+Sam-spending', startDate='01-01')"
|
|
157
|
-
]
|
|
158
|
-
},
|
|
159
141
|
{
|
|
160
142
|
"cell_type": "markdown",
|
|
161
143
|
"id": "47f309e7-0654-4f75-87b5-921167db4a6a",
|
|
@@ -204,6 +186,29 @@
|
|
|
204
186
|
"Benificiary fractions are entered as [1, 1, 1], i.e., one for each type of account. Default is to leave everything to the living spouse."
|
|
205
187
|
]
|
|
206
188
|
},
|
|
189
|
+
{
|
|
190
|
+
"cell_type": "markdown",
|
|
191
|
+
"id": "090914eb-78f3-4e85-bdc9-e7fa03b75aaf",
|
|
192
|
+
"metadata": {},
|
|
193
|
+
"source": [
|
|
194
|
+
"By default, the account balances are assumed to be known as of today, and amounts will be back projected to Jan 1st using the assumed return rates. An arbitrary date can be chosen as a reference point in the current year, using the optional parameter startDate. For example, using startDate='01-01' would select January 1st, the beginning of the year. This is useful for reproducibility studies. Here is an example:"
|
|
195
|
+
]
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"cell_type": "code",
|
|
199
|
+
"execution_count": null,
|
|
200
|
+
"id": "49109e26-bea3-49df-8377-3343111ebfac",
|
|
201
|
+
"metadata": {},
|
|
202
|
+
"outputs": [],
|
|
203
|
+
"source": [
|
|
204
|
+
"plan.setAccountBalances(\n",
|
|
205
|
+
" taxable=[XX, XX],\n",
|
|
206
|
+
" taxDeferred=[XX, XX],\n",
|
|
207
|
+
" taxFree=[XX, XX],\n",
|
|
208
|
+
" startDate=\"01-01\"\n",
|
|
209
|
+
")"
|
|
210
|
+
]
|
|
211
|
+
},
|
|
207
212
|
{
|
|
208
213
|
"cell_type": "code",
|
|
209
214
|
"execution_count": null,
|