Main Content

prbyzero

Price bonds in portfolio by set of zero curves

Description

BondPrices = prbyzero(Bonds,Settle,ZeroRates,ZeroDates) computes the bond prices in a portfolio using a set of zero curves.

example

BondPrices = prbyzero(___,Compounding) adds an optional argument for Compounding.

example

Examples

collapse all

This example uses the function zbtprice to compute a zero curve given a portfolio of coupon bonds and their prices. It then reverses the process, using the zero curve as input to the function prbyzero to compute the prices.

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 semiannual compounding for the zero curve, on an actual/365 basis.

OutputCompounding = 2;

Execute the function zbtprice which returns the zero curve at the maturity dates.

[ZeroRates, ZeroDates] = zbtprice(Bonds, 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
      ⋮

ZeroDates = 11×1

      729907
      730364
      730439
      730500
      730667
      730668
      730971
      731032
      731033
      731321
      ⋮

Execute the function prbyzero.

BondPrices = prbyzero(Bonds, Settle, ZeroRates, ZeroDates)
BondPrices = 12×1

   99.3750
   98.7980
  106.8270
   96.8750
  103.6249
  101.1250
  103.1250
   99.3637
  101.0000
  101.2500
      ⋮

In this example zbtprice and prbyzero do not exactly reverse each other. Many of the bonds have the end-of-month rule off (EndMonthRule = 0). The rule subtly affects the time factor computation. If you set the rule on (EndMonthRule = 1) everywhere in the Bonds matrix, then prbyzero returns the original prices, except when the two incompatible prices fall on the same maturity date.

This example uses the function zbtprice to compute a zero curve given a portfolio of coupon bonds and their prices. It then reverses the process, using the zero curve as input to the function prbyzero with datetime inputs to compute the prices.

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');
OutputCompounding = 2;

[ZeroRates, ZeroDates] = zbtprice(Bonds, Prices, Settle, OutputCompounding);

dates = datetime(Bonds(:,1),'ConvertFrom','datenum','Locale','en_US');
data = Bonds(:,2:end);
t=[table(dates) array2table(data)];
BondPrices = prbyzero(t, datetime(Settle,'ConvertFrom','datenum','Locale','en_US'),...
ZeroRates, datetime(ZeroDates,'ConvertFrom','datenum','Locale','en_US'))
BondPrices = 12×1

   99.3750
   98.7980
  106.8270
   96.8750
  103.6249
  101.1250
  103.1250
   99.3637
  101.0000
  101.2500
      ⋮

Input Arguments

collapse all

Coupon bond information to compute prices, specified as a 6-column table or a NumBonds-by-6 matrix of bond information where the table columns or matrix columns contains:

  • Maturity (Required) Maturity date of the bond, specified as a datetime, string array, or date character vector.

    To support existing code, prbyzero 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 (Required) Decimal number indicating the annual percentage rate used to determine the coupons payable on a bond.

  • Face (Optional) Face or par value of the bond. Default = 100.

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

  • Basis (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 (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 table columns have the same meaning as when a matrix is used, but the Maturity dates can be a datetime array, string array, or date character vectors.

  • If Bonds is a matrix, it is a NUMBONDS-by-6 matrix of bonds where each row describes one bond. The first two columns are required; the remaining columns are optional but must be added in order. All rows in Bonds must have the same number of columns. The columns are Maturity, CouponRate, Face, Period, Basis, and EndMonthRule.

.

Data Types: double | char | string | datetime | table

Settlement date, specified as a scalar datetime, string, or date character vector.

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

Data Types: datetime | string | char

Observed zero rates, specified as NUMDATES-by-NUMCURVES matrix of decimal fractions. Each column represents a rate curve. Each row represents an observation date.

Data Types: double

Observed dates for ZeroRates, specified as a NUMDATES-by-1 column vector using a datetime array, string array, or date character vectors.

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

Data Types: datetime | string | char

(Optional) Compounding frequency of input ZeroRates when annualized, specified using the allowed values:

  • 1 — Annual compounding

  • 2 — Semiannual compounding (default)

  • 3 — Compounding three times per year

  • 4 — Quarterly compounding

  • 6 — Bimonthly compounding

  • 12 — Monthly compounding

Data Types: double

Output Arguments

collapse all

Clean bond prices, returned as a NUMBONDS-by-NUMCURVES matrix. Each column is derived from the corresponding zero curve in ZeroRates.

In addition, you can use the Financial Instruments Toolbox™ method getZeroRates (Financial Instruments Toolbox) for an IRDataCurve object with a Dates property to create a vector of dates and data acceptable for prbyzero. For more information, see Converting an IRDataCurve or IRFunctionCurve Object (Financial Instruments Toolbox).

Version History

Introduced before R2006a

expand all