Main Content

cbondbyeqp

Price convertible bonds from EQP binomial tree

Description

Price = cbondbyeqp(EQPTree,CouponRate,Settle,Maturity,ConvRatio) prices convertible bonds from an EQP binomial tree using the Tsiveriotis and Fernandes method.

example

[Price,PriceTree] = cbondbyeqp(EQPTree,CouponRate,Settle,Maturity,ConvRatio) prices convertible bonds from an EQP binomial tree using the Tsiveriotis and Fernandes method.

example

[Price,PriceTree,EquityTree,DebtTree] = cbondbyeqp(___,Name,Value) prices convertible bonds from an EQP binomial tree using 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 input argument Spread. To incorporate default risk into the algorithm, specify the optional name-value pair input arguments DefaultProbability and RecoveryRate.

example

Examples

collapse all

Create the interest-rate term structure RateSpec.

StartDates = datetime(2014,1,1); 
EndDates = 'Jan-1-2016'; 
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.9512
            Rates: 0.0250
         EndTimes: 2
       StartTimes: 0
         EndDates: 736330
       StartDates: 735600
    ValuationDate: 735600
            Basis: 1
     EndMonthRule: 1

Create the StockSpec.

AssetPrice = 110; 
Sigma = 0.22; 
Div = 0.02; 
StockSpec = stockspec(Sigma,AssetPrice,'continuous',Div)
StockSpec = struct with fields:
             FinObj: 'StockSpec'
              Sigma: 0.2200
         AssetPrice: 110
       DividendType: {'continuous'}
    DividendAmounts: 0.0200
    ExDividendDates: []

Create the EQP tree for the equity.

NumSteps = 6;
TimeSpec = eqptimespec(StartDates,EndDates,NumSteps);
EQPTree = eqptree(StockSpec,RateSpec,TimeSpec)
EQPTree = struct with fields:
       FinObj: 'BinStockTree'
       Method: 'EQP'
    StockSpec: [1x1 struct]
     TimeSpec: [1x1 struct]
     RateSpec: [1x1 struct]
         tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
         dObs: [735600 735721 735843 735965 736086 736208 736330]
        STree: {[110]  [124.1039 96.2631]  [140.0161 108.6057 84.2416]  [157.9686 122.5308 95.0429 73.7215]  [178.2229 138.2413 107.2290 83.1738 64.5150]  [201.0741 155.9662 120.9776 93.8381 72.7870 56.4583]  [1x7 double]}
      UpProbs: [0.5000 0.5000 0.5000 0.5000 0.5000 0.5000]

Define the convertible bond. The convertible bond can be called starting on Jan 1, 2015 with a strike price of 125.

Settle = datetime(2014,1,1); 
Maturity = datetime(2016,1,1); 
CouponRate = 0.03;
CallStrike = 125; 
Period = 1;
CallExDates = [datetime(2015,1,1) ; datetime(2016,1,1)];
ConvRatio = 1.5;

Price the convertible bond.

Spread = 0.045;

[Price,PriceTree,EqtTre,DbtTree] = cbondbyeqp(EQPTree,CouponRate,Settle,...
Maturity,ConvRatio,'Period',Period,'Spread',Spread,'CallExDates',...
CallExDates,'CallStrike',CallStrike,'AmericanCall',1)
Price = 2×1

   165
   165

PriceTree = struct with fields:
    FinObj: 'BinPriceTree'
     PTree: {[2x1 double]  [2x2 double]  [2x3 double]  [2x4 double]  [2x5 double]  [2x6 double]  [2x7 double]}
      tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
      dObs: [735600 735721 735843 735965 736086 736208 736330]

EqtTre = struct with fields:
    FinObj: 'BinPriceTree'
     PTree: {[2x1 double]  [2x2 double]  [2x3 double]  [2x4 double]  [2x5 double]  [2x6 double]  [2x7 double]}
      tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
      dObs: [735600 735721 735843 735965 736086 736208 736330]

DbtTree = struct with fields:
    FinObj: 'BinPriceTree'
     PTree: {[2x1 double]  [2x2 double]  [2x3 double]  [2x4 double]  [2x5 double]  [2x6 double]  [2x7 double]}
      tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
      dObs: [735600 735721 735843 735965 736086 736208 736330]

Create the interest-rate term structure RateSpec.

