Main Content

This example illustrates some of the term-structure analysis
functions found in Financial Toolbox™ software. Specifically, it
illustrates how to derive implied zero (*spot*)
and forward curves from the observed market prices of coupon-bearing
bonds. The zero and forward curves implied from the market data are
then used to price an interest rate swap agreement.

In an interest rate swap, two parties agree to a periodic exchange of cash flows. One of the cash flows is based on a fixed interest rate held constant throughout the life of the swap. The other cash flow stream is tied to some variable index rate. Pricing a swap at inception amounts to finding the fixed rate of the swap agreement. This fixed rate, appropriately scaled by the notional principal of the swap agreement, determines the periodic sequence of fixed cash flows.

In general, interest rate swaps are priced from the forward curve such that the variable cash flows implied from the series of forward rates and the periodic sequence of fixed-rate cash flows have the same current value. Thus, interest rate swap pricing and term structure analysis are intimately related.

Specify values for the settlement date, maturity dates, coupon rates, and market prices for 10 U.S. Treasury Bonds. This data allows you to price a five-year swap with net cash flow payments exchanged every six months. For simplicity, accept default values for the end-of-month payment rule (rule in effect) and day-count basis (actual/actual). To avoid issues of accrued interest, assume that all Treasury Bonds pay semiannual coupons and that settlement occurs on a coupon payment date.

Settle = datenum('15-Jan-1999'); BondData = {'15-Jul-1999' 0.06000 99.93 '15-Jan-2000' 0.06125 99.72 '15-Jul-2000' 0.06375 99.70 '15-Jan-2001' 0.06500 99.40 '15-Jul-2001' 0.06875 99.73 '15-Jan-2002' 0.07000 99.42 '15-Jul-2002' 0.07250 99.32 '15-Jan-2003' 0.07375 98.45 '15-Jul-2003' 0.07500 97.71 '15-Jan-2004' 0.08000 98.15};

`BondData `

is an instance of a MATLAB^{®}
*cell array*, indicated by the curly braces (`{}`

).

Next assign the date stored in the cell array to `Maturity`

, `CouponRate`

,
and `Prices`

vectors for further processing.

```
Maturity = datenum(char(BondData{:,1}));
CouponRate = [BondData{:,2}]';
Prices = [BondData{:,3}]';
Period = 2; % semiannual coupons
```

Now that the data has been specified, use the term structure
function `zbtprice`

to bootstrap
the zero curve implied from the prices of the coupon-bearing bonds.
This implied zero curve represents the series of zero-coupon Treasury
rates consistent with the prices of the coupon-bearing bonds such
that arbitrage opportunities will not exist.

ZeroRates = zbtprice([Maturity CouponRate], Prices, Settle)

ZeroRates = 0.0614 0.0642 0.0660 0.0684 0.0702 0.0726 0.0754 0.0795 0.0827 0.0868

The zero curve, stored in `ZeroRates`

, is quoted
on a semiannual bond basis (the periodic, six-month, interest rate
is doubled to annualize). The first element of `ZeroRates`

is
the annualized rate over the next six months, the second element is
the annualized rate over the next 12 months, and so on.

From the implied zero curve, find the corresponding series of
implied forward rates using the term structure function `zero2fwd`

.

ForwardRates = zero2fwd(ZeroRates, Maturity, Settle)

ForwardRates = 0.0614 0.0670 0.0695 0.0758 0.0774 0.0846 0.0925 0.1077 0.1089 0.1239

The forward curve, stored in `ForwardRates`

,
is also quoted on a semiannual bond basis. The first element of `ForwardRates`

is
the annualized rate applied to the interval between settlement and
six months after settlement, the second element is the annualized
rate applied to the interval from six months to 12 months after settlement,
and so on. This implied forward curve is also consistent with the
observed market prices such that arbitrage activities will be unprofitable.
Since the first forward rate is also a zero rate, the first element
of `ZeroRates`

and `ForwardRates`

are
the same.

Now that you have derived the zero curve, convert it to a sequence
of discount factors with the term structure function `zero2disc`

.

DiscountFactors = zero2disc(ZeroRates, Maturity, Settle)

DiscountFactors = 0.9704 0.9387 0.9073 0.8739 0.8416 0.8072 0.7718 0.7320 0.6945 0.6537

From the discount factors, compute the present value of the variable cash flows derived from the implied forward rates. For plain interest rate swaps, the notional principal remains constant for each payment date and cancels out of each side of the present value equation. The next line assumes unit notional principal.

PresentValue = sum((ForwardRates/Period) .* DiscountFactors)

PresentValue = 0.3460

Compute the swap's price (the fixed rate) by equating the present value of the fixed cash flows with the present value of the cash flows derived from the implied forward rates. Again, since the notional principal cancels out of each side of the equation, it is assumed to be 1.

SwapFixedRate = Period * PresentValue / sum(DiscountFactors)

SwapFixedRate = 0.0845

The output for these computations is:

Zero Rates Forward Rates 0.0614 0.0614 0.0642 0.0670 0.0660 0.0695 0.0684 0.0758 0.0702 0.0774 0.0726 0.0846 0.0754 0.0925 0.0795 0.1077 0.0827 0.1089 0.0868 0.1239 Swap Price (Fixed Rate) = 0.0845

All rates are in decimal format. The swap price, 8.45%, would likely be the mid-point between a market-maker's bid/ask quotes.

`bnddury`

| `bndconvy`

| `bndprice`

| `bndkrdur`

| `blsprice`

| `blsdelta`

| `blsgamma`

| `blsvega`

| `zbtprice`

| `zero2fwd`

| `zero2disc`

- Pricing and Analyzing Equity Derivatives
- Greek-Neutral Portfolios of European Stock Options
- Sensitivity of Bond Prices to Interest Rates
- Bond Portfolio for Hedging Duration and Convexity
- Bond Prices and Yield Curve Parallel Shifts
- Bond Prices and Yield Curve Nonparallel Shifts
- Plotting Sensitivities of an Option
- Plotting Sensitivities of a Portfolio of Options