Skip to main content

A Python financial planning toolkit with CEFR calculations, Monte Carlo simulations, and beautiful visualizations

Project description

Financial Health Calculator

PyPI version Python versions CI codecov Documentation License: MIT Open In Colab

A comprehensive Python financial planning toolkit with CEFR calculations, Monte Carlo simulations, and beautiful Plotly visualizations.

Features

  • CEFR (Certainty-Equivalent Funded Ratio): A fundedness metric that accounts for taxes, liquidity, and concentration risk
  • Monte Carlo Simulations: Project retirement outcomes with configurable market assumptions
  • Withdrawal Strategy Lab: Compare strategies including fixed SWR, guardrails, VPW, RMD-style, and Merton optimal
  • Utility Optimization: Merton optimal spending and allocation based on lifetime utility maximization
  • Beautiful Visualizations: Interactive Plotly charts with fan charts, waterfalls, and survival curves
  • REST API: FastAPI backend for programmatic access
  • Streamlit App: User-friendly web interface

Quick Start

Installation

pip install fundedness

For development with all extras:

pip install "fundedness[all]"

Basic Usage

from fundedness import Asset, BalanceSheet, Liability, compute_cefr
from fundedness.models.assets import AccountType, LiquidityClass, ConcentrationLevel

# Define your assets
assets = [
    Asset(
        name="401(k)",
        value=500_000,
        account_type=AccountType.TAX_DEFERRED,
        liquidity_class=LiquidityClass.RETIREMENT,
        concentration_level=ConcentrationLevel.DIVERSIFIED,
    ),
    Asset(
        name="Roth IRA",
        value=200_000,
        account_type=AccountType.TAX_EXEMPT,
        liquidity_class=LiquidityClass.RETIREMENT,
        concentration_level=ConcentrationLevel.DIVERSIFIED,
    ),
]

# Define your spending
liabilities = [
    Liability(name="Living Expenses", annual_amount=50_000, is_essential=True),
    Liability(name="Travel", annual_amount=20_000, is_essential=False),
]

# Calculate CEFR
result = compute_cefr(
    balance_sheet=BalanceSheet(assets=assets),
    liabilities=liabilities,
    planning_horizon=30,
)

print(f"CEFR: {result.cefr:.2f}")
print(f"Funded: {result.is_funded}")
print(result.get_interpretation())

Tutorials

Running the Apps

Streamlit Web App

streamlit run streamlit_app/app.py

FastAPI REST API

uvicorn api.main:app --reload

API documentation available at http://localhost:8000/docs

Key Concepts

CEFR (Certainty-Equivalent Funded Ratio)

CEFR measures how well-funded your retirement is after accounting for:

  • Tax Haircuts: What you'll owe when withdrawing from different account types
  • Liquidity Haircuts: How easily you can access your assets
  • Reliability Haircuts: Risk from concentrated positions

Formula:

CEFR = Σ(Asset × (1-τ) × λ × ρ) / PV(Liabilities)

Where τ = tax rate, λ = liquidity factor, ρ = reliability factor

Interpretation:

  • CEFR ≥ 2.0: Excellent - Very well-funded
  • CEFR 1.5-2.0: Strong - Well-funded with margin
  • CEFR 1.0-1.5: Adequate - Fully funded
  • CEFR < 1.0: Underfunded - Action needed

Withdrawal Strategies

Strategy Description Best For
Fixed SWR 4% of initial portfolio, adjusted for inflation Predictability
% of Portfolio Fixed % of current value Market adaptation
Guardrails Adjustable with floor/ceiling Balance
VPW Age-based variable percentage Maximizing spending
RMD-Style IRS distribution table based Tax efficiency
Merton Optimal Utility-maximizing spending rate Optimality

Utility Optimization

The toolkit includes Merton's optimal consumption and portfolio choice framework, as applied in modern retirement planning research[1]:

  • Optimal Equity Allocation: k* = (μ - r) / (γ × σ²)
  • Wealth-Adjusted Allocation: Reduces equity as wealth approaches subsistence floor
  • Optimal Spending Rate: Increases with age as horizon shortens
  • Expected Lifetime Utility: Track utility across Monte Carlo paths

Key insights from this methodology:

  1. Optimal spending starts low (~2-3%) and rises with age
  2. Allocation should decrease as wealth approaches the floor
  3. Risk aversion (gamma) is the critical input parameter
  4. The 4% rule is suboptimal from a utility perspective

Development

Setup

git clone https://github.com/engineerinvestor/financial-health-calculator.git
cd financial-health-calculator
pip install -e ".[dev]"

Running Tests

pytest

Code Quality

ruff check .
mypy fundedness

Project Structure

financial-health-calculator/
├── fundedness/           # Core Python package
│   ├── models/           # Pydantic data models
│   ├── viz/              # Plotly visualizations
│   ├── withdrawals/      # Withdrawal strategies (SWR, guardrails, VPW, Merton)
│   ├── allocation/       # Asset allocation strategies (constant, glidepath, Merton)
│   ├── cefr.py           # CEFR calculation
│   ├── simulate.py       # Monte Carlo engine with utility tracking
│   ├── merton.py         # Merton optimal formulas
│   ├── optimize.py       # Policy parameter optimization
│   └── policies.py       # Spending/allocation policies
├── api/                  # FastAPI REST API
├── streamlit_app/        # Streamlit web application
│   └── pages/            # Includes Utility Optimization page
├── examples/             # Jupyter notebooks
└── tests/                # pytest tests

Contact

License

MIT License

References

  1. Haghani, V., & White, J. (2023). The Missing Billionaires: A Guide to Better Financial Decisions. Wiley. See also Elm Wealth for related research on optimal spending and allocation.

  2. Merton, R. C. (1969). Lifetime Portfolio Selection under Uncertainty: The Continuous-Time Case. The Review of Economics and Statistics, 51(3), 247-257.

Disclaimer

This tool is for educational purposes only and does not constitute financial advice. Consult a qualified financial advisor for personalized recommendations.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fundedness-0.2.1.tar.gz (107.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fundedness-0.2.1-py3-none-any.whl (67.7 kB view details)

Uploaded Python 3

File details

Details for the file fundedness-0.2.1.tar.gz.

File metadata

  • Download URL: fundedness-0.2.1.tar.gz
  • Upload date:
  • Size: 107.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for fundedness-0.2.1.tar.gz
Algorithm Hash digest
SHA256 c884efc81b85afeca6af9ad9a2e1b8e3ad6467a60d577f1dd9992eeea974a20b
MD5 fca6b880b6de4864205911404e267051
BLAKE2b-256 da08dbc9065f3c9c71fe120a26d3a7529ef824ac4396a23c9417273ee91b5d55

See more details on using hashes here.

File details

Details for the file fundedness-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: fundedness-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 67.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for fundedness-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a8d7782760a8ae50dd07e76fb637dc75be0674636541c183ca70f9962a092203
MD5 e24b73debf9f8dd7690430f8f7f01c0a
BLAKE2b-256 fe8b626fa52a090a55a6ceff025e0c3fc4f680146aacef24072ef1a31fc5698e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page