StartDates = datetime(2014,1,1); 
EndDates = datetime(2016,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.9512
            Rates: 0.0250
         EndTimes: 2
       StartTimes: 0
         EndDates: 736330
       StartDates: 735600
    ValuationDate: 735600
            Basis: 1
     EndMonthRule: 1

Create the StockSpec.

AssetPrice = 110; 
Sigma = 0.22; 
Div = 0.02; 
StockSpec = stockspec(Sigma,AssetPrice,'continuous',Div)
StockSpec = struct with fields:
             FinObj: 'StockSpec'
              Sigma: 0.2200
         AssetPrice: 110
       DividendType: {'continuous'}
    DividendAmounts: 0.0200
    ExDividendDates: []

Create the EQP tree for the equity.

NumSteps = 6;
TimeSpec = eqptimespec(StartDates,EndDates,NumSteps);
EQPTree = eqptree(StockSpec,RateSpec,TimeSpec)
EQPTree = struct with fields:
       FinObj: 'BinStockTree'
       Method: 'EQP'
    StockSpec: [1x1 struct]
     TimeSpec: [1x1 struct]
     RateSpec: [1x1 struct]
         tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
         dObs: [735600 735721 735843 735965 736086 736208 736330]
        STree: {[110]  [124.1039 96.2631]  [140.0161 108.6057 84.2416]  [157.9686 122.5308 95.0429 73.7215]  [178.2229 138.2413 107.2290 83.1738 64.5150]  [201.0741 155.9662 120.9776 93.8381 72.7870 56.4583]  [1x7 double]}
      UpProbs: [0.5000 0.5000 0.5000 0.5000 0.5000 0.5000]

Define and price the convertible bond using the optional DefaultProbability and RecoveryRate arguments.

Settle = datetime(2014,1,1);
Maturity = datetime(2016,1,1);
CouponRate = 0.03;
CallStrike = 125;
Period = 1;
CallExDates = [datetime(2015,1,1) ; datetime(2016,1,1)];
ConvRatio = 1.5;
DefaultProbability = .30;
RecoveryRate = .82;

[Price,PriceTree,EqtTre,DbtTree] = cbondbyeqp(EQPTree,CouponRate,Settle,...
Maturity,ConvRatio,'Period',Period,'CallExDates',...
CallExDates,'CallStrike',CallStrike,'AmericanCall',1,...
'DefaultProbability',DefaultProbability,'RecoveryRate',RecoveryRate)
Price = 2×1

   165
   165

PriceTree = struct with fields:
    FinObj: 'BinPriceTree'
     PTree: {[2x1 double]  [2x2 double]  [2x3 double]  [2x4 double]  [2x5 double]  [2x6 double]  [2x7 double]}
      tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
      dObs: [735600 735721 735843 735965 736086 736208 736330]

EqtTre = struct with fields:
    FinObj: 'BinPriceTree'
     PTree: {[2x1 double]  [2x2 double]  [2x3 double]  [2x4 double]  [2x5 double]  [2x6 double]  [2x7 double]}
      tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
      dObs: [735600 735721 735843 735965 736086 736208 736330]

DbtTree = struct with fields:
    FinObj: 'BinPriceTree'
     PTree: {[2x1 double]  [2x2 double]  [2x3 double]  [2x4 double]  [2x5 double]  [2x6 double]  [2x7 double]}
      tObs: [0 0.3333 0.6667 1 1.3333 1.6667 2]
      dObs: [735600 735721 735843 735965 736086 736208 736330]

Input Arguments

collapse all

Stock tree structure, specified by using eqptree.

Data Types: struct

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

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 EQP stock tree. The bond argument, Settle, is ignored.

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

Maturity date, specified as an NINST-by-1 vector using a datetime array, string array, or date character vectors.

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

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] = cbondbyeqp(EQPT,CouponRate,Settle, Maturity, ConvRatio,'Spread',Spread,'CallExDates',CallExDates, 'CallStrike',CallStrike,'AmericanCall',1)

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

Coupons per year, specified as the comma-separated pair consisting of 'Period' and a NINST-by-1 vector.

Data Types: double

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

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

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

Face value, specified as the comma-separated pair consisting of 'Face' and a NINST-by-1 vector of nonnegative face values or an 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

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 integers

  • For a Bermuda call option — NINST-by-NSTRIKES matrix of strike price values, where each row is the schedule for one call option. If an option has fewer than NSTRIKES exercise opportunities, the end of the row is padded with NaNs.

  • For an American call option — NINST-by-1 vector of strike price values for each call option.

Data Types: single | double

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 call option. For a European option, there is only one CallExDate on the option expiry date.

  • For an American option — NINST-by-1 or NINST-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. If CallExDates is NINST-by-1, the call option can be exercised between the ValuationDate of the EQP stock tree and the single listed CallExDate.

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

Call option type, specified as the comma-separated pair consisting of 'AmericanCall' and a NINST-by-1 vector with positive integer flags with values 0 or 1.

  • For a European or Bermuda option — AmericanCall is 0 for each European or Bermuda option.

  • For an American option — AmericanCall is 1 for each American option. The AmericanCall argument is required to invoke American exercise rules.

Data Types: single | double

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 put strike price values, where each row is the schedule for one put option. If a put option has fewer than NSTRIKES exercise opportunities, the end of the row is padded with NaNs.

  • For an American put option — NINST-by-1 vector of strike price values for each put option.

Data Types: single | double

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 put option. For a European option, there is only one PutExDate on the option expiry date.

  • For an American option — NINST-by-1 or NINST-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. If PutExDates is NINST-by-1, the put option can be exercised between the ValuationDate of the EQP stock tree and the single listed PutExDate.

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

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 is 0 for each European or Bermuda option.

  • For an American option — AmericanPut is 1 for each American option. The AmericanPut argument is required to invoke American exercise rules.

Data Types: single | double

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, cbondbyeqp 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 EQP stock tree and the single listed ConvDates.

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

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

collapse all

Expected price at time 0, returned as an NINST-by-1 array.

Structure with a vector of convertible bond prices at each node, returned as a tree structure.

Structure with a vector of convertible bond equity component at each node, returned as a tree structure.

Structure with a vector of convertible bond debt component at each node, returned as a tree structure.

More About

collapse all

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

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 R2015a

expand all