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.
Files changed (112) hide show
  1. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.github/workflows/github-actions-runtests.yml +1 -1
  2. owlplanner-2025.5.30/.streamlit/config.toml +2 -0
  3. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/PKG-INFO +2 -2
  4. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/README.md +1 -1
  5. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/owl.pdf +0 -0
  6. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/owl.tex +1 -1
  7. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_jack+jill.toml +1 -1
  8. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_joe.toml +1 -1
  9. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_john+sally.toml +1 -1
  10. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_jon+jane.toml +2 -2
  11. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_kim+sam-bequest.toml +1 -1
  12. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/case_kim+sam-spending.toml +1 -1
  13. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/template.ipynb +23 -18
  14. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/tutorial_1.ipynb +1080 -1091
  15. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/tutorial_2.ipynb +389 -389
  16. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/tutorial_3.ipynb +422 -422
  17. owlplanner-2025.5.30/owlplanner.sh +9 -0
  18. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/pyproject.toml +3 -3
  19. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/config.py +6 -7
  20. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plan.py +83 -84
  21. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/base.py +3 -3
  22. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/matplotlib_backend.py +18 -21
  23. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/plotly_backend.py +26 -29
  24. owlplanner-2025.5.30/src/owlplanner/version.py +1 -0
  25. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_regressions.py +86 -65
  26. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_repro.py +18 -18
  27. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_toml_cases.py +4 -4
  28. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/About_Owl.py +1 -0
  29. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Create_Case.py +11 -26
  30. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Current_Assets.py +9 -0
  31. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Documentation.py +319 -199
  32. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Optimization_Parameters.py +2 -3
  33. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Output_Files.py +15 -10
  34. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Quick_Start.py +5 -5
  35. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Rates_Selection.py +17 -8
  36. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Settings.py +11 -2
  37. owlplanner-2025.5.15/ui/Wages_And_Contributions.py → owlplanner-2025.5.30/ui/Wages_and_Contributions.py +6 -1
  38. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/main.py +1 -11
  39. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/owlbridge.py +36 -17
  40. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/sskeys.py +18 -17
  41. owlplanner-2025.5.15/owlplanner.sh +0 -10
  42. owlplanner-2025.5.15/src/owlplanner/version.py +0 -1
  43. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.devcontainer/devcontainer.json +0 -0
  44. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.flake8 +0 -0
  45. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.gitattributes +0 -0
  46. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.gitignore +0 -0
  47. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/.streamlit/fullconfig.toml +0 -0
  48. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/INSTALL.md +0 -0
  49. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/LICENSE +0 -0
  50. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/USER_GUIDE.md +0 -0
  51. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/Dockerfile.build +0 -0
  52. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/Dockerfile.run +0 -0
  53. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/README.md +0 -0
  54. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/buildentrypoint.sh +0 -0
  55. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/docker-compose.yml +0 -0
  56. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docker/runentrypoint.sh +0 -0
  57. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/AD-taxDef.png +0 -0
  58. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/AD-taxFree.png +0 -0
  59. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/AD-taxable.png +0 -0
  60. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/Hist_Bequest.png +0 -0
  61. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/Hist_Spending.png +0 -0
  62. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/MC-tutorial2a.png +0 -0
  63. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/MC-tutorial2b.png +0 -0
  64. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/OwlUI.png +0 -0
  65. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/allocations.png +0 -0
  66. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/owl.png +0 -0
  67. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/profile.png +0 -0
  68. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/ratesCorrelations.png +0 -0
  69. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/ratesPlot.png +0 -0
  70. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/savingsPlot.png +0 -0
  71. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/sourcesPlot.png +0 -0
  72. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/spendingPlot.png +0 -0
  73. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/taxIncomePlot.png +0 -0
  74. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/docs/images/taxesPlot.png +0 -0
  75. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/jack+jill.xlsx +0 -0
  76. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/joe.xlsx +0 -0
  77. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/john+sally.xlsx +0 -0
  78. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/jon+jane.xlsx +0 -0
  79. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/examples/template.xlsx +0 -0
  80. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/john+sally.ipynb +0 -0
  81. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/notebooks/kim+sam.ipynb +0 -0
  82. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/owlplanner.cmd +0 -0
  83. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/pytest.ini +0 -0
  84. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/requirements.txt +0 -0
  85. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/__init__.py +0 -0
  86. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/abcapi.py +0 -0
  87. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/data/__init__.py +0 -0
  88. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/data/rates.csv +0 -0
  89. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/mylogging.py +0 -0
  90. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/__init__.py +0 -0
  91. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/plotting/factory.py +0 -0
  92. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/progress.py +0 -0
  93. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/rates.py +0 -0
  94. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/tax2025.py +0 -0
  95. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/timelists.py +0 -0
  96. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/src/owlplanner/utils.py +0 -0
  97. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_logger.py +0 -0
  98. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_ui_asset_allocation.py +0 -0
  99. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_ui_compare_summaries.py +0 -0
  100. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_ui_sskeys.py +0 -0
  101. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/tests/test_units.py +0 -0
  102. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Asset_Allocation.py +0 -0
  103. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Fixed_Income.py +0 -0
  104. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Graphs.py +0 -0
  105. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Historical_Range.py +0 -0
  106. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Logs.py +0 -0
  107. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Monte_Carlo.py +0 -0
  108. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/README.md +0 -0
  109. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/Worksheets.py +0 -0
  110. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/__init__.py +0 -0
  111. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/progress.py +0 -0
  112. {owlplanner-2025.5.15 → owlplanner-2025.5.30}/ui/tomlexamples.py +0 -0
@@ -12,7 +12,7 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- python-version: ["3.9", "3.10", "3.12", "3.13"]
15
+ python-version: ["3.9", "3.10", "3.13"]
16
16
 
17
17
  steps:
18
18
  - uses: actions/checkout@v4
@@ -0,0 +1,2 @@
1
+ [theme]
2
+ base = "dark"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.5.15
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 retirement planning tool that uses a linear programming
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 retirement planning tool that uses a linear programming
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,
@@ -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 account for withdrawals $w$
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 tax rate" = 2.0
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 tax rate" = 2.0
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 tax rate" = 2.0
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 tax rate" = 2.0
31
+ "Dividend rate" = 1.8
32
32
  "TCJA expiration year" = 2026
33
33
  Method = "user"
34
- Values = [ 10.0, 0.0, 0.0, 3.5000000000000004,]
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 tax rate" = 2.0
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 tax rate" = 2.0
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,