Time Value of Money & Interest Rates: Finance Fundamentals

Michael BrenndoerferOctober 18, 202551 min read

Master time value of money concepts: compounding, discounting, present value, annuities, and interest rate conventions essential for quantitative finance.

Reading Level

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Time Value of Money and Interest Rates

A dollar today is worth more than a dollar tomorrow. This simple observation underpins virtually every financial calculation you will encounter, from pricing bonds and valuing companies to structuring mortgages and retirement plans. The concept is called the time value of money (TVM), and understanding it is essential for anyone working in quantitative finance.

Why is money worth more today? Three reasons drive this phenomenon. First, money received today can be invested to earn a return, making it grow over time. Second, inflation erodes purchasing power, so a dollar today buys more than a dollar in the future. Third, there is uncertainty about whether promised future payments will actually materialize. These factors combine to create a fundamental asymmetry: present money is more valuable than future money.

The time value of money gives us a framework for comparing cash flows that occur at different points in time. Without this framework, how would you choose between receiving $1,000 today versus $1,100 in one year? Or evaluate a business that requires $1 million upfront but promises $200,000 annually for the next seven years? TVM provides the mathematical machinery to answer these questions rigorously.

Interest rates are the mechanism that links present and future values. They quantify the "price" of borrowing money or the "reward" for lending it. In quantitative finance, interest rates serve as the foundation for pricing nearly every financial instrument. Understanding how they work, how they compound, and how they are quoted across markets is critical knowledge that we will use throughout this book.

Future Value and Compounding

When you deposit money in an interest-bearing account, your balance grows over time. The process by which this growth occurs, and particularly how interest accumulates on previously earned interest, is called compounding. This concept drives both wealth accumulation and debt growth. Let's build up from the simplest case to the continuous limit used in derivatives pricing, understanding each step along the way.

Simple Interest

Simple interest is the most basic form of interest calculation and serves as our conceptual starting point. Under simple interest, the interest accrues only on the original principal amount, never on accumulated interest. Think of it as a linear process: each period adds the same fixed amount of interest, regardless of how much has accumulated before. If you invest a principal PP at an annual interest rate rr for tt years, the future value is:

FV=P(1+rt)FV = P(1 + rt)

where:

  • FVFV: future value of the investment
  • PP: principal amount (initial investment)
  • rr: annual interest rate (expressed as a decimal)
  • tt: time in years

The structure of this formula reveals its linear nature. The term rtrt represents the total proportional increase: the rate rr multiplied by time tt. When you add this to 1 (representing the original principal as 100%), you get the total growth factor. Multiplying by PP then scales this to your actual investment amount. Notice that time and rate enter symmetrically and additively. Doubling the time has exactly the same effect as doubling the rate.

Simple Interest

Simple interest is calculated only on the original principal amount. The interest earned each period remains constant regardless of how long the investment is held.

For example, investing $1,000 at 5% simple interest for 3 years yields:

In[2]:
Code
## Simple interest calculation
P = 1000  # Principal
r = 0.05  # Annual interest rate
t = 3  # Time in years

FV_simple = P * (1 + r * t)
interest_earned = FV_simple - P
Out[3]:
Console
Principal: $1,000.00
Future value: $1,150.00
Interest earned: $150.00

Notice that the interest earned ($150) equals the annual interest ($50) multiplied by the number of years (3). Simple interest grows linearly with time, which makes it straightforward to calculate but unrealistic for most financial applications. In the real world, lenders and investors expect to earn interest on their accumulated interest, a concept we turn to next.

Discrete Compounding

In practice, interest typically compounds periodically. This means the interest earned in each period is added to the principal, and subsequent interest is calculated on this larger balance. The fundamental insight is that your money earns returns not just on your original investment, but on all the returns that investment has already generated. This creates exponential rather than linear growth, a distinction with profound implications over long time horizons.

To understand why compounding leads to exponential growth, consider what happens period by period. After the first compounding period, your balance is P(1+r/n)P(1 + r/n). After the second period, interest is calculated on this new, larger balance, giving P(1+r/n)(1+r/n)=P(1+r/n)2P(1 + r/n)(1 + r/n) = P(1 + r/n)^2. Each period multiplies the previous balance by the same growth factor, and multiplication repeated many times produces exponential behavior.

For an investment compounding nn times per year at annual rate rr, the future value after tt years is:

FV=P(1+rn)ntFV = P\left(1 + \frac{r}{n}\right)^{nt}

where:

  • FVFV: future value after tt years
  • PP: principal amount invested
  • rr: nominal annual interest rate (stated rate)
  • nn: number of compounding periods per year
  • tt: time in years
  • (1+r/n)(1 + r/n): growth factor per compounding period
  • ntnt: total number of compounding periods

The formula captures a key insight: each compounding period applies a small growth factor (1+r/n)(1 + r/n), and these compound multiplicatively over ntnt total periods. The rate per period is r/nr/n because we divide the annual rate among nn periods, and the total number of periods is ntnt because we have nn periods per year for tt years. More frequent compounding means smaller individual growth factors applied more times, which slightly increases total growth due to the "interest on interest" effect. This is because you begin earning interest on your interest sooner, so you don't have to wait as long for each interest payment to start generating its own returns.

Compound Interest

