Skip to content

Time Value

startup_valuation.tv

Time value of money calculations.

Chapter 2: Mathematical Foundations — Time Value of Money

Classes

Functions

present_value(future_value, rate, periods)

Calculate present value of a single future cash flow.

Formula: PV = C / (1 + r)^t

Parameters:

Name Type Description Default
future_value float

Future cash flow (C).

required
rate float

Discount rate (r).

required
periods float

Number of periods (t).

required

Returns:

Type Description
ValuationResult

ValuationResult with present value.

Example

result = present_value(11000, 0.08, 1) round(result.value, 2) 10185.19

Source code in src/startup_valuation/tv.py
def present_value(future_value: float, rate: float, periods: float) -> ValuationResult:
    """Calculate present value of a single future cash flow.

    Formula: PV = C / (1 + r)^t

    Args:
        future_value: Future cash flow (C).
        rate: Discount rate (r).
        periods: Number of periods (t).

    Returns:
        ValuationResult with present value.

    Example:
        >>> result = present_value(11000, 0.08, 1)
        >>> round(result.value, 2)
        10185.19
    """
    if rate < -1:
        raise ValueError("rate must be >= -1")

    pv = future_value / ((1 + rate) ** periods)

    return ValuationResult(
        value=pv,
        method="Present Value",
        inputs={"future_value": future_value, "rate": rate, "periods": periods},
        assumptions=["Discount rate is constant over the period"],
        chapter="2",
    )

net_present_value(cash_flows, rate)

Calculate net present value of a series of cash flows.

Formula: NPV = Σ Cₜ / (1 + r)^t

Parameters:

Name Type Description Default
cash_flows list[float]

Cash flows at each period (C₀, C₁, ..., Cₜ).

required
rate float

Discount rate (r).

required

Returns:

Type Description
ValuationResult

ValuationResult with NPV.

Example

result = net_present_value([-100000, 30000, 40000, 50000], 0.10) round(result.value, 0) -2103.0

Source code in src/startup_valuation/tv.py
def net_present_value(
    cash_flows: list[float],
    rate: float,
) -> ValuationResult:
    """Calculate net present value of a series of cash flows.

    Formula: NPV = Σ Cₜ / (1 + r)^t

    Args:
        cash_flows: Cash flows at each period (C₀, C₁, ..., Cₜ).
        rate: Discount rate (r).

    Returns:
        ValuationResult with NPV.

    Example:
        >>> result = net_present_value([-100000, 30000, 40000, 50000], 0.10)
        >>> round(result.value, 0)
        -2103.0
    """
    if rate < -1:
        raise ValueError("rate must be >= -1")

    npv = sum(cf / ((1 + rate) ** t) for t, cf in enumerate(cash_flows))

    return ValuationResult(
        value=npv,
        method="Net Present Value",
        inputs={"cash_flows": cash_flows, "rate": rate},
        assumptions=["Discount rate is constant across all periods"],
        chapter="2",
    )

annuity_present_value(payment, rate, periods)

Calculate present value of an annuity.

Formula: PV = C × [(1 - (1 + r)^(-n)) / r]

Parameters:

Name Type Description Default
payment float

Periodic payment (C).

required
rate float

Discount rate per period (r).

required
periods int

Number of periods (n).

required

Returns:

Type Description
ValuationResult

ValuationResult with present value.

Example

result = annuity_present_value(50000, 0.10, 4) round(result.value, 0) 158495.0

Source code in src/startup_valuation/tv.py
def annuity_present_value(
    payment: float,
    rate: float,
    periods: int,
) -> ValuationResult:
    """Calculate present value of an annuity.

    Formula: PV = C × [(1 - (1 + r)^(-n)) / r]

    Args:
        payment: Periodic payment (C).
        rate: Discount rate per period (r).
        periods: Number of periods (n).

    Returns:
        ValuationResult with present value.

    Example:
        >>> result = annuity_present_value(50000, 0.10, 4)
        >>> round(result.value, 0)
        158495.0
    """
    if rate == 0:
        pv = payment * periods
    else:
        pv = payment * (1 - (1 + rate) ** (-periods)) / rate

    return ValuationResult(
        value=pv,
        method="Annuity Present Value",
        inputs={"payment": payment, "rate": rate, "periods": periods},
        assumptions=["Payments are equal and occur at end of each period"],
        chapter="2",
    )