Main Content

bndkrdur

Bond key rate duration given zero curve

Description

KeyRateDuration = bndkrdur(ZeroData,CouponRate,Settle,Maturity) computes the key rate durations for one or more bonds given a zero curve and a set of key rates.

example

KeyRateDuration = bndkrdur(___,Name,Value) adds optional name-value pair arguments.

example

Examples

collapse all

This example shows how to compute the key rate duration of a bond for key rate times of 2, 5, 10, and 30 years.

ZeroRates = [0.0476 .0466 .0465 .0468 .0473 .0478 ...
.0493 .0539 .0572 .0553 .0530]';

ZeroDates = daysadd('31-Dec-1998',[30 360 360*2 360*3 360*5 ...
360*7 360*10 360*15 360*20 360*25 360*30],1);

ZeroData = [ZeroDates ZeroRates];

krdur = bndkrdur(ZeroData,.0525,'12/31/1998',...
'11/15/2028','KeyRates',[2 5 10 30])
krdur = 1×4

    0.2986    0.8791    4.1353    9.5814

This example shows how to use datetime inputs for Settle and Maturity and also use a table for ZeroData to compute the key rate duration of a bond for key rate times of 2, 5, 10, and 30 years.

ZeroRates = [0.0476 .0466 .0465 .0468 .0473 .0478 ...
.0493 .0539 .0572 .0553 .0530]';

ZeroDates = daysadd('31-Dec-1998',[30 360 360*2 360*3 360*5 ...
360*7 360*10 360*15 360*20 360*25 360*30],1);

ZeroData = table(datetime(ZeroDates,'ConvertFrom','datenum','Locale','en_US'), ZeroRates);

krdur = bndkrdur(ZeroData,.0525,datetime('12/31/1998','Locale','en_US'),...
datetime('11/15/2028','Locale','en_US'),'KeyRates',[2 5 10 30])
krdur = 1×4

    0.2986    0.8791    4.1353    9.5814

Input Arguments

collapse all

Zero Curve, specified as a numRates-by-2 matrix or a numRates-by-2 table.

If ZeroData is represented as a numRates-by-2 matrix, the first column is a MATLAB® serial date number and the second column is the accompanying zero rates.

If ZeroData is a table, the first column can be a datetime array, string array, or date character vectors. The second column must be numeric data corresponding to the zero rates.

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

Annual percentage rate used to determine the coupons payable on a bond, specified as decimal value using a scalar or a NUMBONDS-by-1 vector.

Data Types: double

Settlement date for all bonds and zero curve, specified as a scalar datetime, string, or date character vector. Settle must be the same settlement date for all the bonds and the zero curve.

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

Data Types: char | string | datetime

Maturity date for bonds, specified as a scalar or a NUMBONDS-by-1 vector using a datetime array, string array, or date character vectors.

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

Data Types: char | string | datetime

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: KeyRateDuration = bndkrdur(ZeroData,.0525,'12/31/1998','11/15/2028','KeyRates',[2 5 10 30])

Interpolation method used to obtain points from the zero curve, specified as the comma-separated pair consisting of 'InterpMethod' and a character vector using one of the following values:

  • 'linear' (default)

  • 'cubic'

  • 'pchip'

Data Types: char

Value that zero curve is shifted up and down to compute duration, specified as the comma-separated pair consisting of 'ShiftValue' and a scalar numeric value.

Data Types: double

Rates to perform the duration calculation, specified as the comma-separated pair consisting of 'KeyRates' and a time to maturity using a scalar or a NUMBONDS-by-1 vector.

Data Types: double

Compounding frequency of the curve, specified as the comma-separated pair consisting of 'CurveCompounding' and a scalar using one of the following values:

  • 1 — Annual compounding

  • 2 — Semiannual compounding

  • 3 — Compounding three times per year

  • 4 — Quarterly compounding

  • 6 — Bimonthly compounding

  • 12 — Monthly compounding

.

Data Types: double

Basis of the curve, specified as the comma-separated pair consisting of 'CurveBasis' and a scalar using one of the following values:

  • 0 = actual/actual

  • 1 = 30/360 (SIA)

  • 2 = actual/360

  • 3 = actual/365

  • 4 = 30/360 (PSA)

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

Data Types: double

Number of coupon payments per year, specified as the comma-separated pair consisting of 'Period' and a scalar or a NUMBONDS-by-1 vector using the values: 0, 1, 2, 3, 4, 6, or 12.

Data Types: double

Day-count of the instrument, specified as the comma-separated pair consisting of 'Basis' and a scalar or a NUMBONDS-by-1 vector using a supported value:

  • 0 = actual/actual

  • 1 = 30/360 (SIA)

  • 2 = actual/360

  • 3 = actual/365

  • 4 = 30/360 (PSA)

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

Data Types: double

End-of-month rule flag, specified as the comma-separated pair consisting of 'EndMonthRule' and a scalar or a NUMBONDS-by-1 vector. 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 coupon payment date is always the same numerical day of the month.

  • 1 = Set rule on, meaning that a bond coupon payment date is always the last actual day of the month.

Data Types: logical

Bond Issue date, specified as the comma-separated pair consisting of 'IssueDate' and a scalar or a NUMBONDS-by-1 vector using a datetime array, string array, or date character vectors.

If you do not specify an IssueDate, the cash flow payment dates are determined from other inputs.

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

Data Types: char | string | datetime

Irregular or normal first coupon date, specified as the comma-separated pair consisting of 'FirstCouponDate' and a scalar or a NUMBONDS-by-1 vector using a datetime array, string array, or date character vectors.

If you do not specify a FirstCouponDate, the cash flow payment dates are determined from other inputs.

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

Data Types: char | string | datetime

Irregular or normal last coupon date, specified as the comma-separated pair consisting of 'LastCouponDate' and a scalar or a NUMBONDS-by-1 vector using a datetime array, string array, or date character vectors.

If you do not specify a LastCouponDate, the cash flow payment dates are determined from other inputs.

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

Data Types: char | string | datetime

Forward starting date of payments, specified as the comma-separated pair consisting of 'StartDate' and a scalar or a NUMBONDS-by-1 vector using a datetime array, string array, or date character vectors. The StartDate is when a bond actually starts (the date from which a bond cash flow is considered). To make an instrument forward-starting, specify this date as a future date.

If you do not specify a StartDate, the effective start date is the Settle date.

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

Data Types: char | string | datetime

Face value of the bond, specified as the comma-separated pair consisting of 'Face' and a scalar or a NUMBONDS-by-1 vector.

Data Types: double

Output Arguments

collapse all

Key rate durations, returned as a numBonds-by-numRates matrix.

Algorithms

bndkrdur computes the key rate durations for one or more bonds given a zero curve and a set of key rates. By default, the key rates are each of the zero curve rates. For each key rate, the duration is computed by shifting the zero curve up and down by a specified amount (ShiftValue) at that particular key rate, computing the present value of the bond in each case with the new zero curves, and then evaluating the following:

krduri = (PVdown - PVup)(PV × ShiftValue × 2)

Note

The shift to the curve is computed by shifting the particular key rate by the ShiftValue and then interpolating the values of the curve in the interval between the previous and next key rates. For the first key rate, any curve values before the date are equal to the ShiftValue; likewise, for the last key rate, any curve values after the date are equal to the ShiftValue.

References

[1] Golub, B., Tilman, L. Risk Management: Approaches for Fixed Income Markets. Wiley, 2000.

[2] Tuckman, B. Fixed Income Securities: Tools for Today's Markets. Wiley, 2002.

Version History

Introduced before R2006a

expand all