# zbtyield

Zero curve bootstrapping from coupon bond data given yield

## Syntax

``[ZeroRates,CurveDates] = zbtyield(Bonds,YieldsSettle)``
``ZeroRates,CurveDates = zbtyield(___,OutputCompounding)``

## Description

example

````[ZeroRates,CurveDates] = zbtyield(Bonds,YieldsSettle)` uses the bootstrap method to return a zero curve given a portfolio of coupon bonds and their yields. 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; specifically, the interest rates for cash flows are determined using linear interpolation. For best results, use a portfolio of at least 30 bonds evenly spaced across the investment horizon.```

example

````ZeroRates,CurveDates = zbtyield(___,OutputCompounding)` adds an optional argument for `OutputCompounding`.```

## Examples

collapse all

Given data and yields to maturity 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]; Yields = [0.0616 0.0605 0.0687 0.0612 0.0615 0.0591 0.0603 0.0608 0.0655 0.0646 0.0641 0.0627]; Settle = datenum('12/18/1997');```

Set semiannual compounding for the zero curve.

`OutputCompounding = 2;`

Execute the function `zbtyield` which returns the zero curve at the maturity dates. Note the mean zero rate for the two bonds with the same maturity date.

```[ZeroRates, CurveDates] = zbtyield(Bonds, Yields, Settle,... OutputCompounding)```
```ZeroRates = 11×1 0.0616 0.0603 0.0657 0.0590 0.0649 0.0650 0.0606 0.0611 0.0643 0.0614 ⋮ ```
```CurveDates = 11×1 729907 730364 730439 730500 730667 730668 730971 731032 731033 731321 ⋮ ```

Given data and yields to maturity for 12 coupon bonds (two with the same maturity date), and given the common settlement date, compute the zero curve using `datetime` inputs.

```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]; Yields = [0.0616 0.0605 0.0687 0.0612 0.0615 0.0591 0.0603 0.0608 0.0655 0.0646 0.0641 0.0627]; Settle = datenum('12/18/1997'); OutputCompounding = 2; t = array2table(Bonds,'VariableNames',{'Maturity','CouponRate', 'Face' ,'Period', 'Basis', 'EndMonthRule'}); disp(t)```
``` Maturity CouponRate Face Period Basis EndMonthRule __________ __________ ____ ______ _____ ____________ 7.2991e+05 0.0475 100 2 0 0 7.3067e+05 0.06 100 2 0 0 7.3067e+05 0.09375 100 6 1 0 7.3103e+05 0.05125 100 1 3 1 7.3132e+05 0.07125 100 4 1 0 7.305e+05 0.065 100 2 0 0 7.3036e+05 0.08 100 3 3 0 7.3097e+05 0.05875 100 2 0 0 7.3044e+05 0.07125 100 2 0 0 7.3067e+05 0.07 100 2 3 1 7.3103e+05 0.0525 100 2 3 0 7.3134e+05 0.07 100 2 0 0 ```
```t.Maturity = datetime(t.Maturity,'ConvertFrom','datenum','Locale','en_US'); Settle = datetime(Settle,'ConvertFrom','datenum','Locale','en_US'); [ZeroRates, CurveDates] = zbtyield(t, Yields, Settle,... OutputCompounding)```
```ZeroRates = 11×1 0.0616 0.0603 0.0657 0.0590 0.0649 0.0650 0.0606 0.0611 0.0643 0.0614 ⋮ ```
```CurveDates = 11x1 datetime 01-Jun-1998 01-Sep-1999 15-Nov-1999 15-Jan-2000 30-Jun-2000 01-Jul-2000 30-Apr-2001 30-Jun-2001 01-Jul-2001 15-Apr-2002 30-Apr-2002 ```

Use `zbtyield` to compute the real zero rates from the real yields of inflation-linked bonds.

```% Load the data load usbond_02Sep2008 Settle = datenum('02-Sep-2008');```

Compute the real yields and then compute the real zero rates.

```RealYields = bndyield(TIPSPrice,TIPSCoupon,Settle,TIPSMaturity); TIPSBonds = [TIPSMaturity TIPSCoupon]; [RealZeroRates, CurveDates] = zbtyield(TIPSBonds, RealYields, Settle)```
```RealZeroRates = 26×1 0.0069 0.0094 0.0092 0.0111 0.0110 0.0119 0.0116 0.0128 0.0126 0.0136 ⋮ ```
```CurveDates = 26×1 734153 734243 734518 734608 734883 734974 735065 735339 735430 735614 ⋮ ```

## Input Arguments

collapse all

Coupon bond information to generate zero curve, specified as a 6-column table or a `n`-by-`2` to `n`-by-`6` matrix of bond information, where the table columns or matrix columns contains:

• `Maturity` (Column 1, Required) Maturity date of the bond, as a serial date number. Use `datenum` to convert date character vectors to serial date numbers. If the input `Bonds` is a table, the `Maturity` dates can be serial date numbers, date character vectors, or datetime arrays.

• `CouponRate` (Column 2, Required) Decimal fraction indicating the coupon rate of the bond.

• `Face` (Column 3, Optional) Redemption or face value of the bond. Default = `100`.

• `Period` (Column 4, Optional) Coupons per year of the bond. Allowed values are `0`, `1`, `2` (default), `3`, `4`, `6`, and `12`.

• `Basis` (Column 5, Optional) Day-count basis of the bond. A vector of integers.

• 0 = actual/actual (default)

• 1 = 30/360 (SIA)

• 2 = actual/360

• 3 = actual/365

• 4 = 30/360 (BMA)

• 5 = 30/360 (ISDA)

• 6 = 30/360 (European)

• 7 = actual/365 (Japanese)

• 8 = actual/actual (ICMA)

• 9 = actual/360 (ICMA)

• 10 = actual/365 (ICMA)

• 11 = 30/360E (ICMA)

• 12 = actual/365 (ISDA)

• 13 = BUS/252

• `EndMonthRule` (Column 6, Optional) End-of-month rule. This rule applies only when `Maturity` is an end-of-month date for a month having 30 or fewer days. `0` = ignore rule, meaning that a bond's coupon payment date is always the same numerical day of the month. `1` = set rule on (default), meaning that a bond's coupon payment date is always the last actual day of the month

:

Note

• If `Bonds` is a table, the `Maturity` dates can be serial date numbers, date character vectors, or datetime arrays.

• If `Bonds` is a matrix, is an `n`-by-`2` to `n`-by-`6` matrix where each row describes a bond, the first two columns (`Maturity` and `CouponRate`) are required. The remainder of the columns are optional but must be added in order. All rows in `Bonds` must have the same number of columns.

.

Data Types: `double` | `table`

Yield to maturity of each bond in `Bonds`, specified as a `N`-by-`1` column vector. The number of rows (n) must match the number of rows in `Bonds`.

Note

Yield to maturity must be compounded semiannually.

Data Types: `double`

Settlement date representing time zero in derivation of zero curve, specified as serial date number, date character vector, or datetime array. `Settle` represents time zero for deriving the zero curve, and it is normally the common settlement date for all the bonds.

Data Types: `double` | `char` | `datetime`

(Optional) Compounding frequency of output `ZeroRates`, specified using the allowed values:

• `0` — Simple interest (no compounding)

• `1` — Annual compounding

• `2` — Semiannual compounding (default)

• `3` — Compounding three times per year

• `4` — Quarterly compounding

• `6` — Bimonthly compounding

• `12` — Monthly compounding

• `-1` — Continuous compounding

Data Types: `double`

## Output Arguments

collapse all

Implied zero rates for each point along the investment horizon defined by a maturity date, returned as a `m`-by-`1` vector of decimal fractions where `m` is the number of bonds with unique maturity dates. In aggregate, the rates in `ZeroRates` constitute a zero curve.

If more than one bond has the same `Maturity` date, `zbtyield` returns the mean zero rate for that `Maturity`. Any rates before the first `Maturity` are assumed to be equal to the rate at the first `Maturity`, that is, the curve is assumed to be flat before the first `Maturity`.

Maturity dates that correspond to the `ZeroRates`, returned as a `m`-by-`1` vector of unique maturity dates, where `m` is the number of bonds of different maturity dates. These dates begin with the earliest `Maturity` date and end with the latest `Maturity`date in the `Bonds` table or matrix.

If either inputs for `Bonds` or `Settle` have datetime values, then `CurveDates``CurveDates` is datetimes. Otherwise `CurveDates` is serial date numbers.

 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.” in Ch. 37 in Fabozzi and Fabozzi, ibid

 Das, Satyajit. “Calculating Zero Coupon Rates.” in Swap and Derivative Financing. Appendix to Ch. 8, pp. 219–225. New York, Irwin Professional Publishing, 1994.