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: Victor Haghani / Elm Wealth methodology for optimal spending and allocation
  • 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.0.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.0-py3-none-any.whl (67.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fundedness-0.2.0.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.0.tar.gz
Algorithm Hash digest
SHA256 00b7bd8ef067d28eb97be7d13542e3031c18196f1314c98f879576d40a8e5163
MD5 0db26bbec45796aa05ed78ce7accf402
BLAKE2b-256 d78ab79fd2173175f2355336d516b741467aa42462a1de846a0b0de8e1177906

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fundedness-0.2.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a4018c3df729e8c4cc58e9a759c3ce642ada08243aaecd0519132643163b10c5
MD5 c2a9b26a688a838d37897709001d56bf
BLAKE2b-256 2a9c0436c4a4f0b00562d300451d13f3def80ef7df23c133e3b0a66a6b1dbb23

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