Compound interest calculates interest on both the initial principal and all previously accumulated interest. This creates exponential growth where earnings accelerate over time.

Let's compare different compounding frequencies for the same nominal rate:

In[4]:
Code
P = 1000
r = 0.05
t = 3

## Different compounding frequencies
compounding = {
    "Annual (n=1)": 1,
    "Semi-annual (n=2)": 2,
    "Quarterly (n=4)": 4,
    "Monthly (n=12)": 12,
    "Daily (n=365)": 365,
}

results = {}
for name, n in compounding.items():
    FV = P * (1 + r / n) ** (n * t)
    results[name] = FV
Out[5]:
Console
Principal: $1,000.00 | Rate: 5.0% | Time: 3 years

Compounding Frequency     Future Value Extra vs Annual
-------------------------------------------------------
Annual (n=1)              $  1,157.63 $          0.00
Semi-annual (n=2)         $  1,159.69 $          2.07
Quarterly (n=4)           $  1,160.75 $          3.13
Monthly (n=12)            $  1,161.47 $          3.85
Daily (n=365)             $  1,161.82 $          4.20

As compounding frequency increases, the future value grows, but the incremental gains diminish. Moving from annual to semi-annual compounding adds about $3.80, while moving from monthly to daily adds only about $0.05. This pattern of diminishing returns suggests a natural limit as nn \to \infty: no matter how frequently you compound, there is an upper bound on the growth you can achieve at a given rate. This limit is not merely a mathematical curiosity; it forms the basis for continuous compounding, the framework preferred in derivatives pricing.

Out[6]:
Visualization
Line chart showing future value increasing with compounding frequency but converging to a horizontal asymptote.
Future value convergence as compounding frequency increases. The curve rises steeply at first but quickly flattens, approaching the continuous compounding limit (dashed line). Beyond monthly compounding, additional frequency provides negligible benefit.

Continuous Compounding

Taking the limit as the compounding frequency approaches infinity gives us continuous compounding. Rather than compounding at discrete intervals like monthly, daily, or even every second, continuous compounding assumes that interest accrues and is reinvested at every instant. This is the standard framework used in derivatives pricing because it simplifies many calculations and produces elegant mathematical properties.

The continuous compounding formula emerges from taking the limit of the discrete formula as nn grows without bound:

FV=limnP(1+rn)nt=PertFV = \lim_{n \to \infty} P\left(1 + \frac{r}{n}\right)^{nt} = Pe^{rt}

where:

  • FVFV: future value
  • PP: principal amount
  • rr: continuously compounded annual rate
  • tt: time in years
  • ee: Euler's number (2.71828\approx 2.71828)

This result relies on the fundamental limit limn(1+x/n)n=ex\lim_{n \to \infty}(1 + x/n)^n = e^x, one of the most important limits in mathematics. To see why this limit makes sense intuitively, consider that as nn increases, each individual growth factor (1+r/n)(1 + r/n) gets closer to 1, but you apply more and more of them. These two effects, smaller factors applied more times, balance out to give a finite limit, and that limit happens to be the exponential function.

The exponential function erte^{rt} emerges naturally because continuous compounding represents the limiting case of infinitely many infinitesimally small growth events. This makes continuous compounding mathematically convenient: returns become additive in the logarithm, meaning ln(FV/P)=rt\ln(FV/P) = rt. This logarithmic property greatly simplifies many calculations in derivatives pricing, because the return over multiple periods can be computed simply by adding up the returns over sub-periods, rather than multiplying growth factors together.

Continuous Compounding

Continuous compounding assumes interest accrues and compounds instantaneously at every moment. The future value is calculated as FV=PertFV = Pe^{rt}, where ee is Euler's number.

In[7]:
Code
import numpy as np

## Parameters
P = 1000
r = 0.05
t = 3

## Continuous compounding
FV_continuous = P * np.exp(r * t)

## Compare to discrete compounding
FV_daily = P * (1 + r / 365) ** (365 * t)
difference = FV_continuous - FV_daily
Out[8]:
Console
Continuous compounding: $1,161.8342
Daily compounding:      $1,161.8223
Difference:             $0.0119

The difference between daily and continuous compounding is negligible for practical purposes. However, continuous compounding has elegant mathematical properties. Returns become additive (the log of a product equals the sum of logs), and many differential equations in finance have cleaner solutions.

Let's visualize how future value grows under different compounding schemes:

Out[9]:
Visualization
Line chart comparing simple, annual, and continuous compounding growth curves over 10 years.
Growth of $1,000 over 10 years at 5% interest under simple, annual, and continuous compounding. The gap between linear (simple interest) and exponential (compound interest) growth widens substantially over time.

The chart reveals that simple interest grows linearly while compound interest grows exponentially. Over short horizons, the differences are small. Over long horizons, they become dramatic. This explains why compound interest accumulates so powerfully over time.

Present Value and Discounting

While future value answers "what will this be worth later?", present value addresses the inverse question: "what is a future payment worth today?" This is the more common question in finance, because we frequently need to value future cash flows. When you price a bond, evaluate an investment project, or determine how much to save for retirement, you are fundamentally asking present value questions.

The Discounting Process

Discounting is the reverse of compounding. If compounding moves money forward in time by multiplying by growth factors, discounting moves money backward in time by dividing by those same factors. Algebraically, we unwrap the future value formula to find the present value:

PV=FV(1+r)tPV = \frac{FV}{(1 + r)^t}

where:

  • PVPV: present value (value today)
  • FVFV: future value (amount to be received)
  • rr: discount rate (annual)
  • tt: time until payment (years)
  • (1+r)t(1 + r)^{-t}: the discount factor

The discount factor (1+r)t(1 + r)^{-t} answers a simple question: what fraction of a future dollar is worth today? For positive interest rates, this fraction is always less than one, reflecting the fundamental principle that a dollar today is worth more than a dollar tomorrow. The higher the discount rate or the longer the time horizon, the smaller the discount factor becomes. Distant or heavily discounted cash flows contribute little to present value.

For continuous compounding, the discounting formula takes an even more elegant form:

PV=FVertPV = FV \cdot e^{-rt}

where:

  • PVPV: present value
  • FVFV: future value
  • rr: continuously compounded discount rate
  • tt: time in years
  • erte^{-rt}: the continuous discount factor, always between 0 and 1 for positive rates

The negative exponent in erte^{-rt} reflects that we are reversing the compounding process. Just as erte^{rt} grows money forward in time by a factor that increases with time, erte^{-rt} shrinks it backward by a factor that decreases with time. The symmetry works as follows: if continuous compounding with rate rr takes $1 today to erte^{rt} at time tt, then discounting takes erte^{rt} at time tt back to $1 today. The discount factor decays exponentially with time, meaning distant cash flows are worth progressively less today. The decay is steeper for higher discount rates.

Present Value

Present value is the current worth of a future sum of money, calculated by discounting the future amount at an appropriate interest rate. It answers the question: how much would you need to invest today to receive a specified amount in the future?

The term (1+r)t(1 + r)^{-t} or erte^{-rt} is called the discount factor. It represents the present value of $1 received at time tt. The discount factor is the "exchange rate" between future dollars and present dollars. If the 5-year discount factor is 0.78, then $1 received in 5 years is worth only $0.78 today, or equivalently, you would need to invest $0.78 today to have $1 in 5 years.

In[10]:
Code
import numpy as np


def discount_factor(r, t, continuous=False):
    """Calculate discount factor for rate r and time t."""
    if continuous:
        return np.exp(-r * t)
    return (1 + r) ** (-t)


## Example: What is $1,000 in 5 years worth today at 6%?
FV = 1000
r = 0.06
t = 5

PV_discrete = FV * discount_factor(r, t, continuous=False)
PV_continuous = FV * discount_factor(r, t, continuous=True)
Out[11]:
Console
Future value: $1,000.00 in 5 years
Discount rate: 6.0%

Present value (discrete):   $747.26
Present value (continuous): $740.82

Discount factor (discrete):   0.747258
Discount factor (continuous): 0.740818

The present value is always less than the future value (assuming positive interest rates). The discount factor tells you what fraction of a future dollar is worth today. At 6% for 5 years, each future dollar is worth about 75 cents today.

The Discount Curve

In practice, interest rates vary by maturity. Short-term rates may differ substantially from long-term rates. A discount curve (or discount function) maps each maturity to its corresponding discount factor. This curve is a key building block of fixed-income analysis. It contains all the information needed to value any risk-free cash flow occurring at any future date.

The shape of the discount curve reflects market expectations about future interest rates, economic conditions, and risk. A curve that declines steeply indicates either high current rates or expectations of rising rates in the future. A curve that declines slowly suggests lower rates or expectations of falling rates. The entire field of term structure modeling focuses on understanding, constructing, and forecasting this curve.

Out[12]:
Visualization
Declining curve showing discount factors from 1.0 at year 0 to about 0.6 at year 10.
Discount curve showing the present value of $1 received at different future dates. At a constant 5% rate, the discount factor declines exponentially with time, reaching about 0.61 at year 10.

The discount curve is fundamental to fixed-income analysis. Every bond price, swap valuation, and interest rate derivative depends on the shape of this curve. We will explore term structure modeling in depth in later chapters.

Out[13]:
Visualization
Multiple declining curves showing discount factors at different rates from 2% to 10%.
Impact of discount rate on present value across different time horizons. Higher discount rates dramatically reduce present values, especially for distant cash flows. A 10% rate reduces a 20-year cash flow to less than 15% of its nominal value.

Interest Rate Quotations

Interest rates in the real world are quoted in various ways, and understanding these quotations is essential for accurate calculations. Two rates that appear identical can imply quite different effective costs or returns depending on how they are quoted. This matters enormously in practice: a credit card advertising "18% APR" is not the same as one offering an "18% effective annual rate," and confusing the two can lead to significant financial errors.

APR vs. Effective Annual Rate

The Annual Percentage Rate (APR) is a nominal rate that does not account for compounding within the year. This is the rate you see advertised for mortgages, credit cards, and loans in many jurisdictions. The APR is essentially a proportional rate. If the monthly rate is 1.5%, the APR is simply 12 × 1.5% = 18%. This makes it easy to calculate and compare, but it understates the true cost of borrowing because it ignores the compounding effect.

The Effective Annual Rate (EAR), also called the Annual Percentage Yield (APY), represents the actual annual return after accounting for compounding:

EAR=(1+APRn)n1EAR = \left(1 + \frac{APR}{n}\right)^n - 1

