0% found this document useful (0 votes)
39 views47 pages

Derivatives Practice Problems (With Python)

The document provides a series of practice problems related to derivatives and interest rates, including calculations for discrete and continuous compounding, equivalent annual rates, and bond pricing. It includes detailed solutions and Python code for computing various financial metrics. The content is structured into chapters, each addressing different aspects of interest rates and their applications in finance.

Uploaded by

prajtrades
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views47 pages

Derivatives Practice Problems (With Python)

The document provides a series of practice problems related to derivatives and interest rates, including calculations for discrete and continuous compounding, equivalent annual rates, and bond pricing. It includes detailed solutions and Python code for computing various financial metrics. The content is structured into chapters, each addressing different aspects of interest rates and their applications in finance.

Uploaded by

prajtrades
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 47

T

Derivatives Practice Problems


(with Python)
AF
Alexandre Landi1

July 7, 2025
DR

1 E-mail: [email protected], Website: quantlandi.substack.com


Derivatives Practice Problems Alexandre Landi

T
AF
DR

2 © 2025 Alexandre Landi


Contents

1 Interest Rates 5
1.1 Return with Discrete Compounding . . . . . . . . . . . . . . . . . . . . . 6

T
1.2 Return with Continuous Compounding . . . . . . . . . . . . . . . . . . . 9
1.3 Equivalent Annual Rate . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4 Equivalent Continuous Rate . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5
AF
Bond Pricing with Continuous Compounding . . . . . . . . . . . . . . . . 17
1.6 Bond Pricing with Discrete Compounding . . . . . . . . . . . . . . . . . 20
1.7 Compounding Conventions Across Bond Markets . . . . . . . . . . . . . 22
1.8 Yield to Maturity (YTM) Estimation . . . . . . . . . . . . . . . . . . . . 25
1.9 Par Yield with Continuous Compounding . . . . . . . . . . . . . . . . . . 28
1.10 Par Yield with Discrete Compounding . . . . . . . . . . . . . . . . . . . 31
DR

1.11 Forward Rates with Continuous Compounding . . . . . . . . . . . . . . . 34


1.12 Forward Rates with Discrete Compounding . . . . . . . . . . . . . . . . . 37
1.13 FRA Valuation with Continuous Compounding . . . . . . . . . . . . . . 41
1.14 FRA Valuation with Discrete Compounding . . . . . . . . . . . . . . . . 44

3
Derivatives Practice Problems Alexandre Landi

T
AF
DR

4 © 2025 Alexandre Landi


Chapter 1

Interest Rates

T
AF
DR

5
Derivatives Practice Problems Alexandre Landi

1.1 Return with Discrete Compounding

Problem

An investor receives $1,100 in one year in return for an investment of $1,000 now. Cal-
culate the percentage return per annum under the following compounding conventions:

• Annual compounding

• Semiannual compounding

• Monthly compounding

T
(Adapted from Hull (2021), Practice Question 4.3)

Solution
AF
Let:

• Initial investment: IV = 1,000

• Future value: F V = 1,100

• Nominal annual rate: r


DR

• Number of compounding periods per year: m

The future value under periodic compounding is:

m
r

F V = IV 1 +
m

We isolate r by solving for it:

m
r FV

1+ =
m IV

Take the mth root of both sides:

1/m
r FV

1+ =
m IV

Subtract 1 and multiply both sides by m:

6 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

r F V 1/m
 
= −1
m IV
F V 1/m
  !
r= −1 ·m
IV

We now compute this for different values of m:

• Annual compounding (m = 1):

1100
 
r= −1
1000
= 1.10 − 1
= 0.10
= 10.00%

T
• Semiannual compounding (m = 2):
AF
1100 1/2
  !
r= −1 ·2
1000
= (1.0488 − 1) · 2
= 0.0488 · 2
= 0.0976
= 9.76%
DR

• Monthly compounding (m = 12):

1100 1/12
  !
r= − 1 · 12
1000
= (1.00797 − 1) · 12
= 0.00797 · 12
= 0.0957
= 9.57%

Answer

• Annual: 10.00%

• Semiannual: 9.76%

• Monthly: 9.57%

7 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Python Solution

import numpy as np

def compute_nominal_rate(FV, IV, compounding_periods):


"""
Calculate the nominal annual return rate from FV and IV
under periodic compounding.

Parameters:
FV: Future Value
IV: Initial Investment
compounding_periods: Compounding frequency per year

Returns:
Nominal annual interest rate
"""

T
rate_per_period = (FV / IV) ** (1 / compounding_periods) - 1
nominal_rate = rate_per_period * compounding_periods
return nominal_rate

# Inputs
FV = 1100
IV = 1000
AF
frequencies = {
1: "Annual",
2: "Semiannual",
12: "Monthly"
}

for m, label in frequencies.items():


r = compute_nominal_rate(FV, IV, m)
print(f"{label:<10}: {r:.2%}")
DR

Video Explanation

A video explanation of this exercise can be found here:

8 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.2 Return with Continuous Compounding

Problem

An investor receives $1,100 in one year in return for an investment of $1,000 now. Cal-
culate the percentage return per annum with continuous compounding.

(Adapted from Hull (2021), Practice Question 4.3)

Solution

Let:

• Final value: F V = 1,100

T
• Initial value: IV = 1,000

• Annual continuous rate: r


AF
We start from the future value formula for compounding:

m
r

F V = IV · m→∞
lim 1+
m
= IV · er
DR

Solve for r:

FV
er =
IV
FV

r = ln
IV

Substitute the values:

1100
 
r = ln
1000
= ln(1.1)
≈ 0.0953
= 9.53%

