Financial Toolbox | ![]() ![]() |
Zero curve bootstrapping from coupon bond data given price
Syntax
[ZeroRates, CurveDates] = zbtprice(Bonds, Prices, Settle, OutputCompounding, OutputBasis, MaxIterations)
Arguments
Bonds |
Coupon bond information used to generate the zero curve. An n-by-2 to n-by-6 matrix where each row describes a bond. The first two columns are required; the rest are optional but must be added in order. All rows in Bonds must have the same number of columns. Columns are [Maturity CouponRate Face Period Basis where | ||
|
Maturity | Maturity date of the bond, as a serial date number. Use datenum to convert date strings to serial date numbers. |
|
|
CouponRate | Coupon rate of the bond, as a decimal fraction. |
|
|
Face | (Optional) Redemption or face value of the bond. Default = 100. |
|
|
Period | (Optional) Coupons per year of the bond, as an integer. Allowed values are 0, 1, 2, 3, 4, 6, and 12. Default = 2. |
|
|
Basis | (Optional) Day-count basis of the bond: 0 = actual/actual (default), 1 = 30/360, 2 = actual/360, 3 = actual/365. |
|
|
EndMonthRule | (Optional) End-of-month flag. This flag applies only when Maturity is an end-of-month date for a month having 30 or fewer days. 0 = ignore flag, meaning that a bond's coupon payment date is always the same day of the month. 1 = set flag (default), meaning that a bond's coupon payment date is always the last day of the month. |
|
Prices |
A column vector containing the clean price (price without accrued interest) of each bond in Bonds , respectively. The number of rows (n) must match the number of rows in Bonds . | ||
Settle |
Settlement date, as a scalar serial date number. This represents time zero for deriving the zero curve, and it is normally the common settlement date for all the bonds. | ||
OutputCompounding |
(Optional) A scalar that sets the compounding frequency per year for the output zero rates in ZeroRates . Allowed values are: | ||
1 |
annual compounding | ||
2 |
semi-annual compounding (default) | ||
3 |
compounding three times per year | ||
4 |
quarterly compounding | ||
6 |
bimonthly compounding | ||
12 |
monthly compounding | ||
OutputBasis |
(Optional) Output day-count basis for mapping cash-flow dates to years, in generating the output zero rates in ZeroRates . A scalar. 0 = actual/actual (default), 1 = 30/360, 2 = actual/360, 3 = actual/365. | ||
MaxIterations |
(Optional) Maximum number of iterations for deriving the zero rates in ZeroRates . A scalar. Default = 50. A value greater than 50 may slow processing. |
Description
[ZeroRates, CurveDates] = zbtprice(Bonds, Prices, Settle,
OutputCompounding, OutputBasis, MaxIterations)
uses the bootstrap method to return a zero curve given a portfolio of coupon bonds and their prices. A zero curve consists of the yields to maturity for a portfolio of theoretical zero-coupon bonds that are derived from the input Bonds
portfolio. The bootstrap method that this function uses does not require alignment among the cash-flow dates of the bonds in the input portfolio. It uses theoretical par bond arbitrage and yield interpolation to derive all zero rates. For best results, use a portfolio of at least 30 bonds evenly spaced across the investment horizon.
Examples
Given data and prices for 12 coupon bonds, two with the same maturity date; and given the common settlement date
Bonds = [datenum('6/1/1998') 0.0475 100 2 0 0; datenum('7/1/2000') 0.06 100 2 0 0; datenum('7/1/2000') 0.09375 100 6 1 0; datenum('6/30/2001') 0.05125 100 1 3 1; datenum('4/15/2002') 0.07125 100 4 1 0; datenum('1/15/2000') 0.065 100 2 0 0; datenum('9/1/1999') 0.08 100 3 3 0; datenum('4/30/2001') 0.05875 100 2 0 0; datenum('11/15/1999') 0.07125 100 2 0 0; datenum('6/30/2000') 0.07 100 2 3 1; datenum('7/1/2001') 0.0525 100 2 3 0; datenum('4/30/2002') 0.07 100 2 0 0]; Prices = [99.375; 99.875; 105.75 ; 96.875; 103.625; 101.125; 103.125; 99.375; 101.0 ; 101.25 ; 96.375; 102.75 ]; Settle = datenum('12/18/1997');
Set semi-annual compounding for the zero curve, on an actual/365 basis. Derive the zero curve within 50 iterations.
[ZeroRates, CurveDates] = zbtprice(Bonds, Prices, Settle,... OutputCompounding, OutputBasis, MaxIterations)
which returns the zero curve at the maturity dates. Note the mean zero rate for the two bonds with the same maturity date*.
ZeroRates = 0.0616 0.0609 0.0658 0.0590 0.0648 0.0655* 0.0606 0.0601 0.0642 0.0621 0.0627 CurveDates = 729907 (serial date number for 01-Jun-1998) 730364 (01-Sep-1999) 730439 (15-Nov-1999) 730500 (15-Jan-2000) 730667 (30-Jun-2000) 730668 (01-Jul-2000)* 730971 (30-Apr-2001) 731032 (30-Jun-2001) 731033 (01-Jul-2001) 731321 (15-Apr-2002) 731336 (30-Apr-2002)
See Also
zbtyield
and other functions for Term Structure of Interest Rates
References
Fabozzi, Frank J. "The Structure of Interest Rates." Ch. 6 in Fabozzi, Frank J. and T. Dessa Fabozzi, eds. The Handbook of Fixed Income Securities. 4th ed. New York: Irwin Professional Publishing. 1995.
McEnally, Richard W. and James V. Jordan. "The Term Structure of Interest Rates." Ch. 37 in Fabozzi and Fabozzi, ibid.
Das, Satyajit. "Calculating Zero Coupon Rates." Swap and Derivative Financing. Appendix to Ch. 8, pp. 219-225. New York: Irwin Professional Publishing. 1994.
![]() | yldtbill | zbtyield | ![]() |