where:

  • EAREAR: effective annual rate (true annual return)
  • APRAPR: annual percentage rate (nominal/stated rate)
  • nn: number of compounding periods per year
  • (1+APR/n)n(1 + APR/n)^n: the growth factor over one year with nn compounding periods

The formula works by computing what $1 actually grows to over one year: the term (1+APR/n)n(1 + APR/n)^n is the growth factor, representing the final balance after one year per dollar invested. Subtracting 1 converts this growth factor to a rate, expressing the increase as a percentage of the starting amount. The EAR exceeds the APR whenever n>1n > 1 because you earn interest on interest within the year. Each period's interest payment begins generating its own returns in subsequent periods.

The gap between EAR and APR grows with both the nominal rate and the compounding frequency. At low rates or with annual compounding, the difference is small. At high rates with frequent compounding, the difference becomes significant. This is why regulators often require lenders to disclose the EAR alongside the APR, giving consumers a more accurate picture of the true cost of borrowing.

Effective Annual Rate

The effective annual rate (EAR) is the actual annual return earned on an investment or paid on a loan after accounting for compounding. It allows meaningful comparison between rates with different compounding frequencies.

In[14]:
Code
def apr_to_ear(apr, n):
    """Convert APR to EAR given n compounding periods per year."""
    return (1 + apr / n) ** n - 1


## Credit card example: 18% APR compounded monthly
apr = 0.18
n = 12

ear = apr_to_ear(apr, n)
Out[15]:
Console
Credit card APR: 18.0%
Compounding: Monthly (n=12)
Effective Annual Rate: 19.56%

Extra cost vs. stated rate: 1.56 percentage points

A credit card with an 18% APR actually costs 19.56% per year due to monthly compounding. This difference matters significantly for large balances carried over time.

Out[16]:
Visualization
Line chart showing APR vs EAR with the gap widening at higher rates.
The gap between APR and effective annual rate (EAR) widens with higher nominal rates. With monthly compounding, an 18% APR translates to a 19.56% EAR, while a 30% APR becomes 34.5% EAR, a 4.5 percentage point difference.

Continuous Rate Conversions

In quantitative finance, we often need to convert between discrete and continuous rates. Market rates are typically quoted with discrete compounding (annual, semi-annual, or monthly), but derivatives models typically work with continuous rates because of their mathematical convenience. These conversions are necessary for moving between the market convention and the modeling convention.

If rnr_n is the nominal rate compounding nn times per year and rcr_c is the equivalent continuous rate, they must produce the same terminal value over one year:

erc=(1+rnn)ne^{r_c} = \left(1 + \frac{r_n}{n}\right)^n

where:

  • erce^{r_c}: annual growth factor under continuous compounding
  • rcr_c: continuously compounded rate
  • rnr_n: nominal rate compounding nn times per year
  • nn: compounding frequency
  • (1+rn/n)n(1 + r_n/n)^n: annual growth factor under discrete compounding

This equation states that both rates must produce identical growth factors over one year. They are economically equivalent even though they are expressed differently. Solving for the continuous rate by taking the natural logarithm of both sides:

rc=nln(1+rnn)r_c = n \cdot \ln\left(1 + \frac{r_n}{n}\right)

This formula converts a discretely compounded rate to its continuous equivalent. The logarithm "undoes" the exponential, extracting the continuous rate that achieves the same growth. And converting back by solving for the nominal rate:

rn=n(erc/n1)r_n = n\left(e^{r_c/n} - 1\right)

This inverse formula takes a continuous rate and finds the discrete rate that produces identical growth. The exponential "undoes" the logarithm, and scaling by nn converts from a per-period rate back to an annual nominal rate.

Continuous compounding generates slightly more growth per unit of stated rate. Therefore, a lower continuous rate produces the same terminal value as a higher discretely compounded rate. If you see a continuously compounded rate that looks "too low" compared to market quotes, this difference likely explains it. Continuous rates are always slightly lower than their discrete equivalents.

In[17]:
Code
import numpy as np


def discrete_to_continuous(r_discrete, n):
    """Convert discrete rate (n compounds/year) to continuous rate."""
    return n * np.log(1 + r_discrete / n)


def continuous_to_discrete(r_continuous, n):
    """Convert continuous rate to discrete rate (n compounds/year)."""
    return n * (np.exp(r_continuous / n) - 1)


## Example: 5% annual rate
r_annual = 0.05
r_continuous = discrete_to_continuous(r_annual, 1)
r_back = continuous_to_discrete(r_continuous, 1)
Out[18]:
Console
Annual discrete rate:    5.0000%
Equivalent continuous:   4.8790%
Converted back:          5.0000%

The continuous rate is slightly lower than the discrete rate because continuous compounding generates slightly more growth for the same rate. This conversion is essential when moving between market-quoted rates and the continuous rates used in derivatives formulas.

Day Count Conventions

Real-world interest calculations must handle fractional years. When interest accrues between two dates that do not span exact years, we need a rule for converting calendar days into a fraction of a year. Different markets use different day count conventions to determine this fraction, and the choice of convention can affect calculated interest amounts, especially for large notional values.

The main conventions are:

  • Actual/365: Days between dates divided by 365
  • Actual/360: Days between dates divided by 360 (common for money markets)
  • 30/360: Assumes 30 days per month, 360 days per year (common for corporate bonds)
  • Actual/Actual: Accounts for actual days in each year (used for Treasury bonds)

Each convention has historical origins and practical justifications. Actual/360, for instance, produces larger year fractions than Actual/365 for the same number of days, effectively increasing interest payments. This feature benefits lenders. The 30/360 convention simplifies calculations by assuming uniform months, which was valuable before widespread computer use. Actual/Actual is the most accurate but also the most complex because it requires knowledge of whether any intervening years are leap years.

In[19]:
Code
from datetime import date


def year_fraction(start_date, end_date, convention="actual/365"):
    """Calculate year fraction between two dates."""
    days = (end_date - start_date).days

    if convention == "actual/365":
        return days / 365
    elif convention == "actual/360":
        return days / 360
    elif convention == "30/360":
        d1 = min(start_date.day, 30)
        d2 = min(end_date.day, 30) if d1 == 30 else end_date.day
        months = (end_date.year - start_date.year) * 12 + (
            end_date.month - start_date.month
        )
        return (months * 30 + (d2 - d1)) / 360
    else:
        raise ValueError(f"Unknown convention: {convention}")


## Example: 6-month period
start = date(2024, 1, 15)
end = date(2024, 7, 15)

fractions = {}
for conv in ["actual/365", "actual/360", "30/360"]:
    fractions[conv] = year_fraction(start, end, conv)
Out[20]:
Console
Period: 2024-01-15 to 2024-07-15
Actual days: 182

Convention        Year Fraction
--------------------------------
actual/365             0.498630
actual/360             0.505556
30/360                 0.500000

The same 6-month period produces different year fractions depending on the convention. These differences compound in interest calculations, particularly for large notional amounts. Always verify which convention applies to your specific market and instrument.

Valuing Cash Flow Streams

Most financial instruments generate multiple cash flows over time. A bond pays coupons. A loan requires monthly payments. A business generates ongoing profits. The time value of money framework extends naturally to value these cash flow streams by treating each cash flow separately and summing the results.

Net Present Value

The Net Present Value (NPV) is the sum of all discounted cash flows. It takes each future cash flow, discounts it back to today using the appropriate discount factor, and adds up all these present values. This single number captures the total value of an entire cash flow stream in today's dollars:

NPV=t=0TCFt(1+r)tNPV = \sum_{t=0}^{T} \frac{CF_t}{(1+r)^t}