Answer

The percentage return per annum with continuous compounding is approximately 9.53%.

9 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Python Solution

import numpy as np

def compute_continuous_return(FV, IV):


"""
Compute the continuously compounded annual return.

Parameters:
FV: Future Value
IV: Initial Investment

Returns:
Annual rate with continuous compounding
"""
return np.log(FV / IV)

T
# Example usage
r_cont = compute_continuous_return(1100, 1000)
print(f"Continuous return: {r_cont:.2%}")

Video Explanation
AF
A video explanation of this exercise can be found here:
DR

10 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.3 Equivalent Annual Rate

Problem

A bank quotes an annual nominal interest rate of 7% with quarterly compounding. What
is the equivalent annual rate (EAR), assuming annual compounding?

(Adapted from Hull (2021), Practice Question 4.1)

Solution

Let:

T
• r: nominal annual interest rate = 7% = 0.07

• m: compounding frequency per year = 4 (quarterly)

• rq = r
= 0.07
AF
= 0.0175: interest rate per quarter
m 4

• P : initial principal amount (arbitrary, since it cancels out)

• ra : equivalent annual rate (EAR), compounded annually

The future value after one quarter is:


DR

F V1 = P (1 + rq )

The future value after four quarters (one year) using quarterly compounding is:

F V4 = P (1 + rq )(1 + rq )(1 + rq )(1 + rq )


= P (1 + rq )4

The equivalent annual rate ra is defined such that the future value under annual com-
pounding is:

F Va = P (1 + ra )

By the principle of no arbitrage, these must be equal:

P (1 + ra ) = P (1 + rq )4

Dividing both sides by P and solving for ra :

11 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1 + ra = (1 + rq )4
ra = (1 + rq )4 − 1

Substituting rq = 0.0175:

ra = (1 + 0.0175)4 − 1
= (1.0175)4 − 1
≈ 1.0719 − 1
≈ 0.0719
≈ 7.19%

T
Answer

The equivalent annual rate (EAR) is approximately 7.19%.

Python Solution
AF
def compute_ear(nominal_rate, compounding_periods):
"""
Compute the Effective Annual Rate (EAR) from a nominal
rate and compounding frequency.

Parameters:
nominal_rate (float): Annual nominal interest rate
DR

(e.g., 0.07 for 7%)


compounding_periods (int): Number of compounding
periods per year

Returns:
float: Effective Annual Rate (EAR)
"""
ear = (1 + nominal_rate / compounding_periods) ** compounding_periods - 1
return ear

# Example usage
ear = compute_ear(0.07, 4)
print(f"Effective Annual Rate (EAR): {ear:.4%}")

Video Explanation

A video explanation of this exercise can be found here:

12 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

T
AF
DR

13 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.4 Equivalent Continuous Rate

Problem

A bank quotes an annual nominal interest rate of 7% with quarterly compounding. What
is the equivalent rate with continuous compounding?

(Adapted from Hull (2021), Practice Question 4.1)

Solution

Let:

T
• r: nominal annual interest rate = 7% = 0.07

• f : number of compounding periods per year = 4 (quarterly)

• rq = r
f
= 0.07
4
AF
= 0.0175: quarterly interest rate

• rc : equivalent annual rate under continuous compounding (to be determined)

• P : initial principal amount (used for equivalence of future values)

The idea is to find the continuously compounded rate rc that produces the same future
value after one year as quarterly compounding at a nominal rate of 7%.
DR

Future value under quarterly compounding:


4
0.07

4
F Vq = P (1 + rq ) = P 1 +
4

Future value under continuous compounding:

F Vc = P erc

Equating the two future values:

P erc = P (1 + rq )4

Dividing both sides by P and solving for rc :

erc = (1 + rq )4
 
rc = ln (1 + rq )4
= 4 · ln(1 + rq )

14 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Substitute the value of rq :

0.07
 
rc = 4 · ln 1 +
4
= 4 · ln(1.0175)
≈ 4 · 0.0171
≈ 0.0694
≈ 6.94%

Interpretation: This means that earning interest at a rate of 7% compounded quar-


terly is equivalent to earning interest continuously at a rate of approximately 6.94%.

T
Answer

The equivalent rate with continuous compounding is approximately 6.94%.


AF
Python Solution

import numpy as np

def compute_continuous_equivalent(nominal_rate, compounding_periods):


"""
Compute the equivalent continuous compounding rate from
a nominal rate with periodic compounding.
DR

Parameters:
nominal_rate: Annual nominal rate (e.g., 0.07 for 7%)
compounding_periods: Number of compounding periods per year

Returns:
Equivalent continuous rate
"""
r_q = nominal_rate / compounding_periods
r_c = compounding_periods * np.log(1 + r_q)
return r_c

# Example usage
r_c = compute_continuous_equivalent(0.07, 4)
print(f"Continuous equivalent rate: {r_c:.4%}")

Video Explanation

A video explanation of this exercise can be found here:

15 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

T
AF
DR

16 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.5 Bond Pricing with Continuous Compounding

Problem

We are given continuously compounded zero rates:

Maturity (months) Zero Rate (%)


6 4.0
12 4.2
18 4.4
24 4.6
30 4.8

T
A bond has the following characteristics:

• Face value: $100

• Maturity: 30 months
AF
• Coupon: 4% annually, paid semiannually

Goal: Compute the cash price (present value) of the bond.

(Adapted from Hull (2021), Practice Question 4.10)


DR

Step 1: Cash Flows

Since the bond pays 4% annually in two equal semiannual installments, we have:

Time (months) Cash Flow


6 2
12 2
18 2
24 2
30 102

