# zbtprice

Zero curve bootstrapping from coupon bond data given price

## Syntax

``[ZeroRates,CurveDates] = zbtprice(Bonds,Prices,Settle)``
``ZeroRates,CurveDates = zbtprice(___,OutputCompounding)``

## Description

example

````[ZeroRates,CurveDates] = zbtprice(Bonds,Prices,Settle)` 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; 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 = zbtprice(___,OutputCompounding)` adds an optional argument for `OutputCompounding`.```

## Examples

collapse all

Given data and prices for 12 coupon bonds, two with the same maturity date, and given the common settlement date, use `datetime` inputs to compute a zero curve.

```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 = datetime(1997,12,18); OutputCompounding = 2; t=array2table(Bonds); t.Bonds1 = datetime(t.Bonds1,'ConvertFrom','datenum','Locale','en_US'); [ZeroRates, CurveDates] = zbtprice(t, Prices, Settle, OutputCompounding)```
```ZeroRates = 11×1 0.0616 0.0609 0.0658 0.0590 0.0647 0.0655 0.0606 0.0601 0.0642 0.0621 ⋮ ```
```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 ```

## 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 a datetime array, string array, or date character vectors.

• `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 a datetime array, string array, or date character vectors.

• 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` | `char` | `string` | `datetime` | `table`

Clean price (price without accrued interest) 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`.

Data Types: `double`

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

To support existing code, `zbtprice` also accepts serial date numbers as inputs, but they are not recommended.

Data Types: `char` | `string` | `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 of unique maturity dates. In aggregate, the rates in `ZeroRates` constitute a zero curve.

If more than one bond has the same `Maturity` date, `zbtprice` 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` is datetimes. Otherwise `CurveDates` is serial date numbers. Use the function `datestr` to convert serial date numbers to formatted date character vectors.

## References

[1] 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.

[2] McEnally, Richard W. and James V. Jordan. “The Term Structure of Interest Rates.” in Ch. 37 in Fabozzi and Fabozzi, ibid

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

## Version History

Introduced before R2006a

expand all