Skip to main content

MoneyWarp – Bend time. Model cash.

Project description

MoneyWarp

Bend time. Model cash.

Release Build status codecov License

Development Stage Notice -- MoneyWarp is in active development (alpha). Core classes are stable and covered by 5700+ tests, but the API may evolve.

MoneyWarp is a Python library for working with the time value of money. It treats loans, annuities, and investments as cash flows through time -- and gives you the tools to warp them back and forth between present, future, and everything in between.

Features

  • Time Machine (Warp) -- travel to any date and see loan state as of that moment
  • PMT, NPV, IRR, MIRR -- core finance functions powered by scipy
  • Loan tracking -- payments, fines, mora interest, grace periods
  • High-precision Money -- Decimal arithmetic, never floats
  • Amortization schedules -- French (Price) and SAC (Inverted Price)
  • Flexible dates -- irregular due dates, smart month-end handling
  • Type-safe interest rates -- explicit percentage handling, frequency conversions
  • Percentage type -- non-temporal flat percentages for fees, fines, MDR
  • Installments and Settlements -- first-class repayment plan and payment allocation
  • Payment waivers -- waive fines, mora, or overdue interest per payment
  • Working day calendars -- business day awareness for penalty deadlines
  • Tax module -- Brazilian IOF, grossup, pluggable tax strategy
  • Timezone-aware -- UTC by default, configurable globally
  • Marshmallow extension -- custom fields for serialization
  • SQLAlchemy extension -- column types + loan/settlement bridge with SQL-queryable balance

Installation

pip install money-warp

With optional extensions:

pip install money-warp[marshmallow]   # Marshmallow fields
pip install money-warp[sa]            # SQLAlchemy types + bridge

Quick Start

from datetime import datetime, timezone
from money_warp import Money, InterestRate, Loan, generate_monthly_dates
from money_warp.tz import to_date

principal = Money("10000.00")
rate = InterestRate("5% a")  # 5% annually

start_date = datetime(2024, 1, 15, tzinfo=timezone.utc)
due_dates = [to_date(d) for d in generate_monthly_dates(start_date, 12)]

loan = Loan(principal, rate, due_dates)

schedule = loan.get_amortization_schedule()
print(f"Monthly payment: {schedule[0].payment_amount}")
print(f"Total interest: {schedule.total_interest}")

loan.record_payment(Money("856.07"), datetime(2024, 2, 1, tzinfo=timezone.utc))
print(f"Remaining balance: {loan.current_balance}")

Time Machine

Travel to any date and see the loan exactly as it was -- payments, interest, fines, everything filtered to that moment:

from money_warp import Warp, Loan, Money, InterestRate
from datetime import date, datetime

loan = Loan(Money("10000"), InterestRate("5% a"), [date(2024, 1, 15)])
loan.record_payment(Money("500"), datetime(2024, 1, 10))
loan.record_payment(Money("600"), datetime(2024, 2, 10))
loan.record_payment(Money("700"), datetime(2024, 3, 10))

# Warp to the past -- only payments made by that date are visible
with Warp(loan, datetime(2024, 1, 20)) as past_loan:
    print(f"Balance on Jan 20: {past_loan.current_balance}")

# Warp to the future
with Warp(loan, datetime(2025, 1, 1)) as future_loan:
    print(f"Balance in 2025: {future_loan.current_balance}")

# Original loan is unchanged
print(f"Present balance: {loan.current_balance}")

Documentation

Full guides, examples, and API reference at tomascorrea.github.io/money-warp.

Contributing

Contributions are welcome! See the Contributing Guide for details.

License

MIT -- see LICENSE.

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

money_warp-0.28.4.tar.gz (80.0 kB view details)

Uploaded Source

Built Distribution

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

money_warp-0.28.4-py3-none-any.whl (104.5 kB view details)

Uploaded Python 3

File details

Details for the file money_warp-0.28.4.tar.gz.

File metadata

  • Download URL: money_warp-0.28.4.tar.gz
  • Upload date:
  • Size: 80.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for money_warp-0.28.4.tar.gz
Algorithm Hash digest
SHA256 094dc931c0c7c51f7b1dfb6b5596baf863d141df7cb69c966763e32baa16ace8
MD5 53c991c2da65451bd958ed54e5400da9
BLAKE2b-256 d0712e23003ceaa03822c1ef27baea8e3085a76ca08d3628292ba7ae1f730279

See more details on using hashes here.

Provenance

The following attestation bundles were made for money_warp-0.28.4.tar.gz:

Publisher: on-release-pypi.yml on tomascorrea/money-warp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file money_warp-0.28.4-py3-none-any.whl.

File metadata

  • Download URL: money_warp-0.28.4-py3-none-any.whl
  • Upload date:
  • Size: 104.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for money_warp-0.28.4-py3-none-any.whl
Algorithm Hash digest
SHA256 0306ecd0fbed33fce593f451e07fdf378bfa0aee8e73a2be50b30217309e052d
MD5 22fa5f76d57ca26d73c6ecfe941ea137
BLAKE2b-256 e5796b4795ce2a227fa7bd1c52a8f39a32d90feb334531124fd4281fe5560241

See more details on using hashes here.

Provenance

The following attestation bundles were made for money_warp-0.28.4-py3-none-any.whl:

Publisher: on-release-pypi.yml on tomascorrea/money-warp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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