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 . 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 = datetime(2003,2,3); MaturityCpn = datetime(2009,5,15); 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 = datetime(2003,2,5); MaturityCpn = datetime(2009,1,14); 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.