where:

  • NPVNPV: net present value (total value in today's dollars)
  • CFtCF_t: cash flow occurring at time tt (negative for outflows, positive for inflows)
  • rr: discount rate (required rate of return)
  • TT: final period of the cash flow stream
  • (1+r)t(1+r)^{-t}: discount factor for period tt
  • t=0T\sum_{t=0}^{T}: summation over all periods from 0 (today) to TT (final period)

A positive NPV indicates the investment creates value; a negative NPV indicates it destroys value. NPV answers the question of net benefit in today's dollars by converting all future cash flows to a common time reference. The discount rate rr represents your opportunity cost, meaning what you could earn on alternative investments of similar risk. By using this rate to discount future cash flows, you are implicitly comparing the investment to your next best alternative.

The NPV framework embodies a key principle: a dollar of cash flow has different value depending on when it occurs. Early cash flows are worth more than late cash flows, and this difference is precisely captured by the discount factors. The NPV calculation weights each cash flow by its timing, giving appropriate credit to investments that generate returns sooner.

Net Present Value

Net present value is the sum of all cash flows discounted to the present. It measures the total value created (or destroyed) by an investment in today's dollars.

In[21]:
Code
import numpy as np


def npv(cash_flows, times, r):
    """
    Calculate net present value of cash flows.

    Parameters:
    - cash_flows: array of cash flow amounts
    - times: array of times when cash flows occur
    - r: discount rate (annual)
    """
    discount_factors = (1 + r) ** (-np.array(times))
    return np.sum(np.array(cash_flows) * discount_factors)


## Investment example: Pay $10,000 now, receive $3,000/year for 5 years
cf = [-10000, 3000, 3000, 3000, 3000, 3000]
times = [0, 1, 2, 3, 4, 5]
r = 0.08

investment_npv = npv(cf, times, r)
Out[22]:
Console
Investment Analysis
========================================
Initial investment: $10,000
Annual cash flows: $3,000 for 5 years
Discount rate: 8%

NPV: $1,978.13
Decision: Accept

The NPV is positive, indicating the investment generates value at an 8% discount rate. However, NPV is highly sensitive to the discount rate chosen. Let's examine this sensitivity:

Out[23]:
Visualization
Line chart showing NPV declining from about 5000 at 0% discount rate to negative values above 15%.
NPV sensitivity to discount rate for an investment of $10,000 returning $3,000 annually for 5 years. The NPV declines as the discount rate increases, crossing zero at approximately 15% (the internal rate of return).

The discount rate where NPV equals zero is called the Internal Rate of Return (IRR). For this investment, the IRR is approximately 15.2%, meaning the investment breaks even at that discount rate.

Annuities

An annuity is a series of equal payments made at regular intervals. Mortgages, car loans, and many insurance products are structured as annuities. The defining characteristic is regularity: the same amount paid at the same interval for a fixed number of periods. This structure is common enough in finance to merit its own specialized formulas.

Rather than discounting each payment individually and summing, which would require TT separate calculations, we can derive a closed-form expression that computes the entire sum at once. The present value of an ordinary annuity (payments at end of each period) is:

PV=C1(1+r)TrPV = C \cdot \frac{1 - (1+r)^{-T}}{r}

where:

  • PVPV: present value of the annuity
  • CC: periodic payment amount
  • rr: periodic interest rate (e.g., monthly rate for monthly payments)
  • TT: total number of payment periods
  • 1(1+r)Tr\frac{1 - (1+r)^{-T}}{r}: the annuity factor (present value of $1 per period for TT periods)

The annuity formula comes from summing a geometric series of discount factors. The series 1/(1+r)+1/(1+r)2++1/(1+r)T1/(1+r) + 1/(1+r)^2 + \ldots + 1/(1+r)^T forms a geometric progression with first term 1/(1+r)1/(1+r) and common ratio 1/(1+r)1/(1+r). Applying the geometric series formula and simplifying yields the expression above. Rather than computing C/(1+r)+C/(1+r)2++C/(1+r)TC/(1+r) + C/(1+r)^2 + \ldots + C/(1+r)^T individually, the closed-form solution captures all terms at once.

As TT increases, the formula approaches C/rC/r (a perpetuity), since very distant payments contribute negligibly to present value. The term (1+r)T(1+r)^{-T} shrinks toward zero, making the numerator approach 1 and the entire factor approach 1/r1/r. This convergence makes intuitive sense: when payments continue for a very long time, the exact ending point matters less and less.

Annuity

An annuity is a series of equal cash flows occurring at regular intervals. The annuity formula allows direct calculation of present or future value without summing each individual payment.

The term 1(1+r)Tr\frac{1 - (1+r)^{-T}}{r} is called the annuity factor. It represents the present value of receiving $1 per period for TT periods. This factor depends only on the interest rate and number of periods, not on the payment amount, making it a useful building block. Once you know the annuity factor, you simply multiply by the payment amount to get the present value of any annuity with those characteristics.

In[24]:
Code
def annuity_pv(payment, r, periods):
    """Present value of ordinary annuity."""
    if r == 0:
        return payment * periods
    annuity_factor = (1 - (1 + r) ** (-periods)) / r
    return payment * annuity_factor


def annuity_payment(pv, r, periods):
    """Calculate payment given present value (e.g., loan payment)."""
    if r == 0:
        return pv / periods
    annuity_factor = (1 - (1 + r) ** (-periods)) / r
    return pv / annuity_factor


## Mortgage example: $300,000 loan, 6% annual rate, 30 years
loan_amount = 300000
annual_rate = 0.06
years = 30
monthly_rate = annual_rate / 12
months = years * 12

monthly_payment = annuity_payment(loan_amount, monthly_rate, months)
total_paid = monthly_payment * months
total_interest = total_paid - loan_amount
mortgage_years = 30  # Store for output display
Out[25]:
Console
Mortgage Analysis
========================================
Loan amount:      $  300,000.00
Annual rate:             6.00%
Term:                       30 years

Monthly payment:  $    1,798.65
Total payments:   $  647,514.57
Total interest:   $  347,514.57

Interest/Principal ratio: 1.16x

Over 30 years, this borrower pays nearly twice the original loan amount in total. Most of the early payments go toward interest, with principal reduction accelerating over time. This amortization structure has important implications for refinancing decisions.

Out[26]:
Visualization
Stacked area chart showing interest declining and principal increasing over 30 years of mortgage payments.
Mortgage amortization over 30 years showing interest vs. principal components of each payment. Early payments are dominated by interest (blue), while principal reduction (orange) accelerates in later years. The crossover occurs around year 19.

Perpetuities

A perpetuity is an annuity that continues forever. While no financial instrument truly lasts forever, some come close enough, such as British consols and certain endowments, that the perpetuity formula provides a useful approximation.

The present value of a perpetuity is remarkably simple:

PV=CrPV = \frac{C}{r}

where:

  • PVPV: present value of the perpetuity
  • CC: constant periodic payment
  • rr: discount rate per period

The present value equals the principal amount that, if invested at rate rr, would generate exactly CC in interest each period forever, leaving the principal intact. If you have C/rC/r dollars earning rate rr, your interest income is (C/r)×r=C(C/r) \times r = C per period. You can withdraw this interest forever without touching the principal, creating a perpetual income stream of CC per period.

This formula emerges from taking the limit of the annuity formula as TT \to \infty:

limTC1(1+r)Tr=Cr\lim_{T \to \infty} C \cdot \frac{1 - (1+r)^{-T}}{r} = \frac{C}{r}

As the number of periods grows without bound, the term (1+r)T(1+r)^{-T} vanishes (for any positive rr), leaving only C/rC/r. This mathematical result confirms our intuition: payments occurring in the very distant future contribute almost nothing to present value, so whether the series ends at period 1000 or continues forever makes virtually no difference.

Perpetuity

A perpetuity is a stream of equal payments continuing indefinitely. Its present value equals the payment divided by the interest rate: PV=C/rPV = C/r.

In[27]:
Code
def perpetuity_pv(payment, r):
    """Present value of a perpetuity."""
    return payment / r


## Example: Endowment providing $50,000 annually at 4% rate
annual_payment = 50000
r = 0.04

endowment_needed = perpetuity_pv(annual_payment, r)
Out[28]:
Console
Annual scholarship payment: $50,000
Interest rate: 4.0%

Endowment required: $1,250,000

To fund a $50,000 annual scholarship in perpetuity at 4%, the endowment must be $1.25 million. The principal remains intact while only the interest supports the payments.

A growing perpetuity accounts for payments that increase at a constant rate gg:

PV=Crg(requires r>g)PV = \frac{C}{r - g} \quad \text{(requires } r > g\text{)}

where:

  • PVPV: present value of the growing perpetuity
  • CC: first payment (occurring one period from now)
  • rr: discount rate per period
  • gg: constant growth rate of payments (g<rg < r required for convergence)
  • rgr - g: the "net" discount rate after accounting for growth

Growth partially offsets discounting. When future payments grow, their nominal amounts increase over time, partially counteracting the effect of discounting. For example, if payments grow at 2% while you discount at 5%, the effective discount rate is only 3%. As gg approaches rr, each future payment's present value barely declines, and the sum explodes. Hence the requirement that r>gr > g for the series to converge.

To see why mathematically, consider that the tt-th payment is C(1+g)t1C(1+g)^{t-1}, and its present value is C(1+g)t1/(1+r)tC(1+g)^{t-1}/(1+r)^t. This equals C/(1+r)[(1+g)/(1+r)]t1C/(1+r) \cdot [(1+g)/(1+r)]^{t-1}. The series converges only when (1+g)/(1+r)<1(1+g)/(1+r) < 1, which requires g<rg < r. If growth equals or exceeds the discount rate, each payment's present value is at least as large as the previous one's, and an infinite sum of non-decreasing positive terms diverges.

This formula is the foundation of the Gordon Growth Model for stock valuation, which we will explore when discussing equity analysis.

Out[29]:
Visualization
Line chart showing annuity present value approaching the horizontal perpetuity asymptote.
Present value of a $1,000 annual annuity converges to the perpetuity value as the number of periods increases. At 5% discount rate, a 50-year annuity captures 91% of the perpetuity value; beyond 100 years, the difference is negligible.

Worked Example: Bond Valuation

Let us apply our time value framework to value a simple bond. A bond is a package of cash flows: periodic coupon payments plus return of principal at maturity. This makes bond valuation a direct application of present value concepts.

Consider a 5-year bond with:

  • Face value: $1,000
  • Coupon rate: 4% (annual payments)
  • Market yield: 5%

The bond's price equals the present value of all future cash flows:

P=t=1540(1.05)t+1000(1.05)5P = \sum_{t=1}^{5} \frac{40}{(1.05)^t} + \frac{1000}{(1.05)^5}

where:

  • PP: bond price (present value of all cash flows)
  • 4040: annual coupon payment ($1,000 × 4%)
  • 1.051.05: one plus the yield (1 + 0.05)
  • 10001000: face value returned at maturity
  • The first term t=1540(1.05)t\sum_{t=1}^{5} \frac{40}{(1.05)^t}: present value of the coupon stream (an annuity)
  • The second term 1000(1.05)5\frac{1000}{(1.05)^5}: present value of the principal repayment

The structure of this formula reflects the two components of a bond's value. The coupon stream is an annuity: five equal payments of $40, one at the end of each year. We can either discount each payment separately or use the annuity formula. The principal repayment is a single lump sum occurring at maturity, which we discount using the basic present value formula. The bond price is simply the sum of these two present values.

In[30]:
Code
def annuity_pv(payment, r, periods):
    """Present value of ordinary annuity."""
    if r == 0:
        return payment * periods
    annuity_factor = (1 - (1 + r) ** (-periods)) / r
    return payment * annuity_factor


def bond_price(face_value, coupon_rate, yield_rate, years):
    """
    Calculate bond price given face value, coupon rate, yield, and maturity.
    Assumes annual coupon payments.
    """
    coupon = face_value * coupon_rate

    # PV of coupons (annuity)
    pv_coupons = annuity_pv(coupon, yield_rate, years)

    # PV of face value
    pv_face = face_value / (1 + yield_rate) ** years

    return pv_coupons + pv_face


## Bond parameters
face_value = 1000
coupon_rate = 0.04
yield_rate = 0.05
years = 5

price = bond_price(face_value, coupon_rate, yield_rate, years)
coupon = face_value * coupon_rate
Out[31]:
Console
Bond Valuation
========================================
Face value:    $1,000
Coupon rate:   4.0% ($40/year)
Market yield:  5.0%
Maturity:      5 years

Bond price:    $956.71
Discount:      $43.29

The bond trades at a discount ($956.71 vs. $1,000 face) because its 4% coupon is below the 5% market yield. Investors require compensation for accepting below-market coupons, which comes in the form of a lower price.

Let's visualize how the bond's cash flows contribute to its price:

Out[32]:
Visualization
Bar chart showing nominal bond cash flows over 5 years with larger final payment.
Nominal cash flows of a 5-year bond with 4% coupon. The final year includes both the coupon payment and principal repayment.
Bar chart showing present value of bond cash flows decreasing for later years.
Present value of bond cash flows discounted at 5% yield. More distant cash flows contribute less to the bond price.

The final cash flow of $1,040 (coupon plus principal) accounts for the bulk of the bond's value, but its contribution is substantially reduced when discounted back five years.

Out[33]:
Visualization
Downward sloping curve showing bond price decreasing as yield increases, crossing par at 4% yield.
Inverse relationship between bond price and yield for a 5-year, 4% coupon bond. When yield equals the coupon rate (4%), the bond trades at par ($1,000). Below par when yields exceed coupons; above par when yields fall below coupons.

Limitations and Practical Considerations

The time value of money framework is powerful but rests on assumptions that may not hold in practice. Understanding these limitations helps you apply the framework appropriately and recognize when more sophisticated approaches are needed.

The most significant limitation is the assumption of a constant, known discount rate. In reality, interest rates vary over time, differ across maturities (the term structure), and contain uncertainty about future values. A bond's yield is actually a single rate that equates the present value calculation to the market price. This yield is a convenient fiction rather than a fundamental constant. When valuing complex instruments or long-dated cash flows, using a single rate obscures important term structure effects. Proper fixed-income analysis requires working with the full yield curve, extracting zero-coupon rates, and often modeling rate dynamics stochastically.

Selecting the appropriate discount rate is one of the most important and difficult judgments in any valuation exercise. For risk-free cash flows like Treasury bonds, the choice is relatively straightforward. For corporate bonds, project cash flows, or equity valuations, the discount rate must reflect credit risk, liquidity risk, and business risk. Small changes in the discount rate produce large changes in present value, particularly for long-duration cash flows. This sensitivity means valuation is inherently uncertain, and practitioners should always examine how their conclusions change under different discount rate assumptions.

Day count conventions, compounding frequencies, and accrued interest calculations introduce complexity that can cause errors if handled incorrectly. Different markets quote rates differently. The same nominal rate under different conventions produces different cash flows. Professional fixed-income systems maintain detailed convention databases, and any serious quantitative work requires careful attention to these details.

Finally, the framework assumes cash flows are known with certainty. Most real-world cash flows are uncertain: companies may default, projects may underperform, and prepayments may occur unexpectedly. Extending the basic framework to handle uncertainty requires probability theory, expected value calculations, and risk adjustment. We address these topics in subsequent chapters.

Summary

This chapter covered the core concepts of time value of money and interest rates used throughout quantitative finance. You learned that money has time value because it can be invested, inflation erodes purchasing power, and future payments carry uncertainty.

We developed the mathematics of compounding, progressing from simple interest through discrete compounding to the continuous compounding framework preferred in derivatives pricing. You now understand how to move between present and future values using discount factors, and how to convert between different rate quotations (APR, EAR, continuous rates) and day count conventions.

For valuing cash flow streams, you learned to calculate net present value, recognize when the annuity and perpetuity formulas apply, and understand the sensitivity of valuations to discount rate assumptions. The bond valuation example demonstrated how these tools combine in practice.

The key formulas to remember are:

  • Future value (continuous): FV=PertFV = Pe^{rt}
  • Present value (continuous): PV=FVertPV = FV \cdot e^{-rt}
  • Annuity PV: PV=C1(1+r)TrPV = C \cdot \frac{1-(1+r)^{-T}}{r}
  • Perpetuity PV: PV=C/rPV = C/r

These building blocks appear throughout the book as we work with more complex instruments. The next chapter examines how interest rates across different maturities form term structures, and how we extract the discount factors needed for precise valuation from market prices.

Quiz

Ready to test your understanding? Take this quick quiz to reinforce what you've learned about the time value of money and interest rates.

Loading component...

Reference

BIBTEXAcademic
@misc{timevalueofmoneyinterestratesfinancefundamentals, author = {Michael Brenndoerfer}, title = {Time Value of Money & Interest Rates: Finance Fundamentals}, year = {2025}, url = {https://mbrenndoerfer.com/writing/time-value-money-interest-rates-compounding-discounting}, organization = {mbrenndoerfer.com}, note = {Accessed: 2025-12-25} }
APAAcademic
Michael Brenndoerfer (2025). Time Value of Money & Interest Rates: Finance Fundamentals. Retrieved from https://mbrenndoerfer.com/writing/time-value-money-interest-rates-compounding-discounting
MLAAcademic
Michael Brenndoerfer. "Time Value of Money & Interest Rates: Finance Fundamentals." 2025. Web. 12/25/2025. <https://mbrenndoerfer.com/writing/time-value-money-interest-rates-compounding-discounting>.
CHICAGOAcademic
Michael Brenndoerfer. "Time Value of Money & Interest Rates: Finance Fundamentals." Accessed 12/25/2025. https://mbrenndoerfer.com/writing/time-value-money-interest-rates-compounding-discounting.
HARVARDAcademic
Michael Brenndoerfer (2025) 'Time Value of Money & Interest Rates: Finance Fundamentals'. Available at: https://mbrenndoerfer.com/writing/time-value-money-interest-rates-compounding-discounting (Accessed: 12/25/2025).
SimpleBasic
Michael Brenndoerfer (2025). Time Value of Money & Interest Rates: Finance Fundamentals. https://mbrenndoerfer.com/writing/time-value-money-interest-rates-compounding-discounting