Step 2: Present Value of Each Cash Flow

Use the continuous compounding present value formula:

P V = C · e−r·t

Where:

17 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

• C: cash flow

• r: continuously compounded zero rate

• t: time in years

At t = 0.5 years: PV = 2 · e−0.040·0.5 = 2 · 0.9802 = 1.9604


At t = 1.0 years: PV = 2 · e−0.042·1.0 = 2 · 0.9589 = 1.9177
At t = 1.5 years: PV = 2 · e−0.044·1.5 = 2 · 0.9362 = 1.8723
At t = 2.0 years: PV = 2 · e−0.046·2.0 = 2 · 0.9123 = 1.8242
At t = 2.5 years: PV = 102 · e−0.048·2.5 = 102 · 0.8870 = 90.4659

Time (years) Cash Flow Rate Discount Factor Present Value

T
−0.040·0.5
0.5 2 0.040 e = 0.9802 2 · 0.9802 = 1.9604
1.0 2 0.042 e−0.042·1.0 = 0.9589 2 · 0.9589 = 1.9177
−0.044·1.5
1.5 2 0.044 e = 0.9362 2 · 0.9362 = 1.8723
−0.046·2.0
2.0 2 0.046 e = 0.9123 2 · 0.9123 = 1.8242
AF
2.5 102 0.048 e−0.048·2.5 = 0.8870 102 · 0.8870 = 90.4659

Step 3: Total Present Value

Bond Price = 1.9604 + 1.9177 + 1.8723 + 1.8242 + 90.4659


DR

= 98.04

Answer

The cash price of the bond is approximately $98.04.

Python Solution

import numpy as np

# Cash flow data: (months, rate, amount)


cash_flows = [
(6, 0.040, 2),
(12, 0.042, 2),
(18, 0.044, 2),
(24, 0.046, 2),
(30, 0.048, 102),
]

18 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

total_pv = 0
for months, rate, amount in cash_flows:
t = months / 12
df = np.exp(-rate * t)
pv = amount * df
print(f"Time: {t:.2f} yrs | Rate: {rate:.3%} | DF: {df:.4f} | PV: {pv:.4f}")
total_pv += pv

print(f"\nBond Price: ${total_pv:.2f}")

T
AF
DR

19 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.6 Bond Pricing with Discrete Compounding

Problem

We are given zero rates (compounded semiannually):

Maturity (months) Zero Rate (%)


6 4.0
12 4.2
18 4.4
24 4.6
30 4.8

T
A bond has the following characteristics:

• Face value: $100


• Maturity: 30 months
AF
• Coupon: 4% annually, paid semiannually

Goal: Compute the cash price (present value) of the bond.

(Adapted from Hull (2021), Practice Question 4.10)

Step 1: Cash Flows


DR

Time (months) Cash Flow


6 2
12 2
18 2
24 2
30 102

Step 2: Present Value of Each Cash Flow

We use the formula for present value with discrete compounding:


C
PV =
(1 + r/m)mt

Where:

• C: cash flow

20 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

• r: annual zero rate

• m = 2: compounding frequency (semiannual)

• t: time in years

Time (years) Cash Flow Rate Discount Factor Present Value


1
0.5 2 4.000% (1+0.02)1 = 0.9804 2 · 0.9804 = 1.9608
1
1.0 2 4.200% (1+0.021)2 = 0.9593 2 · 0.9593 = 1.9186
1
1.5 2 4.400% (1+0.022)3 = 0.9368 2 · 0.9368 = 1.8736
1
2.0 2 4.600% (1+0.023)4 = 0.9131 2 · 0.9131 = 1.8261
1
2.5 102 4.800% (1+0.024)5 = 0.8882 102 · 0.8882 = 90.5942

T
Bond Price = 1.9608 + 1.9186 + 1.8736 + 1.8261 + 90.5942
= 98.17

Answer
AF
The cash price of the bond is approximately $98.17.

Python Solution

# Discrete compounding with semiannual frequency


DR

cash_flows = [
(6, 0.040, 2),
(12, 0.042, 2),
(18, 0.044, 2),
(24, 0.046, 2),
(30, 0.048, 102),
]

m = 2 # Semiannual compounding
total_pv = 0

for months, rate, amount in cash_flows:


t = months / 12
n = int(t * m)
r_per_period = rate / m
df = 1 / (1 + r_per_period) ** n
pv = amount * df
print(f"Time: {t:.2f} yrs | Rate: {rate:.3%} | DF: {df:.4f} | PV: {pv:.4f}")
total_pv += pv

print(f"\nBond Price: ${total_pv:.2f}")

21 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.7 Compounding Conventions Across Bond Mar-


kets

Motivation

In theoretical finance problems, we often specify whether interest rates are compounded
annually, semiannually, or continuously. But in the real world, these conventions are not
interchangeable or arbitrarily chosen — they reflect deep-rooted market practices, legal
norms, and practical considerations.
This section explores how different markets apply compounding conventions in practice
and why it matters in pricing and valuation.

T
AF
Why Compounding Convention Matters

When discounting future cash flows, the compounding method used must match the
convention of the interest rate curve you’re working with — not the frequency of bond
coupon payments.
Key Point: Just because a bond pays coupons semiannually does not mean you must
DR

use semiannual compounding. Instead:

Given Use this discounting


Zero rate is continuously compounded P V = C · e−rt
C
Zero rate is annually compounded P V = (1+r) t
C
Zero rate is semiannually compounded P V = (1+r/2)2t

This distinction ensures correct pricing, arbitrage-free models, and consistency between
instruments like bonds, FRAs, and swaps.

