Source code for dcf.compounding

# -*- coding: utf-8 -*-

# dcf
# ---
# A Python library for generating discounted cashflows.
#
# Author:   sonntagsgesicht, based on a fork of Deutsche Postbank [pbrisk]
# Version:  0.7, copyright Wednesday, 11 May 2022
# Website:  https://github.com/sonntagsgesicht/dcf
# License:  Apache License 2.0 (see LICENSE file)


from math import exp, log, pow


[docs]def simple_compounding(rate_value, maturity_value): r"""simple compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :return: $\frac{1}{1+r\cdot \tau}$ """ return 1.0 / (1.0 + rate_value * maturity_value)
[docs]def simple_rate(df, period_fraction): r"""interest rate from simple compounded dicount factor :param df: discount factor $df$ :param period_fraction: interest rate period $\tau$ :return: $\frac{1}{df-1}\cdot \frac{1}{\tau}$ """ return (1.0 / df - 1.0) / period_fraction
[docs]def continuous_compounding(rate_value, maturity_value): r"""continuous compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :return: $\exp(-r\cdot \tau)$ """ return exp(-1.0 * rate_value * maturity_value)
[docs]def continuous_rate(df, period_fraction): r"""interest rate from continuous compounded dicount factor :param df: discount factor $df$ :param period_fraction: interest rate period $\tau$ :return: $-\log(df)\cdot \frac{1}{\tau}$ """ if not df: pass return -log(df) / period_fraction
[docs]def periodic_compounding(rate_value, maturity_value, period_value): r"""periodicly compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :param period_value: number of interest rate periods $m$ :return: $(1+\frac{r}{m})^{-\tau\cdot m}$ """ ex = -period_value * maturity_value return pow(1.0 + float(rate_value) / period_value, ex)
[docs]def periodic_rate(df, period_fraction, frequency): r"""interest rate from continuous compounded dicount factor :param df: discount factor $df$ :param period_fraction: interest rate period $\tau$ :param frequency: number of interest rate periods $m$ :return: $(df^{-\frac{1}{\tau\cdot m}}-1) \cdot m$ """ return (pow(df, -1.0 / (period_fraction * frequency)) - 1.0) * frequency
[docs]def annually_compounding(rate_value, maturity_value): r"""annually compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :return: $(1+r)^{-\tau}$ """ return periodic_compounding(rate_value, maturity_value, 1)
[docs]def semi_compounding(rate_value, maturity_value): r"""semi compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :return: $(1+\frac{r}{2})^{-\tau\cdot 2}$ """ return periodic_compounding(rate_value, maturity_value, 2)
[docs]def quarterly_compounding(rate_value, maturity_value): r"""quarterly compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :return: $(1+\frac{r}{4})^{-\tau\cdot 4}$ """ return periodic_compounding(rate_value, maturity_value, 4)
[docs]def monthly_compounding(rate_value, maturity_value): r"""monthly compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :return: $(1+\frac{r}{12})^{-\tau\cdot 12}$ """ return periodic_compounding(rate_value, maturity_value, 12)
[docs]def daily_compounding(rate_value, maturity_value): r"""daily compounded discount factor :param rate_value: interest rate $r$ :param maturity_value: loan maturity $\tau$ :return: $(1+\frac{r}{365})^{-\tau\cdot 365}$ """ return periodic_compounding(rate_value, maturity_value, 365)