A Python library for generating discounted cashflows.

## Python library dcf

A Python library for generating discounted cashflows (dcf). Typical banking business methods are provided like interpolation, compounding, discounting and fx.

## Example Usage

```>>> from datetime import date
>>> from dcf import ZeroRateCurve

>>> start = date(2014,1,1)
>>> mid = date(2015,1,1)
>>> end = date(2016,1,1)

>>> ZeroRateCurve([start, end], [.03, .05]).get_zero_rate(start, mid)
0.04

>>> ZeroRateCurve([start, end], [.03, .05]).get_discount_factor(start, mid)
0.9608157444936446
```

The framework works fine with native datetime but we recommend businessdate package for more convenient functionality to roll out date schedules.

```>>> from businessdate import BusinessDate, BusinessSchedule

>>> schedule = BusinessSchedule(today, today + "8q", step="1q")
>>> schedule
```

To build payment plans for, e.g. annuity loans, pick a plan function and generate an redemption amount list for paying back the loan notional amount.

```>>> from dcf import annuity, outstanding

>>> number_of_payments = 8
>>> interest_rate = 0.02
>>> notional = 1000.

>>> plan = annuity(number_of_payments, amount=notional, fixed_rate=interest_rate)
>>> plan
[116.50979913376267, 118.83999511643792, 121.21679501876667, 123.64113091914203, 126.11395353752485, 128.63623260827535, 131.20895726044085, 133.83313640564967]

>>> sum(plan)
1000.0

>>> out = outstanding(plan, amount=notional)
>>> out
[1000.0, 883.4902008662373, 764.6502057497994, 643.4334107310327, 519.7922798118907, 393.6783262743659, 265.0420936660905, 133.83313640564967]

>>> compound = [o * interest_rate + p for o, p in zip(out, plan)]
>>> compound
[136.50979913376267, 136.50979913376267, 136.50979913376267, 136.50979913376267, 136.50979913376267, 136.50979913376267, 136.50979913376267, 136.50979913376267]
```

Putting all together and feeding the plan into a FixedCashFlowList and the list of outstanding into a RateCashflowList gives the legs of a loan.

```>>> from businessdate import BusinessDate, BusinessSchedule
>>> from dcf import amortize, outstanding
>>> from dcf import FixedCashFlowList, RateCashFlowList
```

Again, build a date schedule.

```>>> today = BusinessDate(20201031)

>>> schedule = BusinessSchedule(today, today + "8q", step="1q")

>>> start_date, payment_dates = schedule[0], schedule[1:]
```

Fixing the properties of the product and rolling out the payment plan and list of notional outstanding.

```>>> number_of_payments = 8
>>> interest_rate = 0.01
>>> notional = 1000.

>>> plan = amortize(number_of_payments, amount=notional)
>>> out = outstanding(plan, amount=notional)
```

Finally, create for each leg a CashFlowList.

```>>> principal = FixedCashFlowList([start_date], [-notional], origin=start_date)
>>> print(principal)

>>> redemption = FixedCashFlowList(payment_dates, plan, origin=start_date)
>>> print(redemption)

>>> interest = RateCashFlowList(payment_dates, out, origin=start_date, fixed_rate=interest_rate)
>>> print(interest)
```

Add those legs to CashFlowLegList provides a smart container for valuation (get_present_value()).

```>>> from dcf import CashFlowLegList, ZeroRateCurve, get_present_value

>>> loan = CashFlowLegList([principal, redemption, interest])
>>> curve = ZeroRateCurve([today, today + '2y'], [-.005, .01])
>>> pv = get_present_value(cashflow_list=loan, discount_curve=curve, valuation_date=today)
>>> pv
4.935421637918779
```

## Install

The latest stable version can always be installed or updated via pip:

```\$ pip install dcf
```

## Development Version

The latest development version can be installed directly from GitHub:

```\$ pip install --upgrade git+https://github.com/sonntagsgesicht/dcf.git
```

## Contributions

Issues and Pull Requests are always welcome.

Code and documentation are available according to the Apache Software License (see LICENSE).