22 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Compounding Conventions in Practice

Market/Instrument Coupon Frequency Yield/Discount Conven-


tion
U.S. Treasury Bonds/Notes Semiannual Semiannual compounding
U.S. Corporate and Munic- Semiannual Semiannual compounding
ipal Bonds (bond-equivalent yield)
German Bunds / French Annual/Semiannual Annual compounding for
OATs quoting yields
UK Gilts Semiannual Annual compounding for
yield quotes
Derivatives (Swaps, FRAs, N/A Continuous compound-
Zero Curves) ing (common in modeling)
Savings Accounts, Mort- Monthly/Quarterly Monthly or quarterly com-

T
gages (Retail) pounding
Floating-Rate Notes Quarterly (typical) Rate reset determines com-
(FRNs) pounding; often quarterly
AF
Why Continuous Compounding in Derivatives?

In derivatives pricing — such as FRAs, swaps, caps/floors — continuous compounding is


preferred because:

• It simplifies calculus in analytical models (e.g., Black-Scholes, swap valuation).


DR

• Compounded rates are smooth and differentiable, ideal for yield curve modeling.

• Risk-neutral pricing often assumes exponential discounting.

Sources

Source URL
U.S. Treasury yield conventions https://home.treasury.gov/policy-issues/
financing-the-government/interest-rate-statistics/
interest-rates-frequently-asked-questions
German Bund quoting standards (ECB) https://www.ecb.europa.eu/stats/financial_markets_and_
interest_rates/euro_area_yield_curves/html/index.en.
html
Investopedia: Bond Yield Conventions https://www.investopedia.com/articles/bonds/08/
bond-yield-convention-conversion.asp
Bloomberg: Swap and zero curve docu- https://www.bloomberg.com/professional/solution/curves
mentation
Bankrate: U.S. Treasury coupon payment https://www.bankrate.com/investing/
norms how-often-do-treasury-bonds-pay-interest

23 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Conclusion

In summary, compounding conventions vary across instruments and regions. Bond an-
alysts and derivatives traders must be vigilant in aligning the valuation method with
the proper market standard — mismatching conventions can lead to pricing errors and
arbitrage opportunities.
Understanding these conventions ensures accurate pricing, risk assessment, and regulatory
compliance in global markets.

T
AF
DR

24 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.8 Yield to Maturity (YTM) Estimation

Problem

We are given the following bond:

• Face value: $100

• Maturity: 3 years (6 semiannual periods)

• Coupon: 8% annually ⇒ $4 every 6 months

T
• Current market price: $104

Goal: Estimate the bond’s yield to maturity (YTM), expressed as a semiannual rate.
AF
(Adapted from Hull (2021), Practice Question 4.11)

Step 1: Cash Flows

Time (months) Cash Flow


6 4
DR

12 4
18 4
24 4
30 4
36 104

Step 2: Estimate Yield by Trial and Error

We solve for y in the equation:

4 4 4 4 4 104
104 = 1
+ 2
+ 3
+ 4
+ 5
+
(1 + y) (1 + y) (1 + y) (1 + y) (1 + y) (1 + y)6
5
X 4 104
= i
+
i=1 (1 + y) (1 + y)6

We try several values of y and compute the corresponding bond price:

25 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Semiannual Yield (y) Bond Price


3.00% 105.42
3.10% 104.86
3.20% 104.31
3.30% 103.75
3.40% 103.21
3.50% 102.66

Intermediate Answer

The bond’s cash price is $104. The yield that gets us closest is:

T
YTM ≈ 3.2% (semiannual) ⇒ 6.4% per annum (compounded semiannually)

Python Solution
AF
cash_flows = [4, 4, 4, 4, 4, 104]
price_target = 104

for y in [0.030, 0.031, 0.032, 0.033, 0.034, 0.035]:


pv = sum(cf / (1 + y)**i for i, cf in enumerate(cash_flows, start=1))
print(f"y = {y:.3%} -> Bond Price = {pv:.2f}")

Step 3: Solving for Yield Using Python


DR

We can solve for the semiannual yield to maturity (YTM) numerically using the numpy_financial
package:

import numpy_financial as npf

# Define bond parameters


price = 104 # Bond price
n_periods = 6 # 6 periods of 6 months
coupon = 4 # $4 every 6 months
face_value = 100 # Final principal payment

# Cash flows: 5 coupons + final coupon + face value


cash_flows = [4] * 5 + [4 + face_value]

# Use numpy_financial.irr to solve for internal rate of return


ytm = npf.irr([-price] + cash_flows)
print(f"Yield to Maturity (semiannual): {ytm:.4%}")
print(f"Annualized YTM (compounded semiannually): {2 * ytm:.4%}")

This yields:

26 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

• Semiannual YTM: 3.26%

• Annualized YTM: 6.51%

Interpretation

The par yield is the annual coupon rate that would make the bond’s price equal its face
value. With continuously compounded discounting, higher discounting power reduces
present value. Thus, a slightly higher coupon (7.07%) is required to offset the steeper
discounting from compounding continuously at rising rates.

T
AF
DR

27 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.9 Par Yield with Continuous Compounding

Problem

We are given zero rates and asked to compute the par yield — the annualized coupon
rate at which a bond would be priced at par.

• Face value: $100

• Maturity: 2 years

• Coupon frequency: Semiannual (4 total payments)

T
• Objective: Find coupon rate c such that bond price = 100
AF
(Adapted from Hull (2021), Practice Question 4.12)

Zero Rates and Discount Factors (Continuous Compounding)

Time (yrs) Zero Rate R(t) Discount Factor


0.5 5.0% e−0.05·0.5 = 0.9753
1.0 6.0% e−0.06·1.0 = 0.9418
1.5 6.5% e−0.065·1.5 = 0.9071
DR

2.0 7.0% e−0.07·2.0 = 0.8694

Step 1: Present Value Equation

Let c be the annual coupon rate (expressed in decimal form). Since the bond pays
semiannual coupons, each coupon payment is 2c .
The bond makes four payments: one every 6 months. The present value of each payment
is computed using the corresponding continuously compounded discount factor:

• At t = 0.5: receive 2c , discount by e−0.05·0.5

• At t = 1.0: receive 2c , discount by e−0.06·1.0

• At t = 1.5: receive 2c , discount by e−0.065·1.5

• At t = 2.0: receive c
2
+ 100, discount by e−0.07·2.0

28 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

General Framework

We aim to determine the coupon rate c that prices a bond at par (P V = 100) using
continuously compounded zero rates.
Let:

• c: Annual coupon rate (unknown)

• m: Number of coupon payments per year (e.g., m = 2 for semiannual)

• F : Face value of the bond (typically 100)

• Ri : Zero rate (continuously compounded) applicable at time ti

• ti : Time of the i-th cash flow (in years)

T
• n: Total number of coupon payments (e.g., 4 for a 2-year semiannual bond)

Present Value of the Bond


AF
The bond pays mc at each time ti for i = 1, 2, . . . , n − 1, and c
m
+ F at maturity tn . The
present value is the sum of all discounted cash flows:

c −R1 t1 c −R2 t2 c
 
PV = ·e + ·e + ··· + + F · e−Rn tn
m m m

This can be compactly written as:


DR

n
c −Ri ·ti
+ F · e−Rn ·tn
X
PV = ·e
i=1 m

This general form is useful to understand how the par yield is shaped by the term structure
of zero rates. The higher the zero rates, the lower the discount factors, and thus the higher
the coupon c required to maintain a price of 100.
So the total present value (PV) of the bond is:

c c c c
 
P V = · e−0.05·0.5 + · e−0.06·1.0 + · e−0.065·1.5 + + 100 · e−0.07·2.0
2 2 2 2
c  
= · e−0.05·0.5 + e−0.06·1.0 + e−0.065·1.5 + e−0.07·2.0 + 100 · e−0.07·2.0
2

Substituting the known discount factors:

c
PV = · (0.9753 + 0.9418 + 0.9071 + 0.8694) + 100 · 0.8694
2
c
= · 3.6936 + 86.94
2
29 © 2025 Alexandre Landi
Derivatives Practice Problems Alexandre Landi

We want this bond to be priced at par:

c
100 = · 3.6936 + 86.94
2
c
13.06 = · 3.6936
2
c 13.06
= ≈ 3.535
2 3.6936
c = 7.07%

Interpretation

The par yield is the annual coupon rate that would make the bond’s price equal its face
value. With continuously compounded discounting, higher discounting power reduces

T
present value. Thus, a slightly higher coupon (7.07%) is required to offset the steeper
discounting from compounding continuously at rising rates.

Answer
AF
• Par yield with continuous compounding: 7.07% per annum

Python Solution

import numpy as np
DR

# Time in years and zero rates (continuous)


times = [0.5, 1.0, 1.5, 2.0]
rates = [0.05, 0.06, 0.065, 0.07]
discount_factors = [np.exp(-r * t) for r, t in zip(rates, times)]
pv_coupons = sum(discount_factors)
pv_face = 100 * discount_factors[-1]
coupon_half = (100 - pv_face) / pv_coupons
coupon_rate = 2 * coupon_half / 100

print(f"Discount factors: {discount_factors}")


print(f"Coupon (semiannual): {coupon_half:.4f}")
print(f"Par yield: {coupon_rate:.2%}")

30 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.10 Par Yield with Discrete Compounding

Problem

We are given zero rates and asked to compute the par yield — the annualized coupon
rate at which a bond would be priced at par.

• Face value: $100

• Maturity: 2 years

• Coupon frequency: Semiannual (4 total payments)

T
• Objective: Find coupon rate c such that bond price = 100
AF
(Adapted from Hull (2021), Practice Question 4.12)

Zero Rates and Discount Factors (Discrete Annual Compound-


ing)

Time (yrs) Zero Rate R(t) Discount Factor


0.5 5.0% (1.05)−0.5 = 0.9759
(1.06)−1.0 = 0.9434
DR

1.0 6.0%
1.5 6.5% (1.065)−1.5 = 0.9096
2.0 7.0% (1.07)−2.0 = 0.8734

Step 1: Present Value Equation

Let c be the annual coupon rate (in decimal form). Since the bond pays semiannual
coupons, each coupon payment is 2c . The bond pays this amount at each time point, and
the face value at maturity:

• At t = 0.5: receive 2c , discount by (1.05)−0.5

• At t = 1.0: receive 2c , discount by (1.06)−1.0

• At t = 1.5: receive 2c , discount by (1.065)−1.5

• At t = 2.0: receive c
2
+ 100, discount by (1.07)−2.0

31 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

General Framework

Let:

• c: Annual coupon rate (unknown)

• m = 2: Coupon payments per year (semiannual)

• F = 100: Face value

• Ri : Annual zero rate compounded discretely

• ti : Time of payment (in years)

• n = 4: Total number of coupon payments

T
Present Value of the Bond

c c c c
 
· (1 + R1 )−t1 + · (1 + R2 )−t2 + · (1 + R3 )−t3 + + F · (1 + R4 )−t4
PV =
m
AF
m m m

This compactly becomes:

n
c
· (1 + Ri )−ti + F · (1 + Rn )−tn
X
PV =
i=1 m

Step-by-Step Computation
DR

c c c c
 
PV = · (1.05)−0.5 + · (1.06)−1.0 + · (1.065)−1.5 + + 100 · (1.07)−2.0
2 2 2 2
c
= · (0.9759 + 0.9434 + 0.9096 + 0.8734) + 100 · 0.8734
2
c
= · 3.7023 + 87.34
2

Solve for c

We set P V = 100:

c
100 = · 3.7023 + 87.34
2
c
12.66 = · 3.7023
2
c 12.66
= ≈ 3.42
2 3.7023
c = 6.84%

32 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Interpretation

The par yield is the coupon rate that makes the bond worth exactly its face value.
Because discrete compounding discounts cash flows less aggressively than continuous
compounding, the par yield here is lower.

Answer

• Par yield with annual (discrete) compounding: 6.84% per annum

Python Solution

T
import numpy as np

times = [0.5, 1.0, 1.5, 2.0]


rates = [0.05, 0.06, 0.065, 0.07]
discount_factors = [(1 + r) ** -t for r, t in zip(rates, times)]
AF
pv_coupons = sum(discount_factors)
pv_face = 100 * discount_factors[-1]
coupon_half = (100 - pv_face) / pv_coupons
coupon_rate = 2 * coupon_half / 100

print(f"Discount factors: {discount_factors}")


print(f"Coupon (semiannual): {coupon_half:.4f}")
print(f"Par yield: {coupon_rate:.2%}")
DR

33 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.11 Forward Rates with Continuous Compounding

Problem

Suppose that risk-free zero interest rates with continuous compounding are as follows:

Maturity (months) Zero Rate (% per annum)


3 3.0
6 3.2
9 3.4
12 3.5
15 3.6
18 3.7

T
Calculate the forward interest rates for the second, third, fourth, fifth, and sixth quarters.

(Adapted from Hull (2021), Practice Question 4.4)


AF
Solution

Let:

• r1 : zero rate for maturity t1


• r2 : zero rate for maturity t2 , with t2 > t1
DR

• ft1 ,t2 : continuously compounded forward rate for the period between t1 and t2

The amount received at t2 from investing $1 today is:

Direct investment: er2 t2

Alternatively, an investor could:

• Invest $1 at r1 until t1 , then


• Reinvest at ft1 ,t2 from t1 to t2

So, the total value is:

er1 t1 · eft1 ,t2 (t2 −t1 ) = er2 t2


er1 t1 +ft1 ,t2 (t2 −t1 ) = er2 t2

Take the natural logarithm of both sides:

34 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

   
ln er1 t1 +ft1 ,t2 (t2 −t1 ) = ln er2 t2
r1 t1 + ft1 ,t2 (t2 − t1 ) = r2 t2

Solving for ft1 ,t2 :

r2 t2 − r1 t1
ft1 ,t2 =
t2 − t1

Application

T
Now compute each quarterly forward rate:

t1 = 0.25, r1 = 0.030
t2 = 0.50, r2 = 0.032
0.032 · 0.5 − 0.030 · 0.25

AF
f0.25,0.5 =
0.25
= 3.40%

t1 = 0.50, r1 = 0.032
t2 = 0.75, r2 = 0.034
0.034 · 0.75 − 0.032 · 0.5
⇒ f0.5,0.75 = = 3.80%
0.25

t1 = 0.75, r1 = 0.034
DR

t2 = 1.00, r2 = 0.035
0.035 · 1.0 − 0.034 · 0.75
⇒ f0.75,1.0 = = 3.90%
0.25

t1 = 1.00, r1 = 0.035
t2 = 1.25, r2 = 0.036
0.036 · 1.25 − 0.035 · 1.0
⇒ f1.0,1.25 = = 4.10%
0.25

t1 = 1.25, r1 = 0.036
t2 = 1.50, r2 = 0.037
0.037 · 1.5 − 0.036 · 1.25
⇒ f1.25,1.5 = = 4.30%
0.25

Answer

• Q2 (months 3–6): 3.40%

35 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

• Q3 (months 6–9): 3.80%

• Q4 (months 9–12): 3.90%

• Q5 (months 12–15): 4.10%

• Q6 (months 15–18): 4.30%

Python Solution

import numpy as np

def forward_rate(r1, t1, r2, t2):


"""
Compute the forward rate between times t1 and t2

T
using continuously compounded zero rates.
"""
return (r2 * t2 - r1 * t1) / (t2 - t1)

# Zero rate data


times = [0.25, 0.5, 0.75, 1.0, 1.25, 1.5]
AF
rates = [0.030, 0.032, 0.034, 0.035, 0.036, 0.037]

# Compute forward rates between adjacent time points


for i in range(len(times) - 1):
f = forward_rate(rates[i], times[i], rates[i+1], times[i+1])
print(f"Forward rate for Q{i+2}: {f:.2%}")

Video Explanation
DR

A video explanation of this exercise is available here:

36 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.12 Forward Rates with Discrete Compounding

Problem

Suppose that discrete zero interest rates (annual compounding) are as follows:

Maturity (months) Rate (% per annum)


3 3.00
6 3.20
9 3.40
12 3.50
15 3.60
18 3.70

T
Calculate forward interest rates for the second, third, fourth, fifth, and sixth quarters
under discrete compounding, which is commonly used in practice.
AF
(Adapted from Hull (2021), Practice Question 4.4)

Solution

Let:

• R1 , R2 : discrete zero rates for time t1 , t2


DR

• f1,2 : forward rate for the period from t1 to t2

We assume the use of discrete compounding, which is more common in practice.

Let:

• R1 : zero rate for maturity t1

• R2 : zero rate for maturity t2 , with t2 > t1

• f1,2 : forward rate agreed at time 0 for borrowing/lending between t1 and t2

An investor has two strategies to invest $1 today:

• Strategy A: Invest at rate R2 for t2 years. The value at time t2 is:

VA = (1 + R2 )t2

37 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

• Strategy B: Invest at rate R1 until t1 , then reinvest at forward rate f1,2 from t1
to t2 . The value at t2 is:

VB = (1 + R1 )t1 · (1 + f1,2 )t2 −t1

Since both strategies are risk-free, they must produce the same value in a no-arbitrage
market:

(1 + R1 )t1 · (1 + f1,2 )t2 −t1 = (1 + R2 )t2

To isolate f1,2 , divide both sides by (1 + R1 )t1 :

(1 + R2 )t2
(1 + f1,2 )t2 −t1 =
(1 + R1 )t1

T
Now take the (t2 − t1 )th root of both sides:

1
(1 + R2 )t2
!
t2 −t1
AF 1 + f1,2 =
(1 + R1 )t1

Subtract 1:

1
(1 + R2 )t2
!
t2 −t1
f1,2 = −1
(1 + R1 )t1

We now compute the quarterly forward rates under discrete compounding using the
following formula:
DR

1
(1 + R2 )t2
!
t2 −t1
ft1 ,t2 = −1
(1 + R1 )t1

where:

• R1 and R2 are the zero rates for maturities t1 and t2 , respectively,

• ft1 ,t2 is the forward rate for borrowing/lending between t1 and t2 .

Using this, we compute the forward rates for the second to sixth quarters:

1
(1+0.032)0.5
 
0.25
• Quarter 2: f0.25,0.5 = (1+0.030)0.25
− 1 = 3.40%
1
(1+0.034)0.75
 
0.25
• Quarter 3: f0.5,0.75 = (1+0.032)0.5
− 1 = 3.80%
1
(1+0.035)1
 
0.25
• Quarter 4: f0.75,1.0 = (1+0.034)0.75
− 1 = 3.80%

38 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1
(1+0.036)1.25
 
0.25
• Quarter 5: f1.0,1.25 = (1+0.035)1
− 1 = 4.00%
1
(1+0.037)1.5
 
0.25
• Quarter 6: f1.25,1.5 = (1+0.036)1.25
− 1 = 4.20%

Answer

• Quarter 2 forward rate: 3.40%

• Quarter 3 forward rate: 3.80%

• Quarter 4 forward rate: 3.80%

• Quarter 5 forward rate: 4.00%

• Quarter 6 forward rate: 4.20%

Remark

T
AF
These forward rates are very close to those obtained using continuous compounding.
This is because the time intervals involved are short (a quarter of a year), and the interest
rates are relatively low.
For small rates and short periods, the exponential function in continuous compounding
approximates the power function in discrete compounding. Therefore, both methods
yield nearly identical results in this context.
DR

Python Solution

def compute_forward_discrete(R1, t1, R2, t2):


"""
Compute discrete forward rate from two spot rates.

Parameters:
R1: Spot rate at time t1 (e.g., 0.03)
t1: Time in years (e.g., 0.25)
R2: Spot rate at time t2 (e.g., 0.032)
t2: Later time in years (e.g., 0.5)

Returns:
Forward rate for the interval [t1, t2] with discrete compounding.
"""
numerator = (1 + R2) ** t2
denominator = (1 + R1) ** t1
forward_factor = numerator / denominator
forward_rate = forward_factor ** (1 / (t2 - t1)) - 1
return forward_rate

# Example: Quarter 2

39 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

fwd = compute_forward_discrete(0.03, 0.25, 0.032, 0.5)


print(f"Forward Rate (Q2): {fwd:.4%}")

T
AF
DR

40 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.13 FRA Valuation with Continuous Compounding

Problem

Assume that risk-free zero interest rates with continuous compounding are as follows:

Maturity (months) Zero Rate (% per annum)


3 3.0%
6 3.2%
9 3.4%
12 3.5%
15 3.6%

T
18 3.7%

What is the value of an FRA where the holder will pay SOFR and receive 4.5% quarterly-
compounded interest on a notional of $1,000,000 for a 3-month period starting in 1 year?
AF
(Adapted from Hull (2021), Practice Question 4.5)

Solution

Step 1: Understanding the FRA


The FRA starts at month 12 and ends at month 15 (i.e., from t1 = 1 to t2 = 1.25 years).
DR

We assume:

• Notional: N = 1,000,000

• Day count fraction: ∆ = 0.25

• Fixed rate: RK = 4.5% = 0.045

• The floating rate is determined from the term structure (SOFR).

Step 2: Deriving the FRA Value Formula


We compute the net cash flow at maturity (15 months), then discount it to today using
the zero-coupon rate for 15 months.

Cash Flow at T = N · ∆ · (RK − RF )

The formula expresses the net cash flow received by the FRA holder at settlement time
T.

41 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

• N is the notional principal of the agreement.

• ∆ is the fraction of the year that the interest applies to (e.g., 0.25 for three months).

• RK is the fixed rate received.

• RF is the floating rate paid.

The difference RK −RF is the net interest rate benefit (or cost) to the holder. Multiplying
this by N · ∆ gives the dollar value of that benefit over the contract period.
This is the cash flow that will be settled at the end of the FRA term.
Discounted to present value using continuous compounding:

T
FRA Value = N · ∆ · (RK − RF ) · e−r·T

Where:
AF
• r: zero rate for 15 months (0.036)

• T = 1.25: time to cash flow

Step 3: Computing the Forward Rate RF


We use:

R2 t2 − R1 t1
DR

f (t1 , t2 ) =
t2 − t1

Substitute:
0.036 · 1.25 − 0.035 · 1
f (1, 1.25) =
0.25
0.045 − 0.035
=
0.25
0.01
=
0.25
= 0.04
= 4.00%

Step 4: Compute the FRA Value

FRA Value = 1,000,000 · 0.25 · (0.045 − 0.04) · e−0.036·1.25


= 1,250 · e−0.045
≈ 1,250 · 0.956
= $1,195

42 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

Answer

The value of the FRA is approximately $1,195, in favor of the holder.

Python Solution

import numpy as np

def fra_value_continuous(notional, delta, r_fixed, r1, r2, t1, t2, r_discount):


# Compute forward rate using continuous compounding
forward_rate = (r2 * t2 - r1 * t1) / (t2 - t1)
cash_flow = notional * delta * (r_fixed - forward_rate)
pv = cash_flow * np.exp(-r_discount * t2)
return pv

T
# Inputs
N = 1_000_000
delta = 0.25
rK = 0.045
r1 = 0.035
r2 = 0.036
t1 = 1
AF
t2 = 1.25
r_discount = 0.036

value = fra_value_continuous(N, delta, rK, r1, r2, t1, t2, r_discount)


print(f"FRA Value (continuous): ${value:,.0f}")
DR

43 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

1.14 FRA Valuation with Discrete Compounding

Problem

Assume that risk-free zero interest rates with quarterly compounding are as follows:

Maturity (months) Zero Rate (% per annum)


3 3.0%
6 3.2%
9 3.4%
12 3.5%
15 3.6%

T
18 3.7%

What is the value of the same FRA — paying SOFR and receiving 4.5% quarterly-
AF
compounded interest — assuming the market uses discrete compounding instead of
continuous?

(Adapted from Hull (2021), Practice Question 4.5)

Solution

Step 1: Understanding the Setup


DR

We use the same FRA structure, but calculate forward rates and discounting using quar-
terly compounding. The FRA covers the 3-month period from 12 to 15 months.
Step 2: Deriving the Discrete Forward Rate
The idea is to equate the future values of two investment strategies over the same period:

• Strategy A: Invest from t0 = 0 to t2 at the zero rate R2 .

• Strategy B: Invest from t0 = 0 to t1 at R1 , then reinvest from t1 to t2 at a forward


rate RF .

To ensure no arbitrage, both strategies must yield the same total future value. That
gives:

(1 + R1 )t1 · (1 + RF )t2 −t1 = (1 + R2 )t2

Now isolate the forward rate term:

44 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

(1 + R2 )t2
(1 + RF )t2 −t1 =
(1 + R1 )t1

Take the power 1/(t2 − t1 ) on both sides:

!1/(t2 −t1 )
(1 + R2 )t2
1 + RF =
(1 + R1 )t1

Subtract 1:

!1/(t2 −t1 )
(1 + R2 )t2
RF = −1
(1 + R1 )t1

T
Finally, since ∆ = t2 − t1 , we write:

!1/∆
(1 + R2 )t2
RF = −1
AF (1 + R1 )t1

Substitute: !4
(1 + 0.036)1.25
RF = −1
(1 + 0.035)1
1.0454 4
 
= −1
1.0350
= (1.0100)4 − 1
= 1.0406 − 1
DR

= 0.0406 = 4.06%

Step 3: Compute the Forward Rate


Substitute the values:

R1 = 3.5% = 0.035, R2 = 3.6% = 0.036, t1 = 1, t2 = 1.25, ∆ = 0.25

!1/0.25
(1 + 0.036)1.25
RF = −1
(1 + 0.035)1
1.04550 4
 
= −1
1.03500
= (1.009856)4 − 1
= 1.04 − 1
= 0.0400 = 4.00%

Step 4: Compute the FRA Value

45 © 2025 Alexandre Landi


Derivatives Practice Problems Alexandre Landi

The cash flow at maturity is:


Cash Flow = N · ∆ · (RK − RF )
= 1,000,000 · 0.25 · (0.045 − 0.040)
= 1,000,000 · 0.25 · 0.0050
= 1,247.58

Discount the cash flow using the 15-month zero rate:


1
Discount Factor =
(1 + R2 )t2
1
=
(1 + 0.036)1.25
1
=
1.04550

T
≈ 0.9566

Present Value = Cash Flow · Discount Factor


= 1,247.58 · 0.9566
AF ≈ 1,193.63

Answer

The value of the FRA under discrete compounding is approximately 1,193.63, in favor
of the holder.
DR

Python Solution

def fra_value_discrete(notional, delta, r_fixed, r1, r2, t1, t2, r_discount):


# Compute forward rate using discrete compounding
forward_rate = ((1 + r2)**t2 / (1 + r1)**t1) ** (1 / delta) - 1
cash_flow = notional * delta * (r_fixed - forward_rate)
pv = cash_flow / (1 + r_discount) ** t2
return pv

# Inputs
N = 1_000_000
delta = 0.25
rK = 0.045
r1 = 0.035
r2 = 0.036
t1 = 1
t2 = 1.25
r_discount = 0.036

value = fra_value_discrete(N, delta, rK, r1, r2, t1, t2, r_discount)


print(f"FRA Value (discrete): ${value:,.2f}")

46 © 2025 Alexandre Landi


Bibliography

Hull, J. C. (2021). Options, Futures, and Other Derivatives. Pearson, 11th global ed.
edition.

T
AF
DR

47

You might also like