owlplanner 2025.5.3__tar.gz → 2025.5.12__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 (126) hide show
  1. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.devcontainer/devcontainer.json +33 -33
  2. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.flake8 +0 -1
  3. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.gitignore +1 -0
  4. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/PKG-INFO +8 -5
  5. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/README.md +6 -4
  6. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_jon+jane.toml +57 -57
  7. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/john+sally.ipynb +13 -0
  8. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/kim+sam.ipynb +234 -222
  9. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/template.ipynb +12 -0
  10. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/tutorial_1.ipynb +1091 -1078
  11. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/tutorial_2.ipynb +12 -0
  12. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/tutorial_3.ipynb +12 -0
  13. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/owlplanner.cmd +1 -0
  14. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/owlplanner.sh +1 -0
  15. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/pyproject.toml +4 -8
  16. owlplanner-2025.5.12/pytest.ini +7 -0
  17. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/requirements.txt +1 -0
  18. owlplanner-2025.5.12/src/owlplanner/__init__.py +8 -0
  19. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/abcapi.py +14 -7
  20. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/config.py +7 -7
  21. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/plan.py +435 -829
  22. owlplanner-2025.5.12/src/owlplanner/plotting/__init__.py +7 -0
  23. owlplanner-2025.5.12/src/owlplanner/plotting/base.py +76 -0
  24. owlplanner-2025.5.12/src/owlplanner/plotting/factory.py +32 -0
  25. owlplanner-2025.5.12/src/owlplanner/plotting/matplotlib_backend.py +432 -0
  26. owlplanner-2025.5.12/src/owlplanner/plotting/plotly_backend.py +980 -0
  27. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/rates.py +40 -68
  28. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/tax2025.py +2 -1
  29. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/timelists.py +3 -8
  30. owlplanner-2025.5.12/src/owlplanner/version.py +1 -0
  31. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_logger.py +3 -3
  32. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_regressions.py +2 -2
  33. owlplanner-2025.5.12/tests/test_ui_asset_allocation.py +14 -0
  34. owlplanner-2025.5.12/tests/test_ui_compare_summaries.py +18 -0
  35. owlplanner-2025.5.12/tests/test_ui_sskeys.py +24 -0
  36. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/About_Owl.py +2 -1
  37. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Create_Case.py +3 -2
  38. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Current_Assets.py +4 -3
  39. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Documentation.py +31 -19
  40. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Graphs.py +5 -3
  41. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Historical_Range.py +3 -3
  42. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Monte_Carlo.py +3 -3
  43. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Optimization_Parameters.py +11 -11
  44. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Output_Files.py +2 -2
  45. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Quick_Start.py +3 -3
  46. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Rates_Selection.py +27 -29
  47. owlplanner-2025.5.12/ui/Settings.py +29 -0
  48. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Wages_And_Contributions.py +2 -2
  49. owlplanner-2025.5.12/ui/__init__.py +0 -0
  50. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/main.py +5 -5
  51. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/owlbridge.py +95 -36
  52. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/requirements.txt +1 -1
  53. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/sskeys.py +12 -4
  54. owlplanner-2025.5.3/Papers/BF01580653.pdf +0 -0
  55. owlplanner-2025.5.3/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
  56. owlplanner-2025.5.3/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
  57. owlplanner-2025.5.3/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +24 -45650
  58. owlplanner-2025.5.3/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +13 -42971
  59. owlplanner-2025.5.3/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
  60. owlplanner-2025.5.3/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
  61. owlplanner-2025.5.3/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
  62. owlplanner-2025.5.3/Papers/bv_cvxbook.pdf +0 -0
  63. owlplanner-2025.5.3/Papers/s10436-006-0062-y.pdf +0 -0
  64. owlplanner-2025.5.3/docs/newowl.tex +0 -1356
  65. owlplanner-2025.5.3/git-cheats +0 -11
  66. owlplanner-2025.5.3/src/owlplanner/__init__.py +0 -6
  67. owlplanner-2025.5.3/src/owlplanner/version.py +0 -1
  68. owlplanner-2025.5.3/ui/Settings.py +0 -33
  69. owlplanner-2025.5.3/ui/main+fonts.py +0 -55
  70. owlplanner-2025.5.3/ui/plots.py +0 -20
  71. owlplanner-2025.5.3/ui/sskeys.py.color +0 -579
  72. owlplanner-2025.5.3/ui/style.css +0 -8
  73. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.gitattributes +0 -0
  74. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.github/workflows/github-actions-runtests.yml +0 -0
  75. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/INSTALL.md +0 -0
  76. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/LICENSE +0 -0
  77. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/USER_GUIDE.md +0 -0
  78. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/Dockerfile +0 -0
  79. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/README.md +0 -0
  80. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/docker-compose.yml +0 -0
  81. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/fastentrypoint.sh +0 -0
  82. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/AD-taxDef.png +0 -0
  83. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/AD-taxFree.png +0 -0
  84. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/AD-taxable.png +0 -0
  85. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/Hist_Bequest.png +0 -0
  86. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/Hist_Spending.png +0 -0
  87. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/MC-tutorial2a.png +0 -0
  88. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/MC-tutorial2b.png +0 -0
  89. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/OwlUI.png +0 -0
  90. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/allocations.png +0 -0
  91. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/owl.png +0 -0
  92. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/profile.png +0 -0
  93. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/ratesCorrelations.png +0 -0
  94. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/ratesPlot.png +0 -0
  95. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/savingsPlot.png +0 -0
  96. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/sourcesPlot.png +0 -0
  97. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/spendingPlot.png +0 -0
  98. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/taxIncomePlot.png +0 -0
  99. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/taxesPlot.png +0 -0
  100. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/owl.pdf +0 -0
  101. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/owl.tex +0 -0
  102. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_jack+jill.toml +0 -0
  103. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_joe.toml +0 -0
  104. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_john+sally.toml +0 -0
  105. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_kim+sam-bequest.toml +0 -0
  106. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_kim+sam-spending.toml +0 -0
  107. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/jack+jill.xlsx +0 -0
  108. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/joe.xlsx +0 -0
  109. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/john+sally.xlsx +0 -0
  110. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/jon+jane.xlsx +0 -0
  111. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/template.xlsx +0 -0
  112. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/data/__init__.py +0 -0
  113. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/data/rates.csv +0 -0
  114. /owlplanner-2025.5.3/src/owlplanner/logging.py → /owlplanner-2025.5.12/src/owlplanner/mylogging.py +0 -0
  115. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/progress.py +0 -0
  116. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/utils.py +0 -0
  117. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_repro.py +0 -0
  118. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_toml_cases.py +0 -0
  119. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_units.py +0 -0
  120. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Asset_Allocation.py +0 -0
  121. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Fixed_Income.py +0 -0
  122. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Logs.py +0 -0
  123. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/README.md +0 -0
  124. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Worksheets.py +0 -0
  125. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/progress.py +0 -0
  126. {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/tomlexamples.py +0 -0
@@ -1,33 +1,33 @@
1
- {
2
- "name": "Python 3",
3
- // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
4
- "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye",
5
- "customizations": {
6
- "codespaces": {
7
- "openFiles": [
8
- "README.md",
9
- "ui/main.py"
10
- ]
11
- },
12
- "vscode": {
13
- "settings": {},
14
- "extensions": [
15
- "ms-python.python",
16
- "ms-python.vscode-pylance"
17
- ]
18
- }
19
- },
20
- "updateContentCommand": "[ -f packages.txt ] && sudo apt update && sudo apt upgrade -y && sudo xargs apt install -y <packages.txt; [ -f requirements.txt ] && pip3 install --user -r requirements.txt; pip3 install --user streamlit; echo '✅ Packages installed and Requirements met'",
21
- "postAttachCommand": {
22
- "server": "streamlit run ui/main.py --server.enableCORS false --server.enableXsrfProtection false"
23
- },
24
- "portsAttributes": {
25
- "8501": {
26
- "label": "Application",
27
- "onAutoForward": "openPreview"
28
- }
29
- },
30
- "forwardPorts": [
31
- 8501
32
- ]
33
- }
1
+ {
2
+ "name": "Python 3",
3
+ // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
4
+ "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye",
5
+ "customizations": {
6
+ "codespaces": {
7
+ "openFiles": [
8
+ "README.md",
9
+ "ui/main.py"
10
+ ]
11
+ },
12
+ "vscode": {
13
+ "settings": {},
14
+ "extensions": [
15
+ "ms-python.python",
16
+ "ms-python.vscode-pylance"
17
+ ]
18
+ }
19
+ },
20
+ "updateContentCommand": "[ -f packages.txt ] && sudo apt update && sudo apt upgrade -y && sudo xargs apt install -y <packages.txt; [ -f requirements.txt ] && pip3 install --user -r requirements.txt; pip3 install --user streamlit; echo '✅ Packages installed and Requirements met'",
21
+ "postAttachCommand": {
22
+ "server": "streamlit run ui/main.py --server.enableCORS false --server.enableXsrfProtection false"
23
+ },
24
+ "portsAttributes": {
25
+ "8501": {
26
+ "label": "Application",
27
+ "onAutoForward": "openPreview"
28
+ }
29
+ },
30
+ "forwardPorts": [
31
+ 8501
32
+ ]
33
+ }
@@ -1,6 +1,5 @@
1
1
  [flake8]
2
2
  max-line-length = 120
3
- max-complexity = 70
4
3
  # These checks violate PEP8 so let's ignore them
5
4
  extend-ignore = E203
6
5
  # extend-exclude = */site-packages/*
@@ -4,6 +4,7 @@ dist
4
4
  *~
5
5
  *.aux
6
6
  *.log
7
+ .coverage
7
8
  otherFiles
8
9
  myfiles
9
10
  secrets
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.5.3
3
+ Version: 2025.5.12
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
@@ -695,6 +695,7 @@ Requires-Dist: matplotlib
695
695
  Requires-Dist: numpy
696
696
  Requires-Dist: openpyxl
697
697
  Requires-Dist: pandas
698
+ Requires-Dist: plotly
698
699
  Requires-Dist: scipy
699
700
  Requires-Dist: seaborn
700
701
  Requires-Dist: streamlit
@@ -711,15 +712,17 @@ Description-Content-Type: text/markdown
711
712
  -------------------------------------------------------------------------------------
712
713
 
713
714
  ### TL;DR
714
- Owl is a retirement planning tool that uses a linear programming optimization algorithm
715
- to provide guidance on retirement decisions, including Roth conversions.
715
+ Owl is a financial retirement planning tool that uses a linear programming
716
+ optimization algorithm to provide guidance on retirement decisions
717
+ such as contributions, withdrawals, Roth conversions, and more.
716
718
  Users can select varying return rates to perform historical back testing,
717
719
  stochastic rates for performing Monte Carlo analyses,
718
720
  or fixed rates either derived from historical averages, or set by the user.
719
721
 
720
722
  There are a few ways to run Owl:
721
723
 
722
- - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
724
+ - Run Owl directly on the Streamlit Community Server at
725
+ [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
723
726
 
724
727
  - Run locally on your computer using a Docker image.
725
728
  Follow these [instructions](docker/README.md) for this option.
@@ -729,7 +732,7 @@ Follow these [instructions](INSTALL.md) to install Owl from the source code and
729
732
 
730
733
  -------------------------------------------------------------------------------------
731
734
  ## Overview
732
- This package is a retirement modeling framework for exploring the sensitivity of retirement financial decisions.
735
+ This package is a modeling framework for exploring the sensitivity of retirement financial decisions.
733
736
  Strictly speaking, it is not a planning tool, but more an environment for exploring *what if* scenarios.
734
737
  It provides different realizations of a financial strategy through the rigorous
735
738
  mathematical optimization of relevant decision variables. Two major objective goals can be set: either
@@ -8,15 +8,17 @@
8
8
  -------------------------------------------------------------------------------------
9
9
 
10
10
  ### TL;DR
11
- Owl is a retirement planning tool that uses a linear programming optimization algorithm
12
- to provide guidance on retirement decisions, including Roth conversions.
11
+ Owl is a financial retirement planning tool that uses a linear programming
12
+ optimization algorithm to provide guidance on retirement decisions
13
+ such as contributions, withdrawals, Roth conversions, and more.
13
14
  Users can select varying return rates to perform historical back testing,
14
15
  stochastic rates for performing Monte Carlo analyses,
15
16
  or fixed rates either derived from historical averages, or set by the user.
16
17
 
17
18
  There are a few ways to run Owl:
18
19
 
19
- - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
20
+ - Run Owl directly on the Streamlit Community Server at
21
+ [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
20
22
 
21
23
  - Run locally on your computer using a Docker image.
22
24
  Follow these [instructions](docker/README.md) for this option.
@@ -26,7 +28,7 @@ Follow these [instructions](INSTALL.md) to install Owl from the source code and
26
28
 
27
29
  -------------------------------------------------------------------------------------
28
30
  ## Overview
29
- This package is a retirement modeling framework for exploring the sensitivity of retirement financial decisions.
31
+ This package is a modeling framework for exploring the sensitivity of retirement financial decisions.
30
32
  Strictly speaking, it is not a planning tool, but more an environment for exploring *what if* scenarios.
31
33
  It provides different realizations of a financial strategy through the rigorous
32
34
  mathematical optimization of relevant decision variables. Two major objective goals can be set: either
@@ -1,57 +1,57 @@
1
- "Plan Name" = "Jon+Jane"
2
- Description = "This case reproduces a similar case discussed a while back on i-orp. It involves 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
-
4
- ["Basic Info"]
5
- Status = "married"
6
- Names = [ "Jon", "Jane",]
7
- "Birth year" = [ 1965, 1968,]
8
- "Life expectancy" = [ 92, 92,]
9
- "Start date" = "01-01"
10
-
11
- [Assets]
12
- "taxable savings balances" = [ 50.0, 0.0,]
13
- "tax-deferred savings balances" = [ 900.0, 500.0,]
14
- "tax-free savings balances" = [ 0.0, 0.0,]
15
- "Beneficiary fractions" = [ 1.0, 1.0, 1.0,]
16
- "Spousal surplus deposit fraction" = 0.0
17
-
18
- ["Wages and Contributions"]
19
- "Contributions file name" = "edited values"
20
-
21
- ["Fixed Income"]
22
- "Pension amounts" = [ 0.0, 0.0,]
23
- "Pension ages" = [ 65, 65,]
24
- "Pension indexed" = [ false, false,]
25
- "Social security amounts" = [ 21.0, 21.0,]
26
- "Social security ages" = [ 65, 65,]
27
-
28
- ["Rates Selection"]
29
- "Heirs rate on tax-deferred estate" = 30.0
30
- "Long-term capital gain tax rate" = 15.0
31
- "Dividend tax rate" = 2.0
32
- "TCJA expiration year" = 2026
33
- Method = "user"
34
- Values = [ 10.0, 0.0, 0.0, 3.5000000000000004,]
35
- From = 1928
36
- To = 2024
37
-
38
- ["Asset Allocation"]
39
- "Interpolation method" = "linear"
40
- "Interpolation center" = 15.0
41
- "Interpolation width" = 5.0
42
- Type = "individual"
43
- generic = [ [ [ 100, 0, 0, 0,], [ 100, 0, 0, 0,],], [ [ 100, 0, 0, 0,], [ 100, 0, 0, 0,],],]
44
-
45
- ["Optimization Parameters"]
46
- "Spending profile" = "flat"
47
- "Surviving spouse spending percent" = 60
48
- Objective = "maxSpending"
49
-
50
- ["Solver Options"]
51
- maxRothConversion = 0.0
52
- noRothConversions = "None"
53
- withMedicare = true
54
- bequest = 30.0
55
-
56
- [Results]
57
- "Default plots" = "today"
1
+ "Plan Name" = "Jon+Jane"
2
+ Description = "This case reproduces a similar case discussed a while back on i-orp. It involves 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
+
4
+ ["Basic Info"]
5
+ Status = "married"
6
+ Names = [ "Jon", "Jane",]
7
+ "Birth year" = [ 1965, 1968,]
8
+ "Life expectancy" = [ 92, 92,]
9
+ "Start date" = "01-01"
10
+
11
+ [Assets]
12
+ "taxable savings balances" = [ 50.0, 0.0,]
13
+ "tax-deferred savings balances" = [ 900.0, 500.0,]
14
+ "tax-free savings balances" = [ 0.0, 0.0,]
15
+ "Beneficiary fractions" = [ 1.0, 1.0, 1.0,]
16
+ "Spousal surplus deposit fraction" = 0.0
17
+
18
+ ["Wages and Contributions"]
19
+ "Contributions file name" = "edited values"
20
+
21
+ ["Fixed Income"]
22
+ "Pension amounts" = [ 0.0, 0.0,]
23
+ "Pension ages" = [ 65, 65,]
24
+ "Pension indexed" = [ false, false,]
25
+ "Social security amounts" = [ 21.0, 21.0,]
26
+ "Social security ages" = [ 65, 65,]
27
+
28
+ ["Rates Selection"]
29
+ "Heirs rate on tax-deferred estate" = 30.0
30
+ "Long-term capital gain tax rate" = 15.0
31
+ "Dividend tax rate" = 2.0
32
+ "TCJA expiration year" = 2026
33
+ Method = "user"
34
+ Values = [ 10.0, 0.0, 0.0, 3.5000000000000004,]
35
+ From = 1928
36
+ To = 2024
37
+
38
+ ["Asset Allocation"]
39
+ "Interpolation method" = "linear"
40
+ "Interpolation center" = 15.0
41
+ "Interpolation width" = 5.0
42
+ Type = "individual"
43
+ generic = [ [ [ 100, 0, 0, 0,], [ 100, 0, 0, 0,],], [ [ 100, 0, 0, 0,], [ 100, 0, 0, 0,],],]
44
+
45
+ ["Optimization Parameters"]
46
+ "Spending profile" = "flat"
47
+ "Surviving spouse spending percent" = 60
48
+ Objective = "maxSpending"
49
+
50
+ ["Solver Options"]
51
+ maxRothConversion = 0.0
52
+ noRothConversions = "None"
53
+ withMedicare = true
54
+ bequest = 30.0
55
+
56
+ [Results]
57
+ "Default plots" = "today"
@@ -14,6 +14,17 @@
14
14
  "## John and Sally (a case from Eric Sajdak)"
15
15
  ]
16
16
  },
17
+ {
18
+ "cell_type": "code",
19
+ "execution_count": null,
20
+ "id": "5cb2c2a1-6f77-41bf-a22d-42863c756eeb",
21
+ "metadata": {},
22
+ "outputs": [],
23
+ "source": [
24
+ "import sys\n",
25
+ "sys.path.insert(0, \"../src\")"
26
+ ]
27
+ },
17
28
  {
18
29
  "cell_type": "code",
19
30
  "execution_count": null,
@@ -29,7 +40,9 @@
29
40
  "source": [
30
41
  "%%time\n",
31
42
  "import owlplanner as owl\n",
43
+ "\n",
32
44
  "plan = owl.Plan(['John', 'Sally'], [1962, 1962], [92, 92], 'john+sally')\n",
45
+ "# plan.setPlotBackend(\"plotly\")\n",
33
46
  "plan.setAccountBalances(taxable=[200, 200], taxDeferred=[750, 750], taxFree=[50, 50])\n",
34
47
  "# Unrealistic empty contributions and wages\n",
35
48
  "plan.readContributions('../examples/john+sally.xlsx')\n",