Main Content

zbtyield

Zero curve bootstrapping from coupon bond data given yield

Description

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

example

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, 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 = datetime(1997,12,18);
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');
[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 = datetime(2008,9,2);

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 = 26x1 datetime
   15-Jan-2010
   15-Apr-2010
   15-Jan-2011
   15-Apr-2011
   15-Jan-2012
   15-Apr-2012
   15-Jul-2012
   15-Apr-2013
   15-Jul-2013
   15-Jan-2014
   15-Jul-2014
   15-Jan-2015
   15-Jul-2015
   15-Jan-2016
   15-Jul-2016
   15-Jan-2017
   15-Jul-2017
   15-Jan-2018
   15-Jul-2018
   15-Jan-2025
   15-Jan-2026
   15-Jan-2027
   15-Jan-2028
   15-Apr-2028
   15-Apr-2029
   15-Apr-2032

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, specified as a datetime, string, or date character vector.

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

    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

    • For more information, see Basis.

  • 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

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 a 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, zbtyield also accepts serial date numbers as inputs, but they are not recommended.

Data Types: string | 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 Maturitydate in the Bonds table or matrix.

If either inputs for Bonds or Settle have datetime values, then CurveDatesCurveDates is datetimes. Otherwise CurveDates is serial date numbers. Use the function datetime 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