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.
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.devcontainer/devcontainer.json +33 -33
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.flake8 +0 -1
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.gitignore +1 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/PKG-INFO +8 -5
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/README.md +6 -4
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_jon+jane.toml +57 -57
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/john+sally.ipynb +13 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/kim+sam.ipynb +234 -222
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/template.ipynb +12 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/tutorial_1.ipynb +1091 -1078
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/tutorial_2.ipynb +12 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/notebooks/tutorial_3.ipynb +12 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/owlplanner.cmd +1 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/owlplanner.sh +1 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/pyproject.toml +4 -8
- owlplanner-2025.5.12/pytest.ini +7 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/requirements.txt +1 -0
- owlplanner-2025.5.12/src/owlplanner/__init__.py +8 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/abcapi.py +14 -7
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/config.py +7 -7
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/plan.py +435 -829
- owlplanner-2025.5.12/src/owlplanner/plotting/__init__.py +7 -0
- owlplanner-2025.5.12/src/owlplanner/plotting/base.py +76 -0
- owlplanner-2025.5.12/src/owlplanner/plotting/factory.py +32 -0
- owlplanner-2025.5.12/src/owlplanner/plotting/matplotlib_backend.py +432 -0
- owlplanner-2025.5.12/src/owlplanner/plotting/plotly_backend.py +980 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/rates.py +40 -68
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/tax2025.py +2 -1
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/timelists.py +3 -8
- owlplanner-2025.5.12/src/owlplanner/version.py +1 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_logger.py +3 -3
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_regressions.py +2 -2
- owlplanner-2025.5.12/tests/test_ui_asset_allocation.py +14 -0
- owlplanner-2025.5.12/tests/test_ui_compare_summaries.py +18 -0
- owlplanner-2025.5.12/tests/test_ui_sskeys.py +24 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/About_Owl.py +2 -1
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Create_Case.py +3 -2
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Current_Assets.py +4 -3
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Documentation.py +31 -19
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Graphs.py +5 -3
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Historical_Range.py +3 -3
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Monte_Carlo.py +3 -3
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Optimization_Parameters.py +11 -11
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Output_Files.py +2 -2
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Quick_Start.py +3 -3
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Rates_Selection.py +27 -29
- owlplanner-2025.5.12/ui/Settings.py +29 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Wages_And_Contributions.py +2 -2
- owlplanner-2025.5.12/ui/__init__.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/main.py +5 -5
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/owlbridge.py +95 -36
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/requirements.txt +1 -1
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/sskeys.py +12 -4
- owlplanner-2025.5.3/Papers/BF01580653.pdf +0 -0
- owlplanner-2025.5.3/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
- owlplanner-2025.5.3/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
- owlplanner-2025.5.3/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +24 -45650
- owlplanner-2025.5.3/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +13 -42971
- owlplanner-2025.5.3/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
- owlplanner-2025.5.3/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
- owlplanner-2025.5.3/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
- owlplanner-2025.5.3/Papers/bv_cvxbook.pdf +0 -0
- owlplanner-2025.5.3/Papers/s10436-006-0062-y.pdf +0 -0
- owlplanner-2025.5.3/docs/newowl.tex +0 -1356
- owlplanner-2025.5.3/git-cheats +0 -11
- owlplanner-2025.5.3/src/owlplanner/__init__.py +0 -6
- owlplanner-2025.5.3/src/owlplanner/version.py +0 -1
- owlplanner-2025.5.3/ui/Settings.py +0 -33
- owlplanner-2025.5.3/ui/main+fonts.py +0 -55
- owlplanner-2025.5.3/ui/plots.py +0 -20
- owlplanner-2025.5.3/ui/sskeys.py.color +0 -579
- owlplanner-2025.5.3/ui/style.css +0 -8
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.gitattributes +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/INSTALL.md +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/LICENSE +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/USER_GUIDE.md +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/Dockerfile +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/README.md +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docker/fastentrypoint.sh +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/allocations.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/owl.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/profile.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/owl.pdf +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/docs/owl.tex +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_jack+jill.toml +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_joe.toml +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_john+sally.toml +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_kim+sam-bequest.toml +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/case_kim+sam-spending.toml +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/joe.xlsx +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/examples/template.xlsx +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/data/rates.csv +0 -0
- /owlplanner-2025.5.3/src/owlplanner/logging.py → /owlplanner-2025.5.12/src/owlplanner/mylogging.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_repro.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_toml_cases.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/tests/test_units.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Logs.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/README.md +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/Worksheets.py +0 -0
- {owlplanner-2025.5.3 → owlplanner-2025.5.12}/ui/progress.py +0 -0
- {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,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owlplanner
|
|
3
|
-
Version: 2025.5.
|
|
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
|
|
715
|
-
to provide guidance on retirement decisions
|
|
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
|
|
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
|
|
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
|
|
12
|
-
to provide guidance on retirement decisions
|
|
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
|
|
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
|
|
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",
|