cbondbystt
Price convertible bonds from standard trinomial tree
Syntax
Description
[
prices convertible bonds from a standard trinomial (STT) tree using a credit spread or
incorporating the risk of bond default.Price
,PriceTree
,EquityTree
,DebtTree
]
= cbondbystt(___,Name,Value
)
To incorporate the risk in the form of credit spread (Tsiveriotis-Fernandes method), use
the optional name-value pair input argument Spread
. To incorporate default
risk into the algorithm, specify the optional name-value pair input arguments
DefaultProbability
and RecoveryRate
.
Examples
Price a Convertible Bond Using a STTTree
Create a RateSpec
.
StartDates = datetime(2015,1,1); EndDates = datetime(2020,1,1); Rates = 0.025; Basis = 1; RateSpec = intenvset('ValuationDate',StartDates,'StartDates',StartDates,... 'EndDates',EndDates,'Rates',Rates,'Compounding',-1,'Basis',Basis)
RateSpec = struct with fields:
FinObj: 'RateSpec'
Compounding: -1
Disc: 0.8825
Rates: 0.0250
EndTimes: 5
StartTimes: 0
EndDates: 737791
StartDates: 735965
ValuationDate: 735965
Basis: 1
EndMonthRule: 1
Create a StockSpec
.
AssetPrice = 80; Sigma = 0.12; StockSpec = stockspec(Sigma,AssetPrice)
StockSpec = struct with fields:
FinObj: 'StockSpec'
Sigma: 0.1200
AssetPrice: 80
DividendType: []
DividendAmounts: 0
ExDividendDates: []
Create a STTTree
.
TimeSpec = stttimespec(StartDates, EndDates, 20); STTTree = stttree(StockSpec, RateSpec, TimeSpec)
STTTree = struct with fields:
FinObj: 'STStockTree'
StockSpec: [1x1 struct]
TimeSpec: [1x1 struct]
RateSpec: [1x1 struct]
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
STree: {1x21 cell}
Probs: {1x20 cell}
Define the convertible bond. The convertible bond can be called starting on Jan 1, 2016 with a strike price of 95.
CouponRate = 0.03; Settle = datetime(2015,1,1); Maturity = datetime(2018,4,1); Period = 1; CallStrike = 95; CallExDates = [datetime(2016,1,1) ; datetime(2018,1,1)]; ConvRatio = 1; Spread = 0.025;
Price the convertible bond using the standard trinomial tree model.
[Price,PriceTree,EqtTre,DbtTree] = cbondbystt(STTTree,CouponRate,Settle,Maturity,ConvRatio,... 'Period',Period,'Spread',Spread,'CallExDates',CallExDates,'CallStrike',CallStrike,'AmericanCall',1)
Price = 2×1
91.8885
90.6328
PriceTree = struct with fields:
FinObj: 'TrinPriceTree'
PTree: {1x21 cell}
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
EqtTre = struct with fields:
FinObj: 'TrinPriceTree'
PTree: {1x21 cell}
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
DbtTree = struct with fields:
FinObj: 'TrinPriceTree'
PTree: {1x21 cell}
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
Spread Effect Analysis for a Convertible Bond Using a STTTree
This example demonstrates the spread effect analysis of a 4% coupon convertible bond, callable at 110 at end of the second year, maturing in five years, with spreads of 0, 50, 100, and 150 BP.
Define the RateSpec
.
StartDates = datetime(2015,4,1); EndDates = datetime(2020,4,1); Rates = 0.05; Compounding = -1; Basis = 1; RateSpec = intenvset('StartDates',StartDates,'EndDates',EndDates,'Rates',Rates,... 'Compounding',Compounding,'Basis',Basis)
RateSpec = struct with fields:
FinObj: 'RateSpec'
Compounding: -1
Disc: 0.7788
Rates: 0.0500
EndTimes: 5
StartTimes: 0
EndDates: 737882
StartDates: 736055
ValuationDate: 736055
Basis: 1
EndMonthRule: 1
Define the convertible bond data.
Settle = datetime(2015,4,1); Maturity = datetime(2020,4,1); CouponRate = 0.04; CallStrike = 110; CallExDates = [datetime(2017,4,1) datetime(2020,4,1)]; ConvRatio = 1; AmericanCall = 1; Sigma = 0.3; Spreads = 0:0.005:0.015; Prices = 40:10:140; convprice = zeros(length(Prices),length(Spreads));
Define the TimeSpec
for the Standard Trinomial Tree, create an STTTree
using stttree
, and price the convertible bond using cbondbystt
.
NumSteps = 200; TimeSpec = stttimespec(StartDates, EndDates, NumSteps); for PriceIdx = 1:length(Prices) StockSpec = stockspec(Sigma, Prices(PriceIdx)); STTT = stttree(StockSpec, RateSpec, TimeSpec); convprice(PriceIdx,:) = cbondbystt(STTT, CouponRate, Settle, Maturity, ConvRatio,... 'Spread', Spreads(:),'CallExDates', CallExDates, 'CallStrike', CallStrike,... 'AmericanCall', AmericanCall); end
Plot the spread effect analysis for the convertible bond.
stock = repmat(Prices',1,length(Spreads)); plot(stock,convprice); legend({'+0 bp'; '+50 bp'; '+100 bp'; '+150 bp'}); title ('Effect of Spread using Trinomial tree - 200 steps') xlabel('Stock Price'); ylabel('Convertible Bond Price'); text(50, 150, ['Coupon 4% semiannual,', sprintf('\n'), ... '110 Call after 2 years,' sprintf('\n'), ... 'maturing in 5 years.'],'fontweight','Bold')
Price a Convertible Bond Using an STT Tree and Incorporate Default Risk Using DefaultProbability
and RecoveryRate
Create the interest-rate term structure RateSpec
.
StartDates = datetime(2015,1,1); EndDates = datetime(2020,1,1); Rates = 0.025; Basis = 1; RateSpec = intenvset('ValuationDate',StartDates,'StartDates',StartDates,... 'EndDates',EndDates,'Rates',Rates,'Compounding',-1,'Basis',Basis)
RateSpec = struct with fields:
FinObj: 'RateSpec'
Compounding: -1
Disc: 0.8825
Rates: 0.0250
EndTimes: 5
StartTimes: 0
EndDates: 737791
StartDates: 735965
ValuationDate: 735965
Basis: 1
EndMonthRule: 1
Create the StockSpec
.
AssetPrice = 80; Sigma = 0.12; StockSpec = stockspec(Sigma,AssetPrice)
StockSpec = struct with fields:
FinObj: 'StockSpec'
Sigma: 0.1200
AssetPrice: 80
DividendType: []
DividendAmounts: 0
ExDividendDates: []
Create the STT tree for the equity.
TimeSpec = stttimespec(StartDates, EndDates, 20); STTTree = stttree(StockSpec, RateSpec, TimeSpec)
STTTree = struct with fields:
FinObj: 'STStockTree'
StockSpec: [1x1 struct]
TimeSpec: [1x1 struct]
RateSpec: [1x1 struct]
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
STree: {1x21 cell}
Probs: {1x20 cell}
Define and price the convertible bond using the optional DefaultProbability
and RecoveryRate
arguments.
CouponRate = 0.03; Settle = datetime(2015,1,1); Maturity = datetime(2018,4,1); Period = 1; CallStrike = 95; CallExDates = [datetime(2016,1,1) datetime(2018,1,1)]; ConvRatio = 1; DefaultProbability = .30; RecoveryRate = .82; [Price,PriceTree,EqtTre,DbtTree] = cbondbystt(STTTree,CouponRate,Settle,Maturity,ConvRatio,... 'Period',Period,'CallExDates',CallExDates,'CallStrike',CallStrike,'AmericanCall',1,... 'DefaultProbability',DefaultProbability,'RecoveryRate',RecoveryRate)
Price = 80
PriceTree = struct with fields:
FinObj: 'TrinPriceTree'
PTree: {1x21 cell}
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
EqtTre = struct with fields:
FinObj: 'TrinPriceTree'
PTree: {1x21 cell}
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
DbtTree = struct with fields:
FinObj: 'TrinPriceTree'
PTree: {1x21 cell}
tObs: [0 0.2500 0.5000 0.7500 1 1.2500 1.5000 1.7500 2 2.2500 2.5000 2.7500 3 3.2500 3.5000 3.7500 4 4.2500 4.5000 4.7500 5]
dObs: [735965 736056 736147 736238 736330 736421 736512 736604 736695 736786 736878 736969 737060 737151 737243 737334 737425 737517 737608 737699 737791]
Input Arguments
STTTree
— Stock tree structure for standard trinomial tree
structure
Stock tree structure for a standard trinomial tree, specified by using stttree
.
Data Types: struct
CouponRate
— Bond coupon rate
positive decimal value
Bond coupon rate, specified as an NINST
-by-1
decimal annual rate or NINST
-by-1
cell array, where each
element is a NumDates
-by-2
cell array. The first column
of the NumDates
-by-2
cell array is dates and the second
column is associated rates. The date indicates the last day that the coupon rate is
valid.
Data Types: double
| cell
Settle
— Settlement date
datetime array | string array | date character vector
Settlement date, specified as an NINST
-by-1
vector
using a datetime array, string array, or date character vectors.
Note
The Settle
date for every convertible bond is set to the
ValuationDate
of the standard trinomial (STT) stock tree. The bond
argument, Settle
, is ignored.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
Maturity
— Maturity date
datetime array | string array | date character vector
Maturity date, specified as an NINST
-by-1
vector
using a datetime array, string array, or date character vectors.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
ConvRatio
— Number of shares convertible to one bond
nonnegative number
Number of shares convertible to one bond, specified as an
NINST
-by-1
with a nonnegative number.
Data Types: double
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: [Price,PriceTree,EquityTree,DebtTree] =
cbondbystt(STTTree,CouponRate,Settle,Maturity,ConvRatio,'Spread',Spread,'CallExDates',CallExDates,'CallStrike',CallStrike,'AmericanCall',1)
Spread
— Number of basis points over the reference rate
0
(default) | vector
Number of basis points over the reference rate, specified as the comma-separated pair
consisting of 'Spread'
and a
NINST
-by-1
vector. For example, if the reference rate
is 2% and spread is 4%, then the Spread
value in basis points would be
0.04
.
Note
To incorporate the risk in the form of credit spread (Tsiveriotis-Fernandes method),
use the optional input argument Spread
. To incorporate default risk into
the algorithm, specify the optional input arguments DefaultProbability
and RecoveryRate
. Do not use Spread
with
DefaultProbability
and RecoveryRate
.
Data Types: double
Period
— Coupons per year
2
per year (default) | vector
Coupons per year, specified as the comma-separated pair consisting of
'Period'
and a NINST
-by-1
vector.
Data Types: double
IssueDate
— Bond issue date
datetime array | string array | date character vector
Bond issue date, specified as the comma-separated pair consisting of
'IssueDate'
and a NINST
-by-1
vector
using a datetime array, string array, or date character vectors.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
FirstCouponDate
— Irregular first coupon date
datetime array | string array | date character vector
Irregular first coupon date, specified as the comma-separated pair consisting of
'FirstCouponDate'
and a NINST
-by-1
vector using a datetime array, string array, or date character vectors.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
LastCouponDate
— Irregular last coupon date
datetime array | string array | date character vector
Irregular last coupon date, specified as the comma-separated pair consisting of
'LastCouponDate'
and a NINST
-by-1
vector using a datetime array, string array, or date character vectors.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
Face
— Face value
100
(default) | nonnegative value | cell array of nonnegative values
Face value, specified as the comma-separated pair consisting of
'Face'
and a NINST
-by-1
vector of
nonnegative face values or a NINST
-by-1
cell array,
where each element is a NumDates
-by-2
cell array. The
first column of the NumDates
-by-2
cell array is dates
and the second column is the associated face value. The date indicates the last day that the
face value is valid.
Data Types: cell
| double
CallStrike
— Call strike price for European, Bermuda, or American option
nonnegative integer | vector of nonnegative integers
Call strike price for European, Bermuda, or American option, specified as the
comma-separated pair consisting of 'CallStrike'
and one of the following
values:
For a European call option —
NINST
-by-1
vector of nonnegative integersFor a Bermuda call option —
NINST
-by-NSTRIKES
matrix of call strike price values, where each row is the schedule for one call option. If a call option has fewer thanNSTRIKES
exercise opportunities, the end of the row is padded withNaN
s.For an American call option —
NINST
-by-1
vector of strike price values for each option.
Data Types: double
CallExDates
— Call exercise date for European, Bermuda, or American option
datetime array | string array | date character vector
Call exercise date for European, Bermuda, or American option, specified as the
comma-separated pair consisting of 'CallExDates'
and a datetime array,
string array, or date character vectors for one of the following values:
For a European option —
NINST
-by-1
vector of date character vectors.For a Bermuda option —
NINST
-by-NSTRIKES
matrix of exercise dates, where each row is the schedule for one option. For a European option, there is only oneCallExDate
on the option expiry date.For an American option —
NINST
-by-1
orNINST
-by-2
matrix of exercise date boundaries. For each instrument, the call option can be exercised on any tree date between or including the pair of dates on that row. IfCallExDates
isNINST
-by-1
, the option can be exercised between theValuationDate
of the STT stock tree and the single listedCallExDate
.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
AmericanCall
— Call option type indicator
0
if AmericanCall
is NaN
or not entered (default) | positive integer [0,1]
| vector of positive integers [0,1]
Call option type, specified as the comma-separated pair consisting of
'AmericanCall'
and a NINST
-by-1
vector of positive integer flags with values 0
or
1
.
For a European or Bermuda option —
AmericanCall
is0
for each European or Bermuda option.For an American option —
AmericanCall
is1
for each American option. TheAmericanCall
argument is required to invoke American exercise rules.
Data Types: double
PutStrike
— Put strike values for European, Bermuda, or American option
positive integer | vector of positive integers
Put strike values for European, Bermuda, or American option, specified as the
comma-separated pair consisting of 'PutStrike'
and one of the following
values:
For a European put option —
NINST
-by-1
vector of nonnegative integers.For a Bermuda put option —
NINST
-by-NSTRIKES
matrix of strike price values where each row is the schedule for one option. If a put option has fewer thanNSTRIKES
exercise opportunities, the end of the row is padded withNaN
s.For an American put option —
NINST
-by-1
vector of strike price values for each option.
Data Types: double
PutExDates
— Put exercise date for European, Bermuda, or American option
datetime array | string array | date character vector
Put exercise date for European, Bermuda, or American option, specified as the
comma-separated pair consisting of 'PutExDates'
and a datetime array,
string array, or date character vectors for one of the following values:
For a European option —
NINST
-by-1
vector of date character vectors.For a Bermuda option —
NINST
-by-NSTRIKES
matrix of exercise dates where each row is the schedule for one option. For a European option, there is only onePutExDate
on the option expiry date.For an American option —
NINST
-by-1
orNINST
-by-2
matrix of exercise date boundaries. For each instrument, the put option can be exercised on any tree date between or including the pair of dates on that row. IfPutExDates
isNINST
-by-1
, the put option can be exercised between theValuationDate
of the STT stock tree and the single listedPutExDate
.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
AmericanPut
— Put option type indicator
0
if AmericanPut
is NaN
or not entered (default) | positive integer [0,1]
| vector of positive integers [0,1]
Put option type, specified as the comma-separated pair consisting of
'AmericanPut'
and a NINST
-by-1
vector of positive integer flags with values 0
or
1
.
For a European or Bermuda option —
AmericanPut
is0
for each European or Bermuda option.For an American option —
AmericanPut
is1
for each American option. TheAmericanPut
argument is required to invoke American exercise rules.
Data Types: double
ConvDates
— Convertible dates
MaturityDate
(default) | datetime array | string array | date character vector
Convertible dates, specified as the comma-separated pair consisting of
'ConvDates'
and a NINST
-by-1
or
NINST
-by-2
vector using a datetime array, string
array, or date character vectors. If ConvDates
is not specified, the bond
is always convertible until maturity.
To support existing code, cbondbystt
also
accepts serial date numbers as inputs, but they are not recommended.
For each instrument, the bond can be converted on any tree date between or including the pair of dates on that row.
If ConvDates
is NINST
-by-1
, the
bond can be converted between the ValuationDate
of the standard trinomial
(STT) stock tree and the single listed ConvDates
.
DefaultProbability
— Annual probability of default rate
0
(default) | nonnegative decimal
Annual probability of default rate, specified as the comma-separated pair consisting of
'DefaultProbability'
and a
NINST
-by-1
nonnegative decimal value.
Note
To incorporate default risk into the algorithm, specify the optional input arguments
DefaultProbability
and RecoveryRate
. To
incorporate the risk in the form of credit spread (Tsiveriotis-Fernandes method), use the
optional input argument Spread
. Do not use
DefaultProbability
and RecoveryRate
with
Spread
.
Data Types: double
RecoveryRate
— Recovery rate
1
(default) | nonnegative decimal
Recovery rate, specified as the comma-separated pair consisting of
'RecoveryRate'
and a NINST
-by-1
nonnegative decimal value.
Note
To incorporate default risk into the algorithm, specify the optional input arguments
DefaultProbability
and RecoveryRate
. To
incorporate the risk in the form of credit spread (Tsiveriotis-Fernandes method), use the
optional input argument Spread
. Do not use
DefaultProbability
and RecoveryRate
with
Spread
.
Data Types: double
Output Arguments
Price
— Expected price at time 0
array
Expected price at time 0
, returned as an
NINST
-by-1
array.
PriceTree
— Structure with vector of convertible bond prices at each node
tree structure
Structure with a vector of convertible bond prices at each node, returned as a tree structure.
EquityTree
— Structure with vector of convertible bond equity component at each node
tree structure
Structure with a vector of convertible bond equity components at each node, returned as a tree structure.
DebtTree
— Structure with vector of convertible bond debt component at each node
tree structure
Structure with a vector of convertible bond debt components at each node, returned as a tree structure.
More About
Callable Convertible
A convertible bond that is callable by the issuer. The issuer of the bond forces conversion, removing the advantage that conversion is at the discretion of the bondholder.
Upon call, the bondholder can either convert the bond or redeem at the call price. This option enables the issuer to control the price of the convertible bond and, if necessary, refinance the debt with a new cheaper bond.
Puttable Convertible
A convertible bond with a put feature allows the bondholder to sell back the bond at a premium on a specific date.
This option protects the holder against rising interest rates by reducing the year to maturity.
Algorithms
cbondbycrr
, cbondbyeqp
, cbondbyitt
, and cbondbystt
return price information in the form of
a price vector and a price tree. These functions implement the risk in the form of either a
credit spread or incorporating the risk of bond default. To incorporate the risk in the form of
credit spread (Tsiveriotis-Fernandes method), use the optional name-value pair argument
Spread
. To incorporate default risk into the algorithm, specify the
optional name-value pair arguments DefaultProbability
and
RecoveryRate
.
References
[1] Tsiveriotis, K., and C. Fernandes. “Valuing Convertible Bonds with Credit Risk.” Journal of Fixed Income. Vol 8, 1998, pp. 95–102.
[2] Hull, J. Options, Futures and Other Derivatives. Fourth Edition. Prentice Hall, 2000, pp. 646–649.
Version History
Introduced in R2015bR2022b: Serial date numbers not recommended
Although cbondbystt
supports serial date numbers,
datetime
values are recommended instead. The
datetime
data type provides flexible date and time
formats, storage out to nanosecond precision, and properties to account for time
zones and daylight saving time.
To convert serial date numbers or text to datetime
values, use the datetime
function. For example:
t = datetime(738427.656845093,"ConvertFrom","datenum"); y = year(t)
y = 2021
There are no plans to remove support for serial date number inputs.
See Also
stttree
| cbondbyeqp
| cbondbycrr
| instcbond
| intenvset
| stockspec
| instadd
| instdisp
| sttprice
| sttsens
Topics
MATLAB Command
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.
Select a Web Site
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: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)