Determine option adjusted spread using Black-Derman-Toy model
[
calculates option adjusted spread using a Black-Derman-Toy model.OAS
,OAD
,OAC
]
= oasbybdt(BDTTree
,Price
,CouponRate
,Settle
,Maturity
,OptSpec
,Strike
,ExerciseDates
)
oasbybdt
computes prices of vanilla bonds with embedded
options, stepped coupon bonds with embedded options, amortizing bonds with
embedded options, and sinking fund bonds with call embedded option. For more
information, see More About.
[
adds optional name-value pair arguments.OAS
,OAD
,OAC
]
= oasbybdt(___,Name,Value
)
This example shows how to compute OAS using the Black-Derman-Toy (BDT) model with the following data.
ValuationDate = 'Oct-1-2010'; Rates = [0.035; 0.042; 0.047; 0.052]; StartDates = ValuationDate; EndDates = datemnth(ValuationDate, 12:12:48)'; Compounding = 1; % define RateSpec RateSpec = intenvset('ValuationDate', ValuationDate,... 'StartDates', StartDates, 'EndDates', EndDates, ... 'Rates', Rates, 'Compounding', Compounding); % specify VolSpec and TimeSpec Sigma = 0.20; VS = bdtvolspec(ValuationDate, EndDates, Sigma*ones(size(EndDates))); TS = bdttimespec(ValuationDate, EndDates, Compounding); % build the BDT tree BDTTree = bdttree(VS, RateSpec, TS); BDTTreenew = cvtree(BDTTree); % instrument information CouponRate = 0.065; Settle = ValuationDate; Maturity = '01-Oct-2014'; OptSpec = 'call'; Strike = 100; ExerciseDates ='01-Oct-2011'; Period = 1; Price = 101.58; % compute the OAS OAS = oasbybdt(BDTTree, Price, CouponRate, Settle, Maturity,... OptSpec, Strike, ExerciseDates, 'Period', Period)
OAS = 32.7688
This example shows how to compte the OAS for an amortizing callable bond using a BDT lattice model.
Create a RateSpec
.
Rates = [0.025;0.028;0.030;0.031]; ValuationDate = 'Jan-1-2018'; StartDates = ValuationDate; EndDates = {'Jan-1-2019'; 'Jan-1-2020'; 'Jan-1-2021'; 'Jan-1-2022'}; Compounding = 1; RateSpec = intenvset('ValuationDate', ValuationDate, 'StartDates',... StartDates, 'EndDates', EndDates, 'Rates', Rates, 'Compounding', Compounding);
Build a BDT tree and assume a volatility of 5%.
Sigma = 0.05; BDTTimeSpec = bdttimespec(ValuationDate, EndDates); BDTVolSpec = bdtvolspec(ValuationDate, EndDates, Sigma*ones(1, length(EndDates))'); BDTT = bdttree(BDTVolSpec, RateSpec, BDTTimeSpec);
Define the callable bond.
CouponRate = 0.05; Settle = 'Jan-1-2018'; Maturity = 'Jan-1-2021'; Period = 1; Face = { {'Jan-1-2019' 100; 'Jan-1-2020' 70; ... 'Jan-1-2021' 50}; }; OptSpec = 'call'; Strike = [97 95 93]; ExerciseDates ={'Jan-1-2019' 'Jan-1-2020' 'Jan-1-2021'};
Compute the OAS for a callable amortizing bond using the BDT tree.
Price = 99; BondType = 'amortizing'; OAS = oasbybdt(BDTT, Price, CouponRate, Settle, Maturity,... OptSpec, Strike, ExerciseDates, 'Period', Period, 'Face', Face,'BondType', BondType)
OAS = 53.0303
BDTTree
— Interest-rate tree structureInterest-rate tree structure, specified by using bdttree
.
Data Types: struct
Price
— Market prices of bonds with embedded optionsMarket prices of bonds with embedded options, specified as an NINST
-by-1
vector.
Data Types: double
CouponRate
— Bond coupon rate Bond coupon rate, specified as an NINST
-by-1
decimal
annual rate.
Data Types: double
Settle
— Settlement dateSettlement date for the bond option, specified as a NINST
-by-1
vector
of serial date numbers or date character vectors.
Note
The Settle
date for every bond with an embedded
option is set to the ValuationDate
of the BDT tree.
The bond argument Settle
is ignored.
Data Types: double
| char
Maturity
— Maturity dateMaturity date, specified as an NINST
-by-1
vector
of serial date numbers or date character vectors.
Data Types: double
| char
OptSpec
— Definition of option 'call'
or 'put'
| cell array of character vectors with values 'call'
or 'put'
Definition of option, specified as a NINST
-by-1
cell
array of character vectors.
Data Types: char
| cell
Strike
— Option strike price valuesOption strike price value, specified as a NINST
-by-1
or NINST
-by-NSTRIKES
depending
on the type of option:
European option — NINST
-by-1
vector
of strike price values.
Bermuda option — NINST
by
number of strikes (NSTRIKES
) matrix of strike price
values. Each row is the schedule for one option. If an option has
fewer than NSTRIKES
exercise opportunities, the
end of the row is padded with NaN
s.
American option — NINST
-by-1
vector
of strike price values for each option.
Data Types: double
ExerciseDates
— Option exercise datesOption exercise dates, specified as a NINST
-by-1
, NINST
-by-2
,
or NINST
-by-NSTRIKES
of serial
date numbers or character vectors depending on the type of option:
For a European option, use a NINST
-by-1
vector
of dates. For a European option, there is only one ExerciseDates
on
the option expiry date.
For a Bermuda option, use a NINST
-by-NSTRIKES
vector
of dates. Each row is the schedule for one option.
For an American option, use a NINST
-by-2
vector
of exercise date boundaries. The option can be exercised on any date
between or including the pair of dates on that row. If only one non-NaN
date
is listed, or if ExerciseDates
is a NINST
-by-1
vector,
the option is exercised between the underlying bond Settle
date
and the single listed exercise date.
Data Types: double
| char
Specify optional
comma-separated pairs of Name,Value
arguments. Name
is
the argument name and Value
is the corresponding value.
Name
must appear inside quotes. You can specify several name and value
pair arguments in any order as
Name1,Value1,...,NameN,ValueN
.
OAS = oasbybdt(BDTTree,Price,CouponRate,Settle,Maturity,OptSpec,Strike,ExerciseDates,'Period',4)
'AmericanOpt'
— Option type0
European/Bermuda (default) | integer with values 0
or 1
Option type, specified as the comma-separated pair consisting of
'AmericanOpt'
and
NINST
-by-1
positive integer
flags with values:
0
— European/Bermuda
1
— American
Data Types: double
'Period'
— Coupons per year2
per year (default) | vectorCoupons per year, specified as the comma-separated pair consisting of
'Period'
and a
NINST
-by-1
vector.
Data Types: double
'Basis'
— Day-count basis0
(actual/actual) (default) | integer from 0
to 13
Day-count basis, specified as the comma-separated pair consisting of
'Basis'
and a
NINST
-by-1
vector of integers.
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
'EndMonthRule'
— End-of-month rule flag1
(in effect) (default) | nonnegative integer with values 0
or 1
End-of-month rule flag, specified as the comma-separated pair consisting of
'EndMonthRule'
and a nonnegative integer using a
NINST
-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: double
'IssueDate'
— Bond issue dateBond issue date, specified as the comma-separated pair consisting of
'IssueDate'
and a
NINST
-by-1
vector using serial
date numbers or date character vectors.
Data Types: double
| char
'FirstCouponDate'
— Irregular first coupon dateIrregular first coupon date, specified as the comma-separated pair consisting of
'FirstCouponDate'
and a
NINST
-by-1
vector using serial
date numbers or date character vectors.
When FirstCouponDate
and LastCouponDate
are
both specified, FirstCouponDate
takes precedence
in determining the coupon payment structure. If you do not specify
a FirstCouponDate
, the cash flow payment dates
are determined from other inputs.
Data Types: double
| char
'LastCouponDate'
— Irregular last coupon dateIrregular last coupon date, specified as the comma-separated pair consisting of
'LastCouponDate'
and a
NINST
-by-1
vector using serial
date numbers or date character vectors.
In the absence of a specified FirstCouponDate
,
a specified LastCouponDate
determines the coupon
structure of the bond. The coupon structure of a bond is truncated
at the LastCouponDate
, regardless of where it falls,
and is followed only by the bond's maturity cash flow date. If you
do not specify a LastCouponDate
, the cash flow
payment dates are determined from other inputs.
Data Types: char
| double
'StartDate'
— Forward starting date of paymentsForward starting date of payments (the date from which a bond cash flow is considered),
specified as the comma-separated pair consisting of
'StartDate'
and a
NINST
-by-1
vector using serial
date numbers or date character vectors.
If you do not specify StartDate
, the effective
start date is the Settle
date.
Data Types: char
| double
'Face'
— Face value100
(default) | NINST
-by-1
vector | NINST
-by-1
cell arrayFace or par value, specified as the comma-separated pair consisting of
'Face'
and a
NINST
-by-1
vector or a
NINST
-by-1
cell array where
each element is a NumDates
-by-2
cell array where the first column is dates and the second column is
associated face value. The date indicates the last day that the face
value is valid.
Data Types: double
'BondType'
— Type of underlying bond'vanilla'
for scalar
Face
values, 'callablesinking'
for scheduled Face
values (default) | cell array of character vectors with values
'vanilla'
,'amortizing'
, or
'callablesinking'
| string array with values "vanilla"
,
"amortizing"
, or
"callablesinking"
Type of underlying bond, specified as the comma-separated pair
consisting of 'BondType'
and a
NINST
-by-1
cell array of
character vectors or string array specifying if the underlying is a
vanilla bond, an amortizing bond, or a callable sinking fund bond. The
supported types are:
'vanilla
' is a standard callable or
puttable bond with a scalar Face
value
and a single coupon or stepped coupons.
'callablesinking'
is a bond with a
schedule of Face
values and a sinking
fund call provision with a single or stepped coupons.
'amortizing'
is an amortizing callable
or puttable bond with a schedule of
Face
values with single or stepped
coupons.
Data Types: char
| string
'Options'
— Derivatives pricing optionsDerivatives pricing options, specified as the comma-separated pair consisting of
'Options'
and a structure that is created with
derivset
.
Data Types: struct
OAS
— Option adjusted spreadOption adjusted spread, returned as a NINST
-by-1
vector.
OAD
— Option adjusted durationOption adjusted duration, returned as a NINST
-by-1
vector.
OAC
— Option adjusted convexityOption adjusted convexity, returned as a NINST
-by-1
vector.
A vanilla coupon bond is a security representing an obligation to repay a borrowed amount at a designated time and to make periodic interest payments until that time.
The issuer of a bond makes the periodic interest payments until the bond matures. At maturity, the issuer pays to the holder of the bond the principal amount owed (face value) and the last interest payment. A vanilla bond with an embedded option is where an option contract has an underlying asset of a vanilla bond.
A step-up and step-down bond is a debt security with a predetermined coupon structure over time.
With these instruments, coupons increase (step up) or decrease (step down) at specific times during the life of the bond. Stepped coupon bonds can have options features (call and puts).
A sinking fund bond is a coupon bond with a sinking fund provision.
This provision obligates the issuer to amortize portions of the principal prior to maturity, affecting bond prices since the time of the principal repayment changes. This means that investors receive the coupon and a portion of the principal paid back over time. These types of bonds reduce credit risk, since it lowers the probability of investors not receiving their principal payment at maturity.
The bond may have a sinking fund call option provision allowing the issuer to retire the sinking fund obligation either by purchasing the bonds to be redeemed from the market or by calling the bond via a sinking fund call, whichever is cheaper. If interest rates are high, then the issuer buys back the requirement amount of bonds from the market since bonds are cheap, but if interest rates are low (bond prices are high), then most likely the issuer is buying the bonds at the call price. Unlike a call feature, however, if a bond has a sinking fund call option provision, it is an obligation, not an option, for the issuer to buy back the increments of the issue as stated. Because of this, a sinking fund bond trades at a lower price than a non-sinking fund bond.
Amortizing callable or puttable bonds work under a scheduled
Face
.
An amortizing callable bond gives the issuer the right to call back the bond, but
instead of paying the Face
amount at maturity, it repays part
of the principal along with the coupon payments. An amortizing puttable bond, repays
part of the principal along with the coupon payments and gives the bondholder the
right to sell the bond back to the issuer.
[1] Fabozzi, F. Handbook of Fixed Income Securities. 7th Edition. McGraw-Hill, 2005.
[2] Windas, T. Introduction to Option-Adjusted Spread Analysis. 3rd Edition. Bloomberg Press, 2007.
bdtprice
| bdttree
| instoptembnd
| oasbybk
| oasbyhjm
| oasbyhw
| optembndbybdt
You have a modified version of this example. Do you want to open this example with your edits?
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
Select web siteYou can also select a web site from the following list:
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.