Time Value of Money (TVM) Module
The qfinbox.tvm module provides comprehensive Time Value of Money calculations
across five specialized submodules. Each module contains functions optimized for
specific types of financial calculations.
Submodules Overview
Basic Time Value of Money calculations. |
|
Annuity calculations. |
|
Bond valuation and analysis. |
|
Loan calculations and amortization. |
|
Cash flow analysis and investment evaluation. |
Basic TVM Calculations (qfinbox.tvm.basic)
Fundamental time value of money calculations for present value, future value, interest rates, and time periods.
Basic Time Value of Money calculations.
- qfinbox.tvm.basic.future_value(present_value: float, rate: float, periods: int, compounding_frequency: int = 1) float[source]
Calculate future value of a present amount.
- Parameters:
- Returns:
Future value.
- Return type:
- Raises:
ValidationError – If any parameter is invalid.
Examples
>>> future_value(1000, 0.05, 10) 1628.89
- qfinbox.tvm.basic.present_value(future_value: float, rate: float, periods: int, compounding_frequency: int = 1) float[source]
Calculate present value of a future amount.
- Parameters:
- Returns:
Present value.
- Return type:
Examples
>>> present_value(1628.89, 0.05, 10) 1000.0
- qfinbox.tvm.basic.interest_rate(present_value: float, future_value: float, periods: int, compounding_frequency: int = 1) float[source]
Calculate interest rate given present value, future value, and periods.
- Parameters:
- Returns:
Annual interest rate (as decimal).
- Return type:
- Raises:
ValidationError – If any parameter is invalid.
Examples
>>> interest_rate(1000, 1628.89, 10) 0.05
- qfinbox.tvm.basic.number_of_periods(present_value: float, future_value: float, rate: float, compounding_frequency: int = 1) float[source]
Calculate number of periods required for present value to grow to future value.
- Parameters:
- Returns:
Number of periods required.
- Return type:
- Raises:
ValidationError – If any parameter is invalid.
Examples
>>> number_of_periods(1000, 3000, 0.12) 9.69
- qfinbox.tvm.basic.compound_interest(principal: float, rate: float, periods: int, compounding_frequency: int = 1) float[source]
Calculate compound interest earned.
- Parameters:
- Returns:
Compound interest earned.
- Return type:
Examples
>>> compound_interest(1000, 0.05, 10) 628.89
- qfinbox.tvm.basic.effective_rate(nominal_rate: float, compounding_frequency: int) float[source]
Calculate effective annual rate from nominal rate.
- Parameters:
- Returns:
Effective annual rate.
- Return type:
Examples
>>> effective_rate(0.12, 12) # 12% compounded monthly 0.1268
- qfinbox.tvm.basic.nominal_rate(effective_rate: float, compounding_frequency: int) float[source]
Calculate nominal rate from effective annual rate.
- Parameters:
- Returns:
Nominal annual rate.
- Return type:
Examples
>>> nominal_rate(0.1268, 12) # Effective 12.68% compounded monthly 0.12
- qfinbox.tvm.basic.continuous_compounding_fv(present_value: float, rate: float, time: float) float[source]
Calculate future value with continuous compounding.
- Parameters:
- Returns:
Future value with continuous compounding.
- Return type:
Examples
>>> continuous_compounding_fv(1000, 0.05, 10) 1648.72
- qfinbox.tvm.basic.continuous_compounding_pv(future_value: float, rate: float, time: float) float[source]
Calculate present value with continuous compounding.
- Parameters:
- Returns:
Present value with continuous compounding.
- Return type:
Examples
>>> continuous_compounding_pv(1648.72, 0.05, 10) 1000.0
Key Functions:
present_value()- Calculate present value given future value, rate, and periodsfuture_value()- Calculate future value given present value, rate, and periodsinterest_rate()- Calculate interest rate given present/future values and periodsnumber_of_periods()- Calculate number of periods given present/future values and rateeffective_rate()- Convert nominal rate to effective annual ratenominal_rate()- Convert effective rate to nominal rate with compounding
Annuities (qfinbox.tvm.annuities)
Calculations for ordinary annuities, annuities due, perpetuities, and growing annuities.
Annuity calculations.
- qfinbox.tvm.annuities.ordinary_annuity_pv(payment: float, rate: float, periods: int) float[source]
Calculate present value of ordinary annuity.
- Parameters:
- Returns:
Present value of ordinary annuity.
- Return type:
Examples
>>> ordinary_annuity_pv(1000, 0.05, 10) 7721.73
- qfinbox.tvm.annuities.ordinary_annuity_fv(payment: float, rate: float, periods: int) float[source]
Calculate future value of ordinary annuity.
- Parameters:
- Returns:
Future value of ordinary annuity.
- Return type:
Examples
>>> ordinary_annuity_fv(1000, 0.05, 10) 12577.89
- qfinbox.tvm.annuities.annuity_due_pv(payment: float, rate: float, periods: int) float[source]
Calculate present value of annuity due.
- Parameters:
- Returns:
Present value of annuity due.
- Return type:
Examples
>>> annuity_due_pv(1000, 0.05, 10) 8107.82
- qfinbox.tvm.annuities.annuity_due_fv(payment: float, rate: float, periods: int) float[source]
Calculate future value of annuity due.
- Parameters:
- Returns:
Future value of annuity due.
- Return type:
Examples
>>> annuity_due_fv(1000, 0.05, 10) 13206.79
- qfinbox.tvm.annuities.annuity_pv(payment: float, rate: float, periods: int, due: bool = False) float[source]
Calculate present value of annuity (ordinary or due).
- qfinbox.tvm.annuities.annuity_fv(payment: float, rate: float, periods: int, due: bool = False) float[source]
Calculate future value of annuity (ordinary or due).
- qfinbox.tvm.annuities.perpetuity_value(payment: float, rate: float) float[source]
Calculate present value of a perpetuity.
A perpetuity is a stream of equal payments that continues forever.
- Parameters:
- Returns:
Present value of perpetuity.
- Return type:
- Raises:
ValidationError – If any parameter is invalid.
Examples
>>> perpetuity_value(50000, 0.04) 1250000.0
Notes
The formula for a perpetuity is simply: PV = Payment / Rate
- qfinbox.tvm.annuities.growing_annuity_pv(payment: float, rate: float, growth_rate: float, periods: int) float[source]
Calculate present value of a growing annuity.
A growing annuity has payments that grow at a constant rate each period.
- Parameters:
- Returns:
Present value of growing annuity.
- Return type:
- Raises:
ValidationError – If any parameter is invalid.
Examples
>>> growing_annuity_pv(2, 0.09, 0.05, 20) 24.36
Notes
If rate equals growth_rate, the formula becomes: PV = PMT * n / (1 + r) Otherwise: PV = PMT * [(1 - ((1 + g) / (1 + r))^n) / (r - g)]
Key Functions:
pv_ordinary_annuity()- Present value of ordinary annuityfv_ordinary_annuity()- Future value of ordinary annuitypv_annuity_due()- Present value of annuity duefv_annuity_due()- Future value of annuity dueperpetuity_value()- Value of perpetual annuitygrowing_annuity_pv()- Present value of growing annuitygrowing_perpetuity_value()- Value of growing perpetuity
Bond Valuation (qfinbox.tvm.bonds)
Comprehensive bond pricing, yield calculations, and risk measures.
Bond valuation and analysis.
- qfinbox.tvm.bonds.bond_price(face_value: float, coupon_rate: float, years_to_maturity: float, yield_to_maturity: float, payments_per_year: int = 2) float[source]
Calculate bond price given yield to maturity.
- Parameters:
- Returns:
Bond price.
- Return type:
Examples
>>> bond_price(1000, 0.06, 10, 0.08) 864.10
- qfinbox.tvm.bonds.bond_yield_to_maturity(price: float, face_value: float, coupon_rate: float, years_to_maturity: float, payments_per_year: int = 2) float[source]
Calculate bond yield to maturity given price.
- Parameters:
- Returns:
Yield to maturity (as decimal).
- Return type:
Examples
>>> bond_yield_to_maturity(864.10, 1000, 0.06, 10) 0.08
- qfinbox.tvm.bonds.bond_duration(face_value: float, coupon_rate: float, years_to_maturity: float, yield_to_maturity: float, payments_per_year: int = 2) float[source]
Calculate Macaulay duration of a bond.
- Parameters:
- Returns:
Macaulay duration in years.
- Return type:
Examples
>>> bond_duration(1000, 0.06, 10, 0.08) 7.25
- qfinbox.tvm.bonds.bond_modified_duration(face_value: float, coupon_rate: float, years_to_maturity: float, yield_to_maturity: float, payments_per_year: int = 2) float[source]
Calculate modified duration of a bond.
- Parameters:
- Returns:
Modified duration.
- Return type:
Examples
>>> bond_modified_duration(1000, 0.06, 10, 0.08) 6.71
- qfinbox.tvm.bonds.bond_convexity(face_value: float, coupon_rate: float, years_to_maturity: float, yield_to_maturity: float, payments_per_year: int = 2) float[source]
Calculate convexity of a bond.
- Parameters:
- Returns:
Convexity.
- Return type:
Examples
>>> bond_convexity(1000, 0.06, 10, 0.08) 64.93
Key Functions:
bond_price()- Calculate bond price given coupon rate and market yieldbond_yield()- Calculate yield to maturity given bond pricebond_duration()- Calculate modified duration for interest rate sensitivitybond_convexity()- Calculate convexity for advanced interest rate riskzero_coupon_bond_price()- Price zero-coupon bondszero_coupon_bond_yield()- Calculate yield for zero-coupon bonds
Loan Analysis (qfinbox.tvm.loans)
Comprehensive loan calculations including payments, balances, and amortization schedules.
Loan calculations and amortization.
- qfinbox.tvm.loans.loan_payment(principal: float, annual_rate: float, years: float, payments_per_year: int = 12) float[source]
Calculate periodic loan payment.
- Parameters:
- Returns:
Periodic payment amount.
- Return type:
Examples
>>> loan_payment(300000, 0.05, 30) 1610.46
- qfinbox.tvm.loans.loan_balance(principal: float, annual_rate: float, years: float, payments_made: int, payments_per_year: int = 12) float[source]
Calculate remaining loan balance after specified payments.
- Parameters:
- Returns:
Remaining loan balance.
- Return type:
Examples
>>> loan_balance(300000, 0.05, 30, 120) 260108.58
- qfinbox.tvm.loans.total_interest_paid(principal: float, annual_rate: float, years: float, payments_per_year: int = 12) float[source]
Calculate total interest paid over the life of the loan.
- Parameters:
- Returns:
Total interest paid.
- Return type:
Examples
>>> total_interest_paid(300000, 0.05, 30) 279767.35
- qfinbox.tvm.loans.amortization_schedule(principal: float, annual_rate: float, years: float, payments_per_year: int = 12) DataFrame[source]
Generate loan amortization schedule.
- Parameters:
- Returns:
Amortization schedule with columns: Payment, Interest, Principal, Balance.
- Return type:
pd.DataFrame
Examples
>>> schedule = amortization_schedule(300000, 0.05, 30) >>> schedule.head() Payment Interest Principal Balance 0 1610.46 1250.00 360.46 299639.54 1 1610.46 1248.50 361.96 299277.58
Key Functions:
loan_payment()- Calculate periodic loan paymentloan_balance()- Calculate remaining loan balanceamortization_schedule()- Generate detailed amortization scheduletotal_interest_paid()- Calculate total interest over loan lifeloan_affordability()- Determine maximum affordable loan amount
Cash Flow Analysis (qfinbox.tvm.cashflow)
Investment analysis tools including NPV, IRR, payback period, and profitability metrics.
Cash flow analysis and investment evaluation.
- qfinbox.tvm.cashflow.net_present_value(cash_flows: List[float] | ndarray, discount_rate: float) float[source]
Calculate net present value of cash flows.
- Parameters:
cash_flows (array-like) – Series of cash flows, with initial investment as negative value.
discount_rate (float) – Discount rate (as decimal).
- Returns:
Net present value.
- Return type:
Examples
>>> cash_flows = [-100000, 30000, 40000, 50000] >>> net_present_value(cash_flows, 0.10) 4349.34
- qfinbox.tvm.cashflow.internal_rate_of_return(cash_flows: List[float] | ndarray, initial_guess: float = 0.1) float[source]
Calculate internal rate of return for cash flows.
- Parameters:
cash_flows (array-like) – Series of cash flows, with initial investment as negative value.
initial_guess (float, default 0.1) – Initial guess for IRR calculation.
- Returns:
Internal rate of return (as decimal).
- Return type:
Examples
>>> cash_flows = [-100000, 30000, 40000, 50000] >>> internal_rate_of_return(cash_flows) 0.1627
- qfinbox.tvm.cashflow.payback_period(cash_flows: List[float] | ndarray) float[source]
Calculate payback period for cash flows.
- Parameters:
cash_flows (array-like) – Series of cash flows, with initial investment as negative value.
- Returns:
Payback period in years.
- Return type:
Examples
>>> cash_flows = [-100000, 30000, 40000, 50000] >>> payback_period(cash_flows) 2.6
- qfinbox.tvm.cashflow.discounted_payback_period(cash_flows: List[float] | ndarray, discount_rate: float) float[source]
Calculate discounted payback period for cash flows.
- Parameters:
cash_flows (array-like) – Series of cash flows, with initial investment as negative value.
discount_rate (float) – Discount rate (as decimal).
- Returns:
Discounted payback period in years.
- Return type:
Examples
>>> cash_flows = [-100000, 30000, 40000, 50000] >>> discounted_payback_period(cash_flows, 0.10) 2.8
- qfinbox.tvm.cashflow.profitability_index(cash_flows: List[float] | ndarray, discount_rate: float) float[source]
Calculate profitability index for cash flows.
- Parameters:
cash_flows (array-like) – Series of cash flows, with initial investment as negative value.
discount_rate (float) – Discount rate (as decimal).
- Returns:
Profitability index.
- Return type:
Examples
>>> cash_flows = [-100000, 30000, 40000, 50000] >>> profitability_index(cash_flows, 0.10) 1.043
Key Functions:
npv()- Net Present Value calculationirr()- Internal Rate of Return calculationmirr()- Modified Internal Rate of Returnpayback_period()- Simple payback period calculationdiscounted_payback_period()- Discounted payback periodprofitability_index()- Profitability index for investment ranking
Mathematical Foundations
All TVM calculations in qfinbox are based on fundamental financial mathematics:
Present Value Formula:
Future Value Formula:
Annuity Present Value:
Bond Pricing:
Where: - PV = Present Value - FV = Future Value - PMT = Payment - r = Interest Rate per period - n = Number of periods - C = Coupon payment - F = Face value - P = Bond price
Performance and Accuracy
The qfinbox TVM module is optimized for both performance and accuracy:
NumPy Integration: Uses NumPy arrays for vectorized calculations
SciPy Optimization: Leverages SciPy for complex root-finding (IRR, yield calculations)
Input Validation: Comprehensive validation prevents calculation errors
Error Handling: Graceful handling of edge cases and invalid inputs
Type Safety: Full type hints for IDE support and runtime checking
Usage Patterns
Single Value Calculations:
from qfinbox.tvm import basic
pv = basic.present_value(fv=1000, rate=0.05, periods=10)
Array-based Calculations:
import numpy as np
from qfinbox.tvm import basic
# Calculate PV for multiple scenarios
fv_values = np.array([1000, 2000, 3000])
rates = np.array([0.05, 0.06, 0.07])
periods = np.array([5, 10, 15])
pv_results = basic.present_value(fv=fv_values, rate=rates, periods=periods)
Complex Financial Modeling:
from qfinbox.tvm import cashflow, loans
# Combine multiple TVM functions for complex analysis
principal = 100000
rate = 0.05/12
periods = 30*12
payment = loans.loan_payment(principal, rate, periods)
# Create cash flow stream for NPV analysis
cash_flows = [-principal] + [payment] * periods
npv = cashflow.npv(rate=0.06/12, cash_flows=cash_flows)