Using Zero-Coupon Bonds

Introduction

A zero-coupon bond is a corporate, Treasury, or municipal debt instrument that pays no periodic interest. Typically, the bond is redeemed at maturity for its full face value. It is a security issued at a discount from its face value, or it may be a coupon bond stripped of its coupons and repackaged as a zero-coupon bond.

Financial Instruments Toolbox™ software provides functions for valuing zero-coupon debt instruments. These functions supplement existing coupon bond functions such as bndprice and bndyield that are available in Financial Toolbox™ software.

Measuring Zero-Coupon Bond Function Quality

Zero-coupon function quality is measured by how consistent the results are with coupon-bearing bonds. Because the zero coupon's yield is bond-equivalent, comparisons with coupon-bearing bonds are possible.

In the textbook case, where time (t) is measured continuously and the rate (r) is continuously compounded, the value of a zero bond is the principal multiplied by ert. In reality, the rate quoted is continuous and the basis can be variable, requiring a more consistent approach to meet the stricter demands of accurate pricing.

The following two examples

show how the zero functions are consistent with supported coupon bond functions.

Pricing Treasury Notes

A Treasury note can be considered to be a package of zeros. The toolbox functions that price zeros require a coupon bond equivalent yield. That yield can originate from any type of coupon paying bond, with any periodic payment, or any accrual basis. The next example shows the use of the toolbox to price a Treasury note and compares the calculated price with the actual price quotation for that day.

Settle = datenum('02-03-2003');
MaturityCpn = datenum('05-15-2009');
Period = 2;
Basis = 0;

% Quoted yield.
QYield = 0.03342;

% Quoted price.
QPriceACT = 112.127;

CouponRate = 0.055;

Extract the cash flow and compute price from the sum of zeros discounted.

[CFlows, CDates] = cfamounts(CouponRate, Settle, MaturityCpn, ... 
Period, Basis);
MaturityofZeros = CDates;

Compute the price of the coupon bond identically as a collection of zeros by multiplying the discount factors to the corresponding cash flows.

PriceofZeros = CFlows * zeroprice(QYield, Settle, ... 
MaturityofZeros, Period, Basis)/100;

The following table shows the intermediate calculations.

Cash Flows

Discount Factors

Discounted Cash Flows

-1.2155

1.0000

-1.2155

2.7500

0.9908

2.7246

2.7500

0.9745

2.6799

2.7500

0.9585

2.6359

2.7500

0.9427

2.5925

2.7500

0.9272

2.5499

2.7500

0.9120

2.5080

2.7500

0.8970

2.4668

2.7500

0.8823

2.4263

2.7500

0.8678

2.3864

2.7500

0.8535

2.3472

2.7500

0.8395

2.3086

2.7500

0.8257

2.2706

102.7500

0.8121

83.4451

 

                                       Total

112.1263

Compare the quoted price and the calculated price based on zeros.

[QPriceACT PriceofZeros]
ans =

112.1270   112.1263

This example shows that zeroprice can satisfactorily price a Treasury note, a semiannual actual/actual basis bond, as if it were a composed of a series of zero-coupon bonds.

Pricing Corporate Bonds

You can similarly price a corporate bond, for which there is no corresponding zero-coupon bond, as opposed to a Treasury note, for which corresponding zeros exist. You can create a synthetic zero-coupon bond and arrive at the quoted coupon-bond price when you later sum the zeros.

Settle = datenum('02-05-2003');
MaturityCpn = datenum('01-14-2009');
Period = 2;
Basis = 1;
% Quoted yield.
QYield = 0.05974;
% Quoted price.
QPrice30 = 99.382;
CouponRate = 0.05850;

Extract cash flow and compute price from the sum of zeros.

[CFlows, CDates] = cfamounts(CouponRate, Settle, MaturityCpn, ... 
Period, Basis);

Maturity = CDates;

Compute the price of the coupon bond identically as a collection of zeros by multiplying the discount factors to the corresponding cash flows.

Price30 = CFlows * zeroprice(QYield, Settle, Maturity, Period, ... 
Basis)/100;

Compare quoted price and calculated price based on zeros.

[QPrice30 Price30]
ans =

99.3820   99.3828

As a test of fidelity, intentionally giving the wrong basis, say actual/actual (Basis = 0) instead of 30/360, gives a price of 99.3972. Such a systematic error, if recurring in a more complex pricing routine, quickly adds up to large inaccuracies.

In summary, the zero functions in MATLAB® software facilitate extraction of present value from virtually any fixed-coupon instrument, up to any period in time.

See Also

|

Related Examples

More About