Download as pdf or txt
Download as pdf or txt
You are on page 1of 70

Extension and Implementation of the Black-Derman-Toy Model

Peter C. Stimes, CFA


(Fallbrook, California)

April 18, 2022

Abstract: The paper reviews the BDT model and introduces a robust numerical method for
calibration. The model is extended to encompass securities subject to default. Embedded
optionality is treated next, including issuer redemption options, investor options to put, and
caps/floors on income streams. All elements are then joined together and integrated with the use
of option-adjusted spreads (OAS’s). Representative results are presented. An addendum
provides the underlying software code that can be utilized directly in the R programming
language (and readily adapted to other high level software languages.)

The Author: Peter Stimes is a retired Principal and Head of Quantitative and Credit Research at
Flaherty & Crumrine Incorporated. He is the author of Equity Valuation, Risk, and Investment: A
Practitioner’s Roadmap (2008, John Wiley & Sons, Inc.) and has been a frequent contributor to
and editor of curriculum for the exam candidates’ program of the CFA Institute.

Author’s Rights: The author grants the reader right to reproduce and disseminate all or portions
of this paper, subject to the requirement that authorial attribution be given.

Comments and Corrections: email to stimesfamily@sbcglobal.net

1
Extension and Implementation of the Black-Derman-Toy Model

Overview: This paper integrates ideas from term structure modeling, option pricing, and credit
analysis. The resulting model can be applied to the wide variety of questions typically arising in
the analysis of fixed income securities. Despite its elegance and clarity, implementation of the
BDT model has typically been difficult, due to the fact that both the risk-free yield curve and
associated term structure of volatilities must be fitted simultaneously. This paper presents a
robust numerical algorithm for accomplishing this. The algorithm is transparent and adaptable to
any type of software environment. With such algorithm in hand, the treatment of default,
optionality, and differential security prices can be approached in a logical and intuitive manner.

(The following chart is reproduced and described in Section V.)

2
TABLE OF CONTENTS

Page
Introduction 4
Section I: Basic Model Structure 4
Optional Section: Turbocharging the Calibration of the
Interest Rate Lattice 18

Section II: Incorporating Default Risk into Security Pricing 21


Section III: Modeling Optionality 27
Optional Section: Analysis of Floating Rate Notes, Caps, and Floors 30
Section IV: Utilizing Option Adjusted Spreads (“OAS’s”) 38
Section V: Sensitivity Analysis 42
Section VI: Concluding Remarks 50

Programming Addendum 51
Market Data Addendum 65
Bibliographical References 70

3
INTRODUCTION
The Black-Derman-Toy (“BDT”) framework was introduced in 19901 to model the term
structure of default-free securities. The model can reproduce the prevailing zero-coupon
benchmark/Treasury yield curve and the observed volatility of such yields. In this paper, we
broaden the structure of the BDT model to evaluate securities with embedded options and which
may be subject to default.
The paper’s first section presents the theory of the BDT model and its practical
implementation. The second section introduces the complications arising from the possibility of
default and the magnitude of default losses. In the third section, the paper discusses the model’s
application in the presence of optionality, such as issuer redemption, investor put options, and
caps or floors on contractual payments of income. The fourth section presents the concept of
Option Adjusted Spread (“OAS”), which allows investors to value securities not priced directly
from the underlying BDT benchmark/Treasury yield curve. In the fifth section, the paper
presents representative results and suggestions for application and research.
Addendums to this paper contain computer code written in R that can be copied and
pasted for readers’ implementation.
Implementation of the BDT model is difficult without a method to fit simultaneously the
risk-free yield curve and the associated term structure of volatility. This paper presents a robust
numerical algorithm for accomplishing this.

SECTION I: BASIC MODEL STRUCTURE


The BDT model is predicated on an evolution of one-period, risk-free interest rates. This
creates a lattice of future rates determined by the passage of time, the probability of either an up
or down jump at each period end, and the magnitude of such jumps. The value of a security at
any node reflects the probability-weighted, discounted value of cash flows looking forward from
each such node. Furthermore, the interest late lattice is recombining. This means that every point
on the lattice can be reached by either a “down”/(“up”) jump from a higher/(lower) node reached
at the preceding period end. Without loss of generality, in this paper, up and down jumps are set
to be equally probable.
Under these assumptions, a security can be valued so long as its cash flows at any node
are independent of the path of interest rates taken up to that time. This encompasses a variety of
securities and derivatives, including, but not limited to, callable bonds (including those subject to
default), bonds that can be put back to the issuer by the investor, options on bonds, interest rate
swaps, options on swaps (swaptions), and interest caps and floors. Variable rate securities are as
easy in principle to value as fixed rate securities.

1
Bibliographical references are included following the Addendums to this paper.

4
The evolution of the one-period rate can be visualized in the following manner, where i
denotes the number of periods elapsed since beginning time 0 and where j represents the number
of times the short rate has jumped up since time 0. Each node can therefore be represented by the
coordinates i, j.
We see in the following picture that r(3,2) represents the short-term rate at time i = 3 in
the instance where the short-term rate has had a cumulative of two up jumps and, thus, one down
jump up to that time. The path to that point could be, in the respective time periods, up-down-up,
down-up-up, or up-up-down. No matter the path, j=2.
The maximum number of up jumps through time i = n is thus j = n. The maximum
number of down jumps is the same, but we can keep track of the down jumps by knowing the
number of up jumps, since the number of down jumps equals the number of time periods less the
number of up jumps to that time, namely, i – j. The maximum number of down jumps will
therefore be reached when the number of up jumps through i = n is zero, that is j = 0.

Figure 1 – Interest Rate Lattice Example

r(3,3)

r(2,2)

r(1,1) r(3,2)

r(0,0) r(2,1)

r(1,0) r(3,1)

r(2,0)

r(3,0)

In the foregoing picture, which is defined as a binomial lattice, the vertical spacing, that
is, the magnitude of the jumps happens to be uniform across time. This is not required in the
BDT model. All that is necessary is that the nodes are recombining. Thus, we could envision an
interest rate evolution something like this.

5
Figure 2 – More Complicated Interest Rate Lattice Example

For convenience, we use the notation ri,j in place of r(i, j) throughout the rest of this
paper. In determining ri,j at each node in the interest rate lattice, we use the following
parameterization:

, ∙

(1)
In this formulation, Ri denotes the one period rate at time i in the absence of any up jumps, j.
(This can also be expressed as Ri = ri,0.) The other parameter, Ki, represents a scaling factor
applicable to all one-period rates at time i. We observe that:

, , ∙ ∙

(2)
In simple terms, for any two adjacent nodes at time i, the ratio of one-period rates is the same.
We restrict these two parameters such that Ri > 0 and Ki > 1. This means that interest rates can
never be negative and that an up jump must result in a larger value than a down jump.
With these two parameters at each time period, we have the requisite number of
instruments needed to determine (a) the overall level of interest rates and, owing mainly to the
effect of the Ki parameter, (b) the spread – and therefore the volatility – of interest rates.

6
Knowledge of future interest rates and their volatility implies the ability to determine both the
prices and volatility of securities priced from an interest rate lattice.2

Determining Values within the Basic Model:


Once the interest rates are known for each node, cash flows can be valued with the
following equation, where we denote the value of a security at node (i,j) as Wi,j :

+ 1−
+
, ,
, ,
1+ ,

(3)
In non-mathematical language, the value of the security at time i, conditional on j interest rate up
jumps, equals the cash flow to be received at that time and in that state, Ci,j, plus an amount equal
to the probability weighted sum of the values prevailing one period hence (i+1) where the one-
period interest rate can either jump up (j+1) or down (j). The next period expected value is
discounted at the interest rate ri,j at node (i,j).
As already mentioned, we assume the probability of an up or down jump is the same.
Thus, the equation we implement in practice is:

0.5 ∙ + 0.5 ∙
+
, ,
, ,
1+ ,

(3)′
A valuation model of this type must be solved backwards, recursively, from maturity, M,
period-by-period , node-by-node until we reach the origin i = 0, j = 0 at node (0,0). The value at
maturity is known and, for risk-free debt securities, can be written as face value, FM. This
permits us to represent M+1 terminal-node values as:

, , +

, , +

, , +
(4)

2
The algebra behind the lattice creation does not allow for negative interest rates at any point in the lattice. In
extreme cases, the BDT model can thus not replicate then prevailing market relationships.

7
The penultimate node values are obtained similarly and produce M values at time M-1:
0.5 ∙ + 0.5 ∙
+
, ,
, ,
1+ ,

0.5 ∙ + 0.5 ∙
+
, ,
, ,
1+ ,


0.5 ∙ + 0.5 ∙
+
, ,
, ,
1+ ,

(5)
The process is continued backwards until reaching the present, whereupon we obtain:

0.5 ∙ + 0.5 ∙
+
, ,
, ,
1+ ,
(6)
To obtain the price of a security at node (0,0), we need to strip out the cash received then. We
therefore define the current security price as P0,0 = W0,0 – C0,0 ; then we use this, along with
equation (6), to obtain:

0.5 ∙ , + 0.5 ∙ ,
,
1+ ,
(7)

Determining Volatilities within the Basic Model:


From the current time and state, (0,0), a bond with maturity M will have one of two

!"#$
different values one period hence. It will then have a remaining maturity of M-1 periods, but will
have the value , or , , depending on whether the short-term rate has jumped up
or down over the period. The capital letter M in parentheses represents the initial maturity of the
security in question. These prices are available from the procedures already described, where we
obtained a value of the security at each node of the lattice.
In calibrating the basic BDT model, the interest rate lattice is designed so that the
modeled prices of risk-free, zero-coupon debt securities match observed prices. The calibration
also requires that modeled volatilities match those of the observed historical volatilities of zero-
coupon yields-to-maturity (YTM’s).

8
In order to compute modeled volatility, we first compute the yield to remaining maturity
of the debt security in question. Because we are considering zero-coupon bonds, we can compute
the YTM’s, one period hence, in this manner.

%& , ' ( −1
,

%& !"#$
, ' !"#$ ( −1
,

(8)

The volatility is given according to the following formula, for a security with initial
maturity M:3

1 %&
)*+ ln ' !"#$ (
,
2 %& ,

(9)

IMPORTANT: When computing volatilities, it is important that the time period of the
yield corresponds to the time interval of the interest rate lattice. In the absence of serial
correlation, the periodic volatility will be related to the annualized volatility as a function of the
square root of the fraction of a year, namely:

)012 "! 3 )4$$ 56 √&

3
The underlying formula is derived here. By definition,

89 :9;<= .5>ln ? @ + .5>ln ? @ − >. 5 ln ? + .5 ln ? @

This simplifies to

89 :9;<= >. 5 ln ? − .5 ln ? @

?
and, finally, to
8AB9C:B:C? D>. 5 ln ? − .5 ln ? @E .5 ln ' (
?

9
where T represents the length of the time period measured in fractions of a year. Quarterly
volatility should be thus one-half of annual volatility, since

1 1
)F )4$$ 56 I )
52G126H
4 2 4$$ 56

Calibrating the Basic Model (Overview)


It is a daunting challenge to find the correct base interest rate, Ri, and scaling factor, Ki ,
for each period. However, we can use two-variable Newton-Raphson numerical techniques, one
period at a time, until we have found an R and K for each horizon.
If we have a yield curve with N periods, the total number of Ki’s we must find is thus
N-1. The number of Ri’s we must find is N – 1, since R0 = r0,0 and is known at the outset. The
total number of interest rate nodes will equal N(N+1) ÷ 2. For a 30-year bond yield curve with
intervals of one year, this equates to 465 nodes. For the same horizon, but at quarterly intervals,
N = 4 x 30 = 120 and the total number of lattice nodes is 7,260. Naturally, the computer run time
for the computation of node values will correspond to the number of nodes. In most
programming languages and with modern desktop computers, problems of this size are quite
tractable.

Many investment and finance professionals are unfamiliar with the Newton-Raphson
method. It is a way of utilizing first derivative approximations in order to draw ever closer to the
solution values of Ri and Ki with each iteration. This type of directed trial-and-error approach
should not be that unfamiliar to us, since, any time an internal rate of return analysis is
performed on a series of cash flows, a computer directs a trial-and-error algorithm that is
premised on numerically computed first derivatives.

Newton-Raphson Method in Principle:


We consider two functions f(x,y), g(x,y) that are both dependent on underlying variables x
and y. We further assume that we observe function values f* and g*, but where we do not know
the x* and y* that produce the observed values. In our case, the first function can be thought of
as the computed price of a zero-coupon bond of initial maturity M and the second function can
be thought of as the applicable yield volatility σytm for such bond. The desired x* and y* can be
thought of as the RM-1 and KM-1 that will produce the observed price and yield (symbolically f*
and g*), given the Ri and Ki computed for each preceding date on the lattice.4

4
Note that the interest rate and scaling factors determine the price and volatility for a security maturing one period
later.

10
From multi-variable calculus, using Taylor’s Theorem, we start with two important
conditions:

ML ML
ΔL ∙ ΔN + ∙ Δ?
MN M?

MO MO
ΔO ∙ ΔN + ∙ Δ?
MN M?
(10)
The ∆ denotes changes and, technically, equation (10) is only true as ∆x → 0 and ∆y → 0
in the limit.
We can rewrite the foregoing equations as follows.

ML ∗ ML ∗
L ∗ N ∗ , ? ∗ − L N, ? N −N + ? −?
MN M?
MO ∗ MO ∗
O∗ N ∗ , ? ∗ − O N, ? N −N + ? −?
MN M?
(11)
where f*(x*, y*) – f(x, y) represents ∆f , g*(x*, y*) – g(x, y) represents ∆g,
x* – x represents ∆x, and y* – y represents ∆y.
In the foregoing system, we know the target values, f*(x,y) and g*(x,y), the existing
values of x and y, and thus the resulting f(x,y) and g(x,y). We still might not know the values for
the various partial derivatives, particularly if the function value is obtained through a very
complex set of computations. We will show how we obtain these shortly. For the time being, we
assume the partial derivatives are also known once x and y are given.

The system of foregoing equations can be written in matrix notation as


ML ML
⎡ ⎤
⎢ MN M? ⎥ N ∗ − N
∙W X W
L ∗ N ∗ , ? ∗ − L N, ?
X
⎢MO MO⎥ ? ∗ − ? O∗ N ∗ , ? ∗ − O N, ?
⎢ ⎥
⎣ MN M?⎦
(12)

11
Multiplying both sides by the matrix inverse gives us:

ML ML
⎡ ⎤
N −N ⎢ MN M? ⎥ L ∗ N ∗ , ? ∗ − L N, ?

W X ⎢MO ∙W X
?∗ − ? MO⎥ O∗ N ∗ , ? ∗ − O N, ?
⎢ ⎥
⎣ MN M?⎦

One last rearrangement produces:

ML ML
⎡ ⎤
N N MN M? ⎥ L ∗ N ∗ , ? ∗ − L N, ?
Y?Z + ⎢⎢

W ∗X ∙W X
? MO MO⎥ O∗ N ∗ , ? ∗ − O N, ?
⎢ ⎥
⎣ MN M?⎦
(13)
This expression might appear formidable to the non-mathematical and it is not essential
to memorize it. There are some highly useful properties that can be understood even by the non-
mathematical. To start, equation (13) presents the kernel of an iterative procedure that will
almost always lead to the desired values of x* and y*. By starting with a reasonable guess for
such values and inputting them as x and y in equation (13), we can compute the partial
derivatives and the function values f(x,y) and g(x,y). Equation (13) will produce new estimated
values of x* and y*. We take these values and feed them into the right-hand side of equation (13)
as the next iteration seeds x and y. We repeat the process until the new seed values return
themselves. Technically, this happens when

ML ML
⎡ ⎤
N∗ N 0 ⎢ MN M? ⎥ L ∗ N ∗ , ? ∗ − L N, ?
W ∗ X − Y? Z Y Z ⎢MO ∙W ∗ ∗ ∗ X
? 0 MO⎥ O N , ? − O N, ?
⎢ ⎥
⎣ MN M?⎦
(14)
Because of the nature of the market construct with which we are dealing, it turns out that x* and
y* are attractor points under most circumstances. So long as the inverted matrix is not singular,
that is, so long as

ML MO ML MO
∙ − ∙ ≠0
MN M? M? MN

12
and we have reasonable starting values x and y, our iterative process should be stable and lead to
the correct solution rapidly.5

Newton-Raphson Method Exemplified:


We provide an example of how the Newton-Raphson method can solve an otherwise
intractable set of equations through its directed, iterative trial-and-error logic. The system we
consider is
L N, ? ln N + ln ?
O N, ? ?−N
(15)
We observe f*(x*, y*) =ln x* + ln y* = 5 and g*(x*, y*) = y* – x*2 = 4. Our problem is to hunt
for the x* and y* that produce these observed function values.
Carrying out the preliminaries, we obtain the following.
ML 1
≡ L]
MN N
ML 1
≡ LH
M? ?
MO
≡ O] −2N
MN
MO
≡ OH 1
M?
(16)

The equation system (14) can be solved using determinants based on the use of Cramer’s
rule, which is easy to compute in the case of two input variables. Written out in detail, this gives
us:

^_
^]
5
In our case, will represent the relationship between a securities price and the base-interest-rate parameter while
^`
^H
will represent the relationship between yield volatility and the shift parameter. Both of these are significant, first-
^_
^H
order effects. On the other hand, will represent the relationship between a securities price and the lattice shift
^`
^]
parameter and will represent the relationship between a yield volatility and the base-interest-rate parameter, both
of which are second order effects. Thus, a ∙ a≫a ∙ a.
^_ ^` ^_ ^`
^] ^H ^H ^]

13
MO ML
∙ cL ∗ N ∗ , ? ∗ − L N, ? d − ∙ cO∗ N ∗ , ? ∗ − O N, ? d
M? M?
N∗ N+
ML MO MO ML
e ∙ − ∙ f
MN M? MN M?

ML MO
∙ cO∗ N ∗ , ? ∗ − O N, ? d − ∙ cL ∗ N ∗ , ? ∗ − L N, ? d
? ∗
?+ MN MN
ML MO MO ML
e ∙ − ∙ f
MN M? MN M?
(17)

The way to proceed is (a) to pick a value for both x and y, (b) compute the partial
derivatives based on these selected x,y values, (c) compute the determinant D, which is the
denominator in the foregoing equations, (d) compute the values of the functions based on the
selected x,y values, (e) subtract the computed function values from the observed function values,
and (f) obtain the predicted difference between the input x,y values, and the predicted correct
values.
After this has been computed for the first step, we add the predicted differences to the
beginning and x,y values and carry out the foregoing procedure with these newly derived seed
values for x and y. This process is carried out for ten iterations in the following table.

14
Spreadsheet Example 1

g* – g(x,y)
Determinant f(x,y) g(x,y) f* –f(x,y) ∆xι
Step x y fx fy gx gy ∆yι
D
0 10 40 0.1 0.025 -20 1 0.6 5.99146 -60 -0.9915 64 -4.3191 -22.382

1 5.680892 17.61785 0.176029 0.056761 -11.362 1 0.820931 4.60602 -14.655 0.39398 18.65469 -0.8099 9.45277

2 4.870991 27.07062 0.205297 0.03694 -9.742 1 0.565170 4.88175 3.34406 0.11825 0.65594 0.16636 2.27664

3 5.037354 29.34725 0.198517 0.034075 -10.075 1 0.541810 4.99608 3.97232 0.00392 0.027676 0.00549 0.08303

4 5.042848 29.43029 0.198301 0.033979 -10.086 1 0.540998 5.00000 3.99997 4.6E-06 3.0E-05 0.00001 0.00010

5 5.042855 29.43038 0.1983 0.033978 -10.086 1 0.540998 5 4 6.2E-12 4.3E-11 0.00000 0.00000

6 5.042855 29.43038 0.1983 0.033978 -10.086 1 0.540998 5 4 0 0 0 0

7 5.042855 29.43038 0.1983 0.033978 -10.086 1 0.540998 5 4 0 0 0 0

8 5.042855 29.43038 0.1983 0.033978 -10.086 1 0.540998 5 4 0 0 0 0

9 5.042855 29.43038 0.1983 0.033978 -10.086 1 0.540998 5 4 0 0 0 0

10 5.042855 29.43038 0.1983 0.033978 -10.086 1 0.540998 5 4 0 0 0 0

15
In five iterations, we obtain the correct values of x and y that satisfy the observed values of the
function. Continuing past this point merely keeps predicting that no changes in input variables
x,y are needed to attain our targeted function values f* and g*.
The interesting thing about this example is that the seed values were x = 10 and y = 40,
which were quite far off from the correct values of x = x* = 5.042855 and y = y* = 29.43038.
Even in this instance, the correct values were approximated fairly well after only three iterations.
In the implementation of the basic BDT model, we will be able to provide “close” seed
values, typically by using the seed value Ri-1 and Ki-1 for the first iteration pass for Ri and Ki. The
only time this will not work is for the scaling parameter in period one; in computer code, we can
simply seed this value as K1 =1.25.

Newton-Raphson Method Implementation:


In obtaining the parameters for the basic BDT model, we must perform the foregoing
iterative procedure for each of the time periods – with the exception of the initial period, since, at
time i = 0, the one-period interest rate is known with certainty.
The following table is a schematic and is labeled to show how our method is
implemented according to the same schematic of the preceding table.

Spreadsheet Example 2

^0 ^0 ^g ^g
Deter-
P*(i+1) σ*(i+1)
^ : ^ : ^ : ^ :
minant P(i+1) σ(i+1) ∆ Ri
–P(i+1) –σ(i+1) ∆ Ki
Step Ri Ki D

⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮

16
The sequence in which the various table cells are obtained is this:
(a) Input seed values, Ri, Ki.
(b) Compute P(i+1) and σ(i+1) from the recursive lattice method described previously –
using the seed values given and taking into account that the R’s and K’s for all time
periods prior to i have already been computed.6
(c) Compute P*(i+1) – P(i+1) and σ∗(i+1) – σ(i+1) from the observed values of
P*(i+1) and σ∗(i+1) and the just computed values of P(i+1) and σ(i+1).
(d) Compute all four partial derivatives and the associated determinant, D.
(e) Compute the predicted ∆Ri, ∆Ki.
(f) Add the predicted ∆Ri, ∆Ki to the beginning seed values, Ri, Ki.
(g) Ri + ∆Ri and Ki + ∆Ki will be the seed values for the next iteration.
(h) Keep repeating the process until ∆Ri ≈ 0, ∆Ki ≈ 0.
The observant reader will note that we have not yet explained how to compute the partial
derivatives. We do not have a simple, algebraic formula as in our first table. However, we can
estimate the partial derivatives through the simple expedient of computing prices and volatilities
for values infinitesimally different from those obtained from the current iteration step seed value
and then apply the basic definition of a partial derivative. This numerical approximation of the
derivatives is expressed as follows where ε is a vanishingly small number:

M :+1 : + i, : − :, :

M : i
M :+1 :, : + i − :, :

M : i
M) : + 1 ) : + i, : − ) :, :

M : i
M) : + 1 ) :, : + i − ) :, :

M : i
(18)
From a practical perspective, when employing the basic BDT Model, we have the happy
result that both the price and volatility functions are monotonic in underlying variables Ri and Ki.
That is, none of the partial derivatives are zero. Because of this and the unlikelihood of the
determinant D being zero,7 the fundamental requirements of the Newton-Raphson method are
met. There are, however, two other important caveats.

6
This works because the first period rate, r0,0, is known with certainty and provides the starting point from which the
iteration process may commence.
7
As explained in an earlier footnote.

17
The first caveat is that, as in all iterative methods, it is possible for the predicted values of
the variables in question, to cross an asymptotic barrier at one or more steps in the iteration. This
would mean a predicted Ri ≤ 0 or Ki ≤ 1. In model implementation, a practical solution is to
add a numerical guardrail. This could be something such as:

“If the next predicted value of Ri in the iterative procedure is less than or equal to zero,
continue the next step of the iteration using half of the value obtained from the prior iteration;”
or

“If the next predicted value of Ki in the iterative procedure is less than or equal to one,
continue the next step of the iteration using half of the sum of (a) one plus (b) the value obtained
from the prior iteration.”

Adding such guardrails to program code slows down the iterative process by increasing
the number of computations at each step. The benefit is that the algorithm will be more robust in
obtaining solutions, even under unusual parameters and/or numerical inputs.
The second important caveat is that sufficiently choppy or erratic yield and volatility
curves can frustrate the Newton-Raphson method, particularly for shorter (more granular) time
intervals. For example, an interest rate lattice at quarterly intervals has the potential to be more
choppy than a lattice calibrated to annual intervals. This is not as big a problem with calibrating
observed prices as it is with calibrating observed volatilities, particularly if historical yield
volatilities are obtained during short historical periods where markets have behaved in an
anomalous fashion. The expedient for this situation is to utilize smoothed volatility curves,
where the volatility inputs for the iteration have been obtained from a polynomial or kernel
regression of observed volatilities against maturity.8

OPTIONAL SECTION: Turbocharging the Calibration of the Interest Rate Lattice


The calibration of the interest lattice can be sped up using a concept introduced by
Farshid Jamshidian (1991). He showed that the interest rate lattice can be used to create state-
space claims, each claim representing the current equilibrium price of a unit of currency to be
received at each particular node of the lattice.
At node i = 0, j = 0, i.e., node (0,0), we can define the price of the state space claim as:
jj , 1

8
A smoothing regression of prices versus maturity is similarly necessary, if the data is sufficiently perverse. In
liquid, active markets, this is not a likely or regular occurrence.

18
This must be the case since the value of a unit of currency with certainty at the present must
equal the value of a unit of the currency. In the subsequent period, there are two possible states
and we can determine their prices to be:

0.5 ∙ jj 0.5 ∙ jj
jj 9;k jj
, ,
,
1+ , ,
1+ ,

We can see that the price at time 0 of a certain dollar at time 1 must be the sum of these to state-
space claims.
1
1 jj + jj
,
1+ ,
, ,

since
0.5 ∙ jj 0.5 ∙ jj 0.5 ∙ 1 + 0.5 ∙ 1 1
jj + jj +
, ,
, ,
1+ , 1+ , 1+ , 1+ ,
1 ,

The explanation for these value relationships is that a holder of a state-space claim at node (0,0)
would be willing to pay no more for a node (1,0) claim than half of the current state space claim,
based on the probability of node (1,0) occurring, discounted at the one-period discount rate r0,0.
The similar logic applies based on the probability of node (1,1) being reached. In fact, by this
logic, we can determine the price of any node on the upper or lower boundaries of the interest
rate lattice, namely:

0.5 ∙ jj
jj
,
,
1+ ,

along the topmost nodes and


0.5 ∙ jj
jj
,
,
1+ ,

along the lowest nodes.

The state-space prices for time periods i = 2 or greater follow the same arbitrage principles as the
foregoing cases, but are slightly more complicated since, except along the upper and lower
boundaries of the lattice, there are two ways to reach a node from the preceding period. The
valuation equation for these interior lattice points is:

19
0.5 ∙ jj + 0.5 ∙ jj
jj
, ,
,
1 + ,l

This shows that a portfolio holding half of a state-space claim for node i – 1, j and half of a state
space claim for node i – 1, j – 1 effectively replicates the payoff of a state-space claim for node
i , j, discounted by the one-period interest rate.
The state-space claim approach helps us because it allows us to price a zero-coupon
security without having to use backward recursion all the to the origin. Instead, if the interest
lattice has been established through period i – 1, we can input seed values at each iteration step,
utilize the fact that all state-state prices have been calculated through i – 1, and then use the
foregoing relationships to create values for all the state-state claims at time i. It turns out that the
zero-coupon price for a bond maturing at period i is simply the sum of the state-space claims
across all possible up jump state, namely:

, : m jj n ,
n

(19)
In order to compute the yield volatility for securities of each maturity, we need to
compute two more sets of state-space prices from the lattice that furnished the prices in equation
(19). The first set is predicated on an up jump in interest rates in the first period. The second set
is predicated on a down jump in the first period. The method of obtaining state-space claim
values for both sets is the same as in the base case just outlined. The only difference is that the
final maturity will be one period shorter.
In the addendum to this paper, which contains programming code, the method of state-
space claim pricing is utilized. It is slightly more cumbersome to code than the straightforward
approach described in the previous section, but it is significantly more efficient to run.

20
SECTION II: INCORPORATING DEFAULT RISK INTO SECURITY PRICING
We turn next to the subject of valuing securities subject to default. In this section, we are
searching for a yield spread versus default-free securities. In common parlance, the entire yield
spread over benchmark/government bonds, or reference default-free securities, is referred to –
quite incorrectly – as a credit spread. In later portions of the paper, we will account for the other
factors in observed yield spreads. In Section II, we analyze only the impacts of credit default.
We state important caveats at the outset. The method we employ evaluates cash flows in
a strictly risk-neutral framework. Furthermore, in a simple model such as this, while we may
allow default rates – and recovery rates upon default – to vary over time, we are conceptually
limited by assuming they are independent of the level of the lattice rate in any time period.
The first shortcoming can be overcome by utilizing a default probability and loss
distribution that is adjusted from actual to risk-neutral, as is done in the case of option pricing.9
From a practical perspective, though, the differences between the two probability distributions
are not typically significant; in fact they vanish in theory if debt securities have little or no “risk
premium”, colloquially speaking, no beta versus risky, traded assets.
The second shortcoming, the assumed statistical independence of default rates and
interest rate levels, is inescapable in principle, but probably not too important in practice. Based
on the binomial process of the interest rate lattice, not much probability density occurs at either
very high or very low nodes. In any case, one can always run what-if scenarios to obtain a more
precise estimate of the impact.10

Estimating Default Risk and Recovery Rates Upon Default:


A simple framework for evaluating the likelihood and impact of default reflects default
and recovery rates that are known and constant over time, and that the underlying debt securities
are not callable prior to maturity. (These restrictions can be relaxed for actual implementation.
The time dependence of default and recovery rates should be evident; the question of call prices
will be addressed in a later section of the paper.)

that date is denoted q. By definition, 0 ≤ p ≤ 1. In the event of default, investors recover a


The unconditional default probability in any given period, assuming no default prior to

constant fraction, λ (0 ≤ q ≤ 1), of the current period coupon C and par value F. Thereafter, no
further payments are made by the issuer. Further, for computational ease, and rough

9
The reader can explore Cochrane (2005) and similar asset valuation texts for the concept of risk-neutral pricing and
risk-neutral probability functions.
10
If we suppose that default rates were higher along the highest boundary of the interest rate lattice, the cash flow at
some nodes will be dependent on the path taken to reach it. For example, the path uuuud would imply a greater
probability of default at node i = 5, j = 4 than if the node had been reached by duuuu. Our simple, recursive
valuation procedure can only work, if the cash flows at any node are independent of the path taken to reach the node.
Path-dependent models can adjust for such complexities, but they require an immensely greater amount of
computing resources and may not give a much better answer than the model we propose.

21
approximation of reality, defaults occur only on lattice node dates. (For simplicity, we posit that
coupons are paid on lattice node dates.)
The following table presents the default probabilities and cash flows between the present
time and the maturity date.

Spreadsheet Example 3

Cumulative
Probability Periodic
of NO Probability Cash Flow Probability
Default of Default Cash Flow if Default Weighted
Time thru AT if NO Occurs Cash Flow
Period Period End Period End Default
0
1 1-q Q C λ(C+F) q λ(C+F) + (1-q)C
2 (1-q)2 q(1-q) C λ(C+F) q(1-q) λ(C+F) + (1-q)2C
3 (1-q)3 q(1-q)2 C λ(C+F) q(1-q)2 λ(C+F) + (1-q)3C
4 (1-q)4 q(1-q)3 C λ(C+F) q(1-q)3 λ(C+F) + (1-q)4C
. . . . . .
. . . . . .
. . . . . .

M-1 (1-q)M-1 q(1-q)M-2 C λ(C+F) q(1-q)M-2 λ(C+F)


+ (1-q)M-1C

M (1-q)M q(1-q)M-1 C+F λ(C+F) q(1-q)M-1 λ(C+F)


+ (1-q)M (C+F)

22
As a practical benefit of this analysis and as a buttress to our intuition, discounting the
expected periodic cash flows, where the interest rates are a constant k, would give us the
following starting point:

1−p G 1 − p G pq + 1−p G
8466 me f + e f + me f
1+r 1+r 1−p 1+r
Gn Gn

(20)
The first two terms on the right-hand side can be seen as the discounted expected cash flows
from the debt security, if it lasts to maturity without defaulting. The last term on the right
represents the expected discounted value of cash flows assuming default occurs sometime during
the life of the security. An inspection of equation (20) indicates that a zero probability of default,
q = 0, returns the familiar equation for the price of a default-free debt security:

1 G 1 G
8466 me f + e f
1+r 1+r
Gn

Under our temporary assumption of a constant interest rate and constant unconditional
probability, we can rewrite equation (20) somewhat more compactly as:

1−p pq + 1−p 1−p


8466 e fs + t s1 − e f t+ e f
r+p 1−p 1+r 1+r

(21)

We see that the presentation in equation (21) also transforms into the familiar default-free bond
price equation if q = 0.11
The assumption of a constant unconditional default rate can be relaxed. It makes the
algebraic formulas messier, but it presents no serious problem for program coding. If we state the

11
We also note, incidentally, that in the absence of a final maturity, that is, if F = 0 and, if M→ ∞ in equation (21),
the equation is essentially the same as the familiar constant growth dividend discount model for common equities,
but with a negative growth rate. This is a useful way to think about perpetual preferred stocks or other analogous
securities, especially since for such securities the recovery rate λ has historically been very low.

23
periodic unconditional default rate as qi, then the probability of avoiding default through some
time period n can be expressed as:

u 2v v56 Gw2" `w G x1 n$ 1−p 1−p 1 − py ⋯ 1 − p$ 1 − p$

In compact notation, this is expressed as:


$

u 2v v56 Gw2" `w G x1 n$ { 1−p


n

(22)
The probability of default at period n is the unconditional probability in period n multiplied by
the probability that the security has not defaulted through period n – 1. Algebraically,

!1_5 6G 5G G x1 $ p$ ∙ { 1 − p
n

(23)
and note the difference in the limit of the product operator.

Integrating Default Risk into the Basic BDT Model:


The risk-neutral pricing method we have developed accommodates the modeling of
default. For securities not subject to redemption by the issuer prior to maturity, the process is
simple. At each node we input the probability-weighed cash flow rather than the contractual cash
flow.
Working backwards from maturity, this means that the terminal cash flow node is not
based on face value and contractual coupon, but on the probability of the security surviving until
maturity multiplied by the sum of face value and the contractual coupon. The other component to
consider at maturity is the probability of default in the final period multiplied by the recovery
rate multiplied by the sum of the contractual coupon plus face value. Algebraically, the final
period expected cash flow is:

, 1−p c , + d+p 1−p Dqc , + dE

(24)

24
Under the assumption of non-constant unconditional periodic default rates, the equation remains
conceptually simple, but somewhat more cluttered, namely:

, |{ 1 − p } c , + d + |p ∙ { 1 − p } Dqc , + dE
n n

(24)′

In the period preceding maturity, we employ equation (3′)

0.5 ∙ + 0.5 ∙
+
, ,
, ,
1+ ,

However, instead of using the contractual cash flow CM-1,j, we use the probability-weighted cash
flow at the node, which is represented as:

~c , d 1−p c , d+p 1−p Dqc , + dE

(25)
Inserting the expression for the expected nodal cash flow into the basic valuation equation, we
obtain:

, c 1−p c ,d+p 1−p Dqc , + dEd


0.5 ∙ + 0.5 ∙
+
, ,
1+ ,

(26)

25
Generalizing equation (26) to preceding periods and nodes, we finally obtain:

0.5 ∙ + 0.5 ∙
c 1−p c d+p 1−p Dqc + dEd +
, ,
, , ,
1+ ,

(27)

Or, in the case of non-constant periodic default rates – or even recovery rates – we can modify
equation (27) to:

, •€{ 1 − pG • c , d + €p ∙ { 1 − pG • Dq c , + dE‚
Gn Gn

0.5 ∙ + 0.5 ∙
+
, ,
1+ ,

(28)

At node (0,0) we assume that the cash flow due at that time has been paid without defaulting.
This results in the initial period valuations.

0.5 ∙ , + 0.5 ∙ ,
, ,
1+ ,
(29)

26
SECTION III: MODELING OPTIONALITY

Case 1 – Securities Not Subject to Default:


In our analysis of debt securities, the focus is the optionality embedded in the terms of the
securities themselves. Mainly, we mean those instances under which an issuer may redeem
outstanding securities, or those cases where investors can “put” a security back to an issuer, at
pre-specified prices. (The latter case is far rarer than the former.) Optionality may be found
secondarily in the determination of income payments at various nodes on the lattice.
We could, if we wished, also use a lattice model in the pricing of market-traded options,
including options on interest rate swaps (“swaptions”) and options on forward and futures
contracts. However, the Black-Scholes-Merton (BSM) models and their progeny are typically
faster and easier to run, since they only require the knowledge of short-term interest rates and an
implied price volatility input. Also, the maturities of such market-traded options are much
shorter than the comparatively longer time periods envisioned in the lattice model approach. On
the other hand, BSM models do not help with long-dated securities where there are many call/put
events that are dependent on a dynamic evolution of the lattice matrix.
Dealing with debt securities that are callable by the issuer on and after a specified date –
and at prices at or above par value – is easy in the case of securities not prone to default. We
adapt equation (3)′ as follows, where CPi denotes the price at which the issuer can redeem the
security on or after time period i.

0.5 ∙ + 0.5 ∙
+ ƒ:; ' , (
, ,
, ,
1+ ,

(30)

Equation (30) assumes the security issuer exercises its option to redeem in an economically
rational manner, that is, when the call price equals or is lower than the discounted expected value
of underlying security in the subsequent period.
Likewise, if the investor has an option to put the security back to the issuer at a pre-
specified price on and after a designated date, canonical equation (3)′ would be modified as
follows:
0.5 ∙ + 0.5 ∙
+ ƒ9N ' , (
, ,
, ,
1+ ,

(31)

27
In equation (31), PPi denotes the price at which the investor can require the issuer to redeem the
security on or after time period i.
Logically, then, if the investor had an option to put the security back to the issuer, subject
to the issuer’s option to redeem the securities, the values at the various the lattice nodes would
reflect this compound option, which assumes optimal economic behavior by both investors and
issuers.

0.5 ∙ + 0.5 ∙
+ ƒ9N sƒ:; ' , (, t
, ,
, ,
1+ ,

(32)
(As a practical note, when programming these formulas, it is often easiest to model the periods
where a security is non-callable, or not yet callable, with a redemption price 1000 times par
value. Likewise, periods where investor puts are not permitted could be modeled with a put
price equal to one-thousandth of par value.)
Turning now to coupon flows, we find that embedded options can arise if the coupons are
not (a) constant over the life of the security or (b) not determined solely as a function of the
passage of time.12We are thus addressing the case where coupons are determined directly or
indirectly by the number of up or down jumps at a given date. A generalized description would
be:

, ≡ L :, „

(33)
In many cases, equation (33) describes the provisional coupon, Ĉi,j, since the actual coupon
might be subject to a cap, which we denote as ULi,j , or floor, which we denote LLi,j. (UL can be
thought of as upper limit and LL as lower limit.) An upper limit is essentially an option to give
up potentially high future lattice node rates, while a lower limit is effectively an option to be
protected from very low future lattice node rates. With these definitions in hand, we generalize
equation (33) as:

, ≡ ƒ:;Dƒ9N …… , , L :, „ , †… , E

(34)

12
This second instance might arise in so-called step-up or step-down coupon profiles.

28
Alternatively, we can think of equation (34) thus:13

, ≡ ƒ:;Dƒ9N c…… , , ‡ , d, †… , E

(34)′

Plugging this definition back into the highly generalized equation (32)

, ƒ:;Dƒ9N c…… , , ‡ , d, †… , E
0.5 ∙ + 0.5 ∙
+ ƒ9N sƒ:; ' , (, t
, ,
1+ ,

(35)

For default-free securities, we have all we need. Equation (35) will give us a valuation for
any type of debt security, once we have created a lattice as described in Section I.

Case 2 – Securities with Risk of Default:


The analysis for default-prone securities integrates what we learned in Section II with
what we have learned so far in Section III. We start by repeating equation (27):

0.5 ∙ + 0.5 ∙
c 1−p c d+p 1−p Dqc + dEd +
, ,
, , ,
1+ ,

(27) repeated
In the case of a security that is callable by the issuer, we can make the default-adjustment
modification as follows:

13
Of course, when the lower limit, the upper limit, and each node’s cash flow are the same, we simply have an
equation that reduces to a fixed rate, that is:

, ≡ …… , , ‡, †… ,

29
, c 1−p c , d+p 1−p Dqc , + dEd
0.5 ∙ + 0.5 ∙
+ ƒ:; ' 1−p , (
, ,
1+ ,

(36)
In this instance, the call price at time i, CPi, needs to be “deflated” by multiplying it by the
probability that the issue has not yet defaulted. This is an explicit adjustment whereas the values
in the parenthetic expression to the right of it implicitly reflect the probability of default and
survival.
A generalized formula, which allows for investor puts to the issuer, can similarly be
obtained in the same way that we derived equation (32), namely:

, c 1−p c d+p 1−p


, Dqc , + dEd
0.5 ∙ + 0.5 ∙
+ ƒ9N sƒ:; ' , 1 − p (, 1−p t
, ,
1+ ,

(37)
Before leaving this topic, we note once again that, although these formulas may look forbidding,
they are easily programmed into recursive subroutines.

OPTIONAL SECTION: Analysis of Floating Rate Notes, Caps, and Floors


In this optional section, we see how to structure a floating rate note designed to price to
par value, i.e., unity, at each lattice node. For the sake of discussion, we think of the interest rate
lattice here as reflecting a default-free lattice of the highest quality bank obligations.14 We will
then apply our findings to the pricing of interest rate caps and floors, which are not as well
modeled by the Black-Scholes-Merton type of options.

Construction of Par-Priced Floating Rate Notes:


In a floating rate note designed always to price at par, our first guess is that the coupon at
each node must be set equal to the lattice rate at that node. This is a good guess and not too far
off. However, it is not correct.

14
Up to now, we have been using at the lattice to reflect the prices and discount rates of government securities.
Since the taxation of government securities is often favored, a separate lattice for the LIBOR/swap curve suits our
analysis in this section.

30
To illustrate the correct approach, we use an example of a floating rate note that matures
at the end of period four. This allows us to see the problem in a tangible way – but with
sufficient generality – that we will be able to formalize a coupon-setting rule when we are done.
Par value at maturity is assumed to be unity. Coupons will thus be understood as being in
decimal form.
For maturity at M = i = 4,

ˆ,ˆ ˆ,ˆ +1

ˆ,y ˆ,y +1

ˆ, ˆ, +1

ˆ, ˆ, +1

ˆ, ˆ, +1

We wish to find a formula for selecting coupons such that the expected price of the debt security
is par at each earlier node. For the penultimate time period, we obtain the following.

0.5 ∙ + 0.5 ∙ ˆ,y 0.5 ∙ c ˆ,ˆ + 1d + 0.5 ∙ c + 1d


+
ˆ,ˆ ˆ,y
y,y y,y
1 + y,y 1 + y,y
1 + 0.5 ∙ c ˆ,ˆ + ˆ,y d
y,y +
1 + y,y
In the same manner

0.5 ∙ + 0.5 ∙ 1 + 0.5 ∙ c + d


+ +
ˆ,y ˆ, ˆ,y ˆ,
y, y,
1 + y, y,
1+ y,

0.5 ∙ + 0.5 ∙ 1 + 0.5 ∙ c + d


+ +
ˆ, ˆ, ˆ, ˆ,
y, y,
1 + y, y,
1+ y,

0.5 ∙ + 0.5 ∙ 1 + 0.5 ∙ c + d


+ +
ˆ, ˆ, ˆ, ˆ,
y, y,
1 + y, y,
1+ y,

Summing up:
0.5 ∙ + 0.5 ∙
+ + 1+
ˆ, ˆ,
y, y,
1+ y,
y, y, y,

31
which can be restated as:

0.5 ∙ + 0.5 ∙
1
ˆ, ˆ,
y,
1+ y,

With our assumption from above, this is the same as:

0.5 ∙ c1 + d + 0.5 ∙ c1 + d
1⇒
ˆ, ˆ,
1 + y,

1 + 0.5 ∙ c ˆ, + d
1⇒
ˆ,
1 + y,

ˆ, + ˆ, 2 y,

This is an interesting set of conditions, which we will now write out completely:

ˆ,ˆ + ˆ,y 2 y,y

ˆ,y + ˆ, 2 y,

ˆ, + ˆ, 2 y,

ˆ, + ˆ, 2 y,

We note that there are five coupons to be determined, but there are four equations; we can view
this as being an under-identified system or, alternatively, as a system with one degree of
freedom. Since lattice node rates scale multiplicatively, while the foregoing “average coupon”
formula is arithmetic, we might approach the problem recursively, as follows:

ˆ, ˆ, y,

ˆ, 2 y, − ˆ, 2 y, − y,

ˆ,y 2 y, − ˆ, 2 y, − c2 y, − y, d 2 y, −2 y, + y,

ˆ,ˆ 2 y,y − ˆ,y 2 y,y − c2 y, −2 y, + y, d 2 y,y −2 y, +2 y, − y,

Continuing in the same manner, we now derive period three coupons from period-two price
constraints.

32
0.5 ∙ + 0.5 ∙
+ + 1+ ⇒
y, y,
, ,
1+ ,
, , ,

0.5 ∙ + 0.5 ∙
1⇒
y, y,
1+ ,
,

0.5 ∙ c + d + 0.5 ∙ c + d 1 + 0.5 ∙ c y, + d


1⇒
y, y, y, y, y,
1+ , 1+ ,

y, + y, 2 ,

From this equation for period-3 coupons, we obtain:

y,y + y, 2 ,

y, + y, 2 ,

y, + y, 2 ,

In this instance, we face the same problem as for period-4 coupons, four variables and only three
equations. Once again, we can try this recursive approach of setting the two lowest coupons
equal to the lowest lattice node for the preceding time period.

y, y, ,

y, 2 , − y,

y,y 2 , − y,

By the same logic,

, + , 2 ,

implying

, + , 2 ,

, + , 2 ,

So that:

, , ,

33
, 2 , − ,

Finally, we must have

, , ,

The coupons at the two lowest nodes for any period are thus set equal to each other and
to the lowest lattice node interest rate of the preceding period. The rest are determined
recursively.15 This general method of selecting coupons for the purpose of creating a floating-
rate, default-free debt security with an expected stripped value of par at each node is thus
generalized as:

, , ,

, 2 , − ,

,y 2 , − ,

, 2 , − ,

(38)

Valuation of Interest Rate Floors and Caps:


We have developed the tools for valuing cash flows at any node on the lattice including
where there is explicit or implicit optionality in the forms of maximum and minimum coupons.
Interest rate floors or caps are easily valued in this framework. Such derivative instruments are
typically found in the context of the LIBOR/swap curve, which is the context in which we
previously valued floating rate notes. In the case of an interest rate floor, the writer of the floor
agrees to pay (and the buyer stands to receive), if positive, the difference between the agreed
upon floor rate and the coupon on the floating rate note. In the case of an interest rate cap, the
writer of the cap agrees to pay (and the buyer stands to receive), if positive, the difference
between the coupon on the floating rate note and the agreed upon cap rate.

15
There is, as we have shown, one degree of freedom for the coupons at any time period greater than period one.
Thus, we could just have easily set the two highest coupons equal to the highest lattice rate, ri,i. We could even have
picked the two middle coupons at any point and set them equal and then solved for the remaining coupons with
standard linear algebra methods. The method we have employed is simple, adequate, and easy both to understand
and to program.

34
The node cash flow for a floor, from the perspective of a buyer, is expressed
algebraically, where FRN_Ci,j denotes the coupon of a floating rate note priced to par value at
each node and FloorRate denotes the initially contracted constant benchmark rate over the life of
the floor contract, as:

BAA , ƒ9Nc BAA 9C= − Š_ , , 0d

(39)
Likewise, the cash flow for a cap, from the perspective of a buyer is defined as:

9 , ƒ9Nc Š_ , − 9 9C=, 0d

(40)

We can use our interest rate lattice, along with the specification of cash flows at the
nodes, to determine the value of a floor or cap option. Let us define Floor_Wi,j as the value of the
floor option at node i,j. In the final period, M, we have the following for all j =0 to j = M:

BAA _ , BAA , ƒ9Nc BAA 9C= − Š_ , , 0d

For the preceding period,


0.5 ∙ BAA _ + 0.5 ∙ BAA _
BAA _ BAA +
, ,
, ,
1+ ,

In general,
0.5 ∙ BAA _ + 0.5 ∙ BAA _
BAA _ BAA +
, ,
, ,
1+ ,

(41)
and, finally,
0.5 ∙ BAA _ + 0.5 ∙ BAA _
BAA _
, ,
,
1+ ,
(42)

35
By the same logic, we can obtain the cap equations:

Cap value at maturity,

9 _ , 9 , ƒ9Nc Š_ , − 9 9C=, 0d

Cap value on interior time periods of lattice,

0.5 ∙ 9 _ + 0.5 ∙ 9 _
9 _ 9 +
, ,
, ,
1+ ,

(43)
Cap value at present,

0.5 ∙ 9 _ + 0.5 ∙ 9 _
9 _
, ,
,
1+ ,
(44)

The model can be tested by applying the analog of the put/call parity theorem applicable
to the pricing of options on securities and futures. Under put/call parity, purchasing a put option
and writing a call option of the same exercise price and the same expiration date, when coupled
with the purchase of the underlying security, must create a risk-free position that must be priced
at the applicable short term interest rate. Starting from that point, we can deduce that with the
four legs of cash, put option, call, option, and underlying security, any of the legs can be
replicated by a position in the other three legs.16 In our case, we can employ floating rate notes,
caps, floors, and fixed rate notes in such a manner that any three of the legs can replicate the
fourth.

16
Cash plus a call with a written put ≡ purchasing the security;
Security plus a put with a written call ≡ cash equivalent;
Security plus a put less cash ≡ long call position;
Cash plus a call with security sold short ≡ long put position.
Reverse signs to obtain, respectively, selling a stock short, borrowing risk free, writing a call, writing a put.

36
Application 1 – Creating a Synthetic FIXED Rate Note: Own a Floating Rate Note, Write a Cap, Buy a Floor
(Cap and Floor Rates Equal)

For example, with the same maturity/expiration dates and where the floor rate and cap rates are
equal, we can construct a synthetic fixed rate security by writing a cap, purchasing a floor, and
owning a floating rate note. At maturity, the face value received for the floating rate note is the
same as for a fixed rate security. At each point along the way, the cash flow is the sum of the
floating rate note coupon and the floor cash flow less the cash paid out in the cap that has been
written. In equation form, this is:

AƒŒ:;=k_ , Š_ , + BAA , − 9 ,

We may substitute the definitions from equations (37) and (38).

AƒŒ:;=k_ ,
Š_ ,+ ƒ9Nc BAA 9C= − Š_ , , 0d
− ƒ9Nc Š_ , − 9 9C=, 0d

Because we set the floor rate equal to the cap rate, which we call FixedRate, then
AƒŒ:;=k_ ,
Š_ ,+ ƒ9Nc :N=k 9C= − Š_ , , 0d
− ƒ9Nc Š_ , − :N=k 9C=, 0d

We note that if the floating rate exceeds the FixedRate, the position will receive the floating rate
coupon and pay out the difference between the floating rate coupon and the FixedRate. The
combined cash flow thus receives the FixedRate for all coupons on the floater in excess of the
FixedRate. Conversely, if the floating rate is less than or equal to FixedRate, the position will
receive the floating rate coupon plus the positive difference between the FixedRate and the
floating rate coupon. The combined cash flow thus receives the FixedRate for all coupons less
than or equal to the FixedRate. In all circumstances, the net position is receipt of a fixed rate that
will be valued along the lattice as would any fixed coupon security.

37
Application 2 – Creating a Synthetic FLOATING Rate Note: Own a Fixed Rate Note, Buy a Cap, Write a
Floor (Cap and Floor Rates Equal)

With the same maturity/expiration dates and where the floor rate and cap rates are equal, we can
construct a synthetic floating rate security by purchasing a cap, writing a floor, and owning a
fixed rate note. We use the same logic as in Case 1, but starting with a different coupon, set to
FixedRate, and with different signs on the positions for floor and cap cash flows, namely:

AƒŒ:;=k_ , :N=k 9C= − BAA , + 9 ,

Using the definitions already on hand,

AƒŒ:;=k_ ,
:N=k 9C= − ƒ9Nc :N=k 9C= − Š_ , , 0d
+ ƒ9Nc Š_ , − :N=k 9C=, 0d

Following the same approach as in Application 1, we see that the combined cash flow at all
lattice nodes is the same as the floating rate node cash flow – and must therefore be valued
accordingly.
The reader is encouraged to consider what other kinds of payoffs can be created using
caps and floors in connection with both fixed and floating rate debt securities of the same
maturity. Of special interest are the cases where cap and floor rates are set above and below –
and how far above and below – initial period floating rate coupon rates.

SECTION IV: UTILIZING OPTION ADJUSTED SPREADS (“OAS’s”)


We introduce here the concept of the option adjusted spread. While lacking the rigor and
theoretical basis of the basic BDT model, the concept of the OAS provides robust, practical
applications. By OAS, we mean an increment (or decrement) to the one-period interest rate at
every node on the lattice. For a particular security, this means that the basic valuation equation
(3)′ is transformed into:

0.5 ∙ + 0.5 ∙
+
, ,
, ,
1+ , + •Žj

(45)

38
All the valuation equations can be similarly adjusted. For instance, the highly general equation
for a default-prone security with issuer call provisions and investor put options, equation (37),
needs one simple revision to become:

, c 1−p c d+p 1−p


, Dqc , + dEd
0.5 ∙ + 0.5 ∙
+ ƒ9N sƒ:; ' , 1 − p (, 1−p t
, ,
1+ , + •Žj

(46)

We address now, in turn, the use of the OAS approach, the way to determine an OAS,
and the drawbacks of OAS analysis.
Since the OAS can be positive or negative, any fixed income security can be valued
relative to the default-free zero-coupon yield curve.17 What this means is that we can find the
unique OAS that values a particular security at its currently observed market price. Alternatively,
we can input an OAS we believe should be appropriate and compare the resulting valuation with
the currently prevailing market price.
If an OAS is positive, cash flow values at every lattice node will be discounted at a higher
one-period interest rate – and the resulting security value at the node correspondingly lower – as
compared with the basic BDT Model (in which the OAS is zero.) Under normal circumstances,
OAS’s will typically be greater than zero, since the lattice node is constructed from those
securities (i) of the highest credit quality and liquidity and (ii) which usually benefit from other
regulatory and tax treatment.
We also consider circumstances where the OAS is negative. In the USA, securities issued
by state and municipal governments are not subject to personal income tax. In such cases, the
pre-tax yields to maturity might be lower than benchmark Treasury securities because the after-
tax yield to an investor is higher on account of favored income tax treatment. (A similar
circumstance may arise with preferred stocks, since corporate holders of such securities in the
USA pay tax on such holdings at only a fraction of regular corporate tax rates.) 18 A negative
OAS could also arise in the case where an investor’s expected default and loss risks are higher
than what is implicit in market prices. This last instance could arise where a security’s quoted
yield spread over government securities is less than the product of the annual unconditional

17
In the USA, this will typically be the zero-coupon yield curve implied by current-coupon “on the run” Treasury
Notes and Bonds.
18
An alternative way of dealing with so called “muni” securities is to create an interest rate lattice from the highest
quality benchmark tax exempt bonds and then to compute OAS’s versus this lattice. Such a method would not work
with preferred stocks, though, since both individuals and corporations invest in such securities and their respective
tax treatments are much different from each other.

39
default probability multiplied by the loss rate on default. While in the case of tax-exempt bonds
and preferred stocks the negative OAS could be reasonable, in the case of a taxable bond where
the yield spread is insufficient to account for default risk, the resulting negative OAS simply
means the security is over-valued relative to underlying fundamentals.
A record of OAS’s for a universe of securities, both cross-sectionally and over time, can
provide insights into the relative value relationships of such securities and, also, into the stability
and validity of the BDT model itself. To produce such a data base, at regular intervals and,
perhaps, also, after significant changes in the benchmark/Treasury market, OAS’s can be
obtained after (a) fitting the then newly recalibrated BDT lattice and (b) attempting to find the
OAS’s that set model values to observed prices. The author’s experience is that such time series
for OAS’s exhibit the features one would expect, such as high correlation across industry groups,
consistency versus credit ratings, stationarity, and a high degree of independence relative to the
overall level of interest rates and the shape of the Treasury yield curve.
We have not yet answered how to obtain the OAS implied in observed market prices. We
must obtain them by numerical trial and error. In this instance, it is much easier than the trial-
and-error technique necessary in calibrating the interest rate node lattice. This is because we are
only searching for one variable satisfying one condition, as opposed to the two variables
satisfying two conditions. Consequently, we only need the first of the two equations in equation
systems (10) and (11) from above and we can omit all mention of the second variable y. This
gives us:

ML
ΔL ≈ ∙ ΔN
MN
ML ∗
L∗ N∗ − L N N −N
MN
(47)
which results in the iteration framework:

L∗ N∗ − L N
N∗ N+
ML
MN
(48)

In our case, we can relabel equation (48) as

40
9 r=C :<= − 9B<•B9C=k :<= •; •C•Žj
&9 O=C•Žj ∗ •; •C•Žj +
M 9B<•B9C=k :<=
M •; •C•Žj

(48)′
As with the two-variable trial-and-error method for lattice node calibration, our search for
the correct OAS is hindered by lack of a simple formula for computing the partial derivative in
the denominator of the foregoing equation. Once again, though, we may use the numerical
technique outlined in equation system (18), which was based on computing security prices at two
input OAS’s that are insignificantly different (ε → 0), i.e.:

M 9B<•B9C=k :<= •; •C•Žj + i − •; •C•Žj



M •; •C•Žj i

(49)

This iterative method will work so long as the numerically computed partial derivative does not
equal zero. (If it were to equal zero, we would be dividing by zero in equations (48) and (48)′.)
Because the relationship between CalculatedPrice and OAS is almost always monotonically
negative, i.e., higher OAS implies lower calculated price, we have a finite, non-positive partial
derivative in all but a few cases.
The few exceptional cases arise when a security is currently either callable by the issuer
or may be put back to the issuer by the investor. In these cases, there may not be a monotonic
relationship between computed price and OAS. In the case of a callable security, the reason is
that once the OAS falls to the point where the computed price equals the issuer call price, any
lower OAS will still result in a computed price no higher than the call price. A similar effect
happens in the other direction, if the security is currently subject to put by the investor; past a
certain point, a higher OAS does not cause the computed price to decline below the put price. In
these two cases, current period callability or the ability to put, the computed price will not be
affected over large ranges by changes in OAS inputs. This is just another way of saying the
partial derivative is zero for those certain ranges of OAS inputs.
In order to find the part of the range where there is a monotonic relationship between
computed price and OAS, the solution is to provide a “close” initial seed value for the OAS and,
as needed, to employ programming guard rails in the iteration whenever a price above call price
(or below put price) results.

41
We move at last to the drawbacks of OAS analysis. Foremost is that such analysis lacks a
theoretical underpinning. Second, the idea that the OAS is constant across all time periods and
for all interest rate levels is artificial and unrealistic. In answer to the first criticism, all we can
say is that it provides useful and understandable results. In answer to the second, we can take
some comfort in that the bulk of the probability mass over time is in the center of the lattice
where the idea of constant OAS’s is not too far off the mark. In further answer to the second
criticism, there is always the expedient of scaling the OAS to the level of interest rate at any
node. One could fashion a relationship such as:

•Žj , 9, +Œ ,

(50)
Given the robustness and comprehensive usefulness of the constant OAS formulation, the
approach in equation (50) might not be worth the additional effort. In addition, it might detract
somewhat from easy comprehension and time-series stationarity of fitted OAS’s. Finally, there
is much to be said with keeping the number of model parameters to a minimum. Assuming all
this is correct, equation (50) is probably not a useful approach.
Overall, the basic OAS approach is similar to the MRE’s (“meals ready to eat”) given
American troops in combat. While not high cuisine, they are nutritious, easy to store and
transport, and can be eaten almost anywhere. They would be no-one’s first preference, but, in the
environments where they are needed, they are everyone’s go-to choice.

SECTION V: SENSITIVITY ANALYSIS


A financial model is useful insofar as it helps us understand data and make meaningful
predictions. In addition to obtaining time series and cross-sectional data on OAS’s – as discussed
in the preceding section, our model can be tested through various forms of sensitivity analysis.
Sensitivity analysis arises when we step outside our model and ask such things as: How will
prices be affected by changes in the level, slope, or curvature of the benchmark yield curve?
How will prices be affected by assumptions about the volatility of the benchmark yield curve?
How will prices be affected by changes in perceived default risk? How will prices change to
reflect OAS fluctuations?
Stepping outside the model is perhaps questionable theoretically. After all, the model
tells us exactly what its best guess of the future is at any point in time. While this is well and
good, it still prompts us to ask, what might things look like tomorrow if the benchmark yield
curve, volatility curve, default assumptions, and relative pricing factors (OAS’s) are different
from what they are today? These are questions that can be raised with the reasonable degree of
skepticism with which any model should be approached. Such skepticism reminds us that no

42
model is perfect and that a good model exists not as a crystal ball, but as a means to help us make
investing decisions and to analyze the consequences of such decisions in retrospect.
The first look at model results is contained in the following two tables. They are
predicated on the starting yield and volatility curves contained in an addendum to this paper. The
other inputs, i.e., default probabilities, recovery rates, assumed OAS, and issuer redemption
provisions, are contained in the tables themselves. In both tables, we attempted to find the
current coupon rate required to set the initial debt security price to par value. This exercise was
carried out for securities having, five-, ten-, twenty-, and thirty-year maturities, respectively. In
the first table, the securities are not callable over the lives of the issues. In the second, all
securities are callable in five years at par value. The computations of duration and convexity
were obtained numerically by shifting the current-coupon benchmark/Treasury yield curve both
up and down by 10 basis points at all maturities.19
The first table is arranged whereby the securities have increasing default risk and default
severity, moving from left to right. Actually, the left-most column corresponds to the benchmark
Treasury securities, hence the zero default risk and zero OAS. As default risk is introduced in
columns moving to the right, positive OAS values are assumed. We see that higher coupons are
required to obtain par pricing as we move from left to right for all debt maturities. Of note, the
difference between any security’s par coupon and the par coupon of the default-free benchmark
Treasury security on the far left can be well approximated by the following formula:

A• A; j =9k A‘= & =9’• ? “=;<ℎƒ9 r


≈ •Žj + Ž;;•9B •=L9•BC AŒ9Œ:B:C? N 1 − =<A‘= ? 9<C:A;
(51)

This formula is a useful rule of thumb for non-callable securities. It also gives us some
confidence that the complicated lattice method provides intuitively satisfying results. Naturally,
one might ask whether all the complications were necessary to obtain this straightforward result.
For this particular purpose, the answer is probably “no”. However, as we have discussed, the
lattice method is most useful when attempting to measure the impact of optionality, whether in
the form of variable income streams, issuer call options, or investor put options. We will see this
concretely in the following table, especially when we consider the measurement of duration and
convexity.

1 c HGx ∆ − HGx ∆ d
19
Modified duration defined, where ∆ = .001% = 10 basis points:

• −
2∆ HGx

1 c HGx ∆ + HGx ∆ − 2 HGx d


Convexity was computed as:

∆ HGx

43
The first thing we see in Table 2 is that the 30-year callable Treasury par coupon is 133
basis points above the 5-year.20 In the absence of issuer callability, the difference was a lesser, 75
basis points in Table 1.21 The incrementally higher coupon – versus Table 1 – for all Treasury
maturities greater than the 5-year (where “non-call 5” is the same as the bullet 5-year maturity in
Table 1) represents the extra compensation investors demand for their having sold a redemption
option back to the issuer. The second thing we notice in Table 2 is that rule of thumb equation
(51) is much less useful in predicting par coupon spreads over the corresponding default-free
Treasury. The final thing we notice is that callability causes a significant decline in duration and
convexity, in many cases causing convexity to become negative.
In both Tables 1 and 2, we note that duration, for any maturity, declines as default
risk/severity and OAS’s rise. This makes sense since the likelihood of default means cash flows
are expected to occur earlier than contractually specified. It also makes sense to the extent that
the higher OAS’s raise the effective discount rate. Last, it is logical that durations are lower
overall in Table 2, compared with Table 1 counterparts, since the introduction of issuer
callability also means that probability-weighted cash flows will occur earlier than those set
contractually.
As noted, Table 2 versus Table 1 comparisons show convexity that is smaller or even
negative. The existence of issuer call options explains this. Absent issuer call, the plot of price
versus both up and down shifts in the Treasury yield curve produces a convex curve. In effect,
this means that using the duration measure will under-predict the price as the underlying yield
curve shifts in either direction. However, the presence of an issuer call option limits the upside to
prices under low interest rate scenarios. This works against – and, in certain circumstances, -
negates – the underlying convexity factor.22

20
Computed as 4.08% – 2.75%.
21
Computed at 3.50% – 2.75%
22
The reader might wish to consider how an option to put, held by an investor, works in the opposite direction of an
issuer call option.

44
Results Table 1. Comparative Data for NON-Callable Fixed-Rate Bonds

NON-CALLABLE/FIVE YEAR MATURITY


Coupon 2.75% 3.40% 3.76% 4.59%
OAS (b.p.) 0 50 50 75
Price 100.00% 100.01% 100.00% 100.03%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 4.61 4.50 4.46 4.38
Convexity 26.44 25.52 25.18 24.58

NON-CALLABLE/TEN YEAR MATURITY


Coupon 3.00% 3.645% 4.01% 4.83%
OAS (b.p.) 0 50 50 75
Price 100.00% 100.00% 100.05% 100.03%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 8.52 8.13 7.96 7.71
Convexity 86.91 81.30 78.96 75.31

NON-CALLABLE/TWENTY YEAR MATURITY


Coupon 3.25% 3.885% 4.24% 5.055%
OAS (b.p.) 0 50 50 75
Price 100.00% 100.02% 100.04% 100.04%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 14.46 13.26 12.74 11.99
Convexity 263.80 232.68 219.49 200.60

NON-CALLABLE/THIRTY YEAR MATURITY


Coupon 3.50% 4.110% 4.45% 5.25%
OAS (b.p.) 0 50 50 75
Price 100.00% 100.03% 100.01% 100.04%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 18.05 16.06 15.20 14.03
Convexity 447.47 374.93 345.02 304.33

45
Results Table 2. Comparative Data for Fixed-Rate Bonds Callable in 5 Years at Par

CALLABLE/FIVE YEAR MATURITY


Coupon 2.75% 3.40% 3.76% 4.59%
OAS (b.p.) 0 50 50 75
Price 100.00% 100.01% 100.00% 100.03%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 4.61 4.50 4.46 4.38
Convexity 26.44 25.52 25.18 24.58

CALLABLE/TEN YEAR MATURITY


Coupon 3.50% 4.255% 4.67% 5.585%
OAS (b.p.) 0 50 50 75
Price 100.02% 100.01% 100.02% 100.01%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 6.38 6.13 5.82 5.37
Convexity 51.65 44.29 -344.04 37.93

CALLABLE/TWENTY YEAR MATURITY


Coupon 3.83% 4.52% 4.90% 5.765%
OAS (b.p.) 0 50 50 75
Price 100.02% 100.04% 100.00% 100.01%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 7.91 7.05 6.75 6.52
Convexity -118.83 -208.78 68.64 62.53

CALLABLE/THIRTY YEAR MATURITY


Coupon 4.08% 4.71% 5.065% 5.895%
OAS (b.p.) 0 50 50 75
Price 100.01% 100.01% 100.00% 100.03%
Annl. Unconditional Default Probability 0.00% 0.50% 1.00% 1.50%
Recovery Rate Upon Default #N/A 70% 50% 30%
Mod. Duration 8.47 7.89 7.58 6.84
Convexity 49.53 72.51 -66.48 -172.84

46
We can visualize the relationships between and among changes in interest rates and
OAS’s for bonds of differing maturities, call provisions, and coupons. Rather than attempt an
exhaustive pictorial display, we content ourselves with two bookend cases: (a) a non-callable,
default-free security with zero OAS and (b) a debt security callable in five years at par, which is
highly exposed to default and which has a high OAS.23 We present the results for 30-year
maturities, since this reflects the greatest impact for call provisions, default loss potential, OAS
sensitivity, and interest rate exposure, as compared with the shorter maturity debt securities we
have considered.

Chart 1. Price Sensitivity of Default-Prone, Callable Bond to Yield Curve Shifts and OAS

23
The assumptions for the default-prone chart reflect a debt security that would be rated below investment grade,
perhaps BB/Ba. The low recovery rate on default would be typical of a non-secured debt obligation.

47
Chart 2. Price Sensitivity of Default-Free, Non-Callable Bond to Yield Curve
Shifts and OAS

(Please note that the vertical scale and the OAS axis scales are different in Chart 2 from those of
Chart 1.)

In both Charts1 and 2, the price of the security is plotted versus parallel shifts in the
current-coupon Treasury yield curve. Prices are simultaneously plotted versus a 200 basis point
range of possible OAS’s. It is important to note the difference in vertical scales; the price of the
non-callable, default free security varies from 70% to 150% of par whereas the risky, callable
security ranges in price from around 80%-115% of par. Most notably, the effects of convexity
can be seen in the shapes of the pricing surfaces. Holding either OAS or interest rate constant,
the line traced out would be a frown (negative convexity) in Chart 1 and a smile (positive
convexity) in Chart 2.
Although we have not mentioned it thus far, we can speak of price convexity with respect
to OAS in the fashion analogous to Treasury yield curve changes. Where issuer call options

48
come into play, the price upside owing to a lower OAS is limited in the same manner that price
upside is limited by a decline in overall interest rates. Issuer call options either diminish OAS
convexity or cause it to become negative – as in the Chart 2 example.
There is no limit to the number of “what if?” questions to be asked. Any number of
scenarios can be generated based on altering the model inputs. We might be interested in changes
in the shape of the Treasury yield curve, changes in assumed yield curve volatility, and changes
in default risk and OAS’s. We commend such study to the reader and practitioner.

Section V Postscript: Volatility Considerations


Sensitivity analysis provides useful insights, which can and should be supplemented by
applying subjective or objective probability analysis. There is no one right way to do this, but the
exercise itself provides a systematic way of approaching investment decisions. Such analysis
helps us think in terms of the classical return versus volatility paradigm. Or we may also think of
this as a risk budgeting or value-at-risk approach.
By definition, the variance in the percentage price changes for any security – or portfolio
– can be decomposed as:
Variance Arising from
• Parallel shifts in the Benchmark/Treasury yield curve
• Shifts in the slope of the Benchmark/Treasury yield curve
• Shifts in the curvature of the Benchmark/Treasury yield curve
• Changes in the volatility of the Benchmark/Treasury yields
• Changes in Option Adjusted Spreads (OAS’s)
• Changes in default loss probabilities
• Changes in recovery rates upon default
• Interactions among and between the foregoing items, as measured by
correlations
In the presence of issuer call provisions, investor put options, caps or floors on interest rates, or
non-zero default likelihoods, the probability distribution of price changes will become
asymmetric, that is, skewed.
There are any number of ways to create probability distributions in the context of the
extended model presented in this paper. Monte Carlo simulation analysis, based on historically
observed relationships in underlying valuation factors, springs to mind. Another possibility is
scenario analysis, where we form a limited number of scenarios, assume realistic input estimates,
and assign a probability to each scenario. This latter method is considered passé owing to its
subjectivity and its inherent inability to consider a wide enough range of possibilities.
Acknowledging these shortcomings, we nevertheless note two benefits. The first is that the

49
exercise itself provides insight and intuition on valuation factors. The second is that it prepares
investors not to be as surprised and panicked when the future, as it almost always does, turns out
to be different from a mere continuation of present conditions!

SECTION VI: CONCLUDING REMARKS


We have presented a model that allows us to make informed comparisons between and
among different debt securities. This is owing to a systematic and consistent method of obtaining
relative valuations. Of additional importance is the framework for comparing how securities
should be priced under different scenarios of interest rate movement and occurrence of default.
The comparison framework is useful both within the context of the basic BDT model and when
we step outside the model and hypothesize the impact of exogenous changes in market
conditions.
In the final analysis, the model here is not designed to predict the future; rather it is
designed to help us imagine alternative futures in order to make decisions in the present.

50
PROGRAMMING ADDENDUM
Important Caveats:
• The programming code below is written in R Programming Language and is designed to
work if copied directly into an R editor and then saved and run from there.
• Those code lines related to the importing and exporting of files to CSV files must be
changed by the user to accommodate the file directory structure of the user’s hardware.
• The use of subscripts in the program code differs in many instances from the subscripting
utilized in this paper. This is necessary to reflect the manner in which R requires matrixes
and vectors to be indexed. In most cases, the subscripting in the R code will correspond
to the addition of 1 to the subscripts utilized in the main section of this paper.
• With reasonably slight adjustments, the algorithms below can be easily adjusted for
recoding in Excel Visual Basic, Fortran, or other programming languages that support
matrix objects.
• This paper and the accompanying software code are not for the purpose of
recommending any particular investment and are not to be construed as investment
advice. This paper and software code are strictly for the purpose of academic and
practitioner research.
• The author makes no representation or warranty regarding the accuracy or correctness
of any portion of the material presented herein. The readers of this paper and
implementers of programming code presented herein utilize these materials at their own
risk.
• This paper and the accompanying software code may be copied and disseminated without
limitation, subject to the conditions that they be disseminated in entirety and that full
authorial attribution be made.

51
CODE SNIPPET #1
THE FOLLOWING CODE ENTERS THE CURRENT COUPON BENCHMARK/TREASURY
YIELDS-TO-MATURITY AND CONVERTS THEM INTO A SERIES OF ZERO-COUPON BOND PRICES FOR ALL
MATURITIES:

#****************ENTER BENCHMARK CURRENT COUPON TREASURY YIELD CURVE


#******************IN INTERACTIVE TERMINAL MODE

print("Enter Current Coupon Treasury Yields for Given Maturities")


CpnYTM1 <- as.numeric(readline(prompt=" 1-Year (enter as percent): "))
CpnYTM1<-CpnYTM1/100
CpnYTM2 <- as.numeric(readline(prompt=" 2-Year (enter as percent): "))
CpnYTM2<-CpnYTM2/100
CpnYTM3 <- as.numeric(readline(prompt=" 3-Year (enter as percent): "))
CpnYTM3<-CpnYTM3/100
CpnYTM5 <- as.numeric(readline(prompt=" 5-Year (enter as percent): "))
CpnYTM5<-CpnYTM5/100
CpnYTM10 <- as.numeric(readline(prompt=" 10-Year (enter as percent): "))
CpnYTM10<-CpnYTM10/100
CpnYTM20 <- as.numeric(readline(prompt=" 20-Year (enter as percent): "))
CpnYTM20<-CpnYTM20/100
CpnYTM30 <- as.numeric(readline(prompt=" 30-Year (enter as percent): "))
CpnYTM30<-CpnYTM30/100
print(c("Year 1 ",CpnYTM1))
print(c("Year 2 ",CpnYTM2))
print(c("Year 3 ",CpnYTM3))
print(c("Year 5 ",CpnYTM5))
print(c("Year 10 ",CpnYTM10))
print(c("Year 20 ",CpnYTM20))
print(c("Year 30 ",CpnYTM30))

#*************THIS SECTION DIMENSIONS MATRIXES FOR DEFINED VARIABLES

52
CurCpnYTM<-matrix(NA,nrow=30,ncol=1)
TsyPV<-matrix(NA,nrow=30,ncol=1)
ZeroYTM<-matrix(NA,nrow=30,ncol=1)
CurCpnYTM[1]<-CpnYTM1
CurCpnYTM[2]<-CpnYTM2
CurCpnYTM[3]<-CpnYTM3
CurCpnYTM[5]<-CpnYTM5
CurCpnYTM[10]<-CpnYTM10
CurCpnYTM[20]<-CpnYTM20
CurCpnYTM[30]<-CpnYTM30

#*******Next we interpolate the rest of the current coupon yield curve based on the
#********preceding benchmark rates

CurCpnYTM[4]<-(CpnYTM3+CpnYTM5)/2
for (i in 6:9){CurCpnYTM[i]<-CurCpnYTM[5]+(i-5)*(CurCpnYTM[10]-CurCpnYTM[5])/5}
for (i in 11:19){CurCpnYTM[i]<-CurCpnYTM[10]+(i-10)*(CurCpnYTM[20]-CurCpnYTM[10])/10}
for (i in 21:29){CurCpnYTM[i]<-CurCpnYTM[20]+(i-20)*(CurCpnYTM[30]-CurCpnYTM[20])/10}

#************THE NEXT THREE LINES OF CODE CONVERT THE CURRENT COUPON TREASURY YIELD
#*************CURVE INTO ZERO-COUPON BOND PRICES AND THEN YTM's

TsyPV[1]<-1/(1+CurCpnYTM[1])
for (i in 2:30) {TsyPV[i]<-(1-CurCpnYTM[i]*sum(TsyPV[1:(i-1)]))/(1+CurCpnYTM[i])}
for (i in 1:30) {ZeroYTM[i]<-((1/TsyPV[i])^(1/i)-1)}

#**********EVERYTHING FROM THIS POINT ONWARD DEALS WITH WRITING AND CONSOLIDATING
#***********DATA INTO A COMMONLY ACCESSIBLE CSV FILE

AnnlZeroYTMVol<-read.csv("C:/Users/stime/Documents/R/AnnlZeroYTMVol.csv",stringsAsFactors=FALSE)

53
MktVol<-matrix(NA,nrow=30,ncol=1)
for (i in 1:29){MktVol[i+1]<-AnnlZeroYTMVol$YldVol[i+1]}

EnteredMktVol<-MktVol

EnteredCurCpnYTM<-CurCpnYTM
EnteredTsyPV<-TsyPV
EnteredZeroYTM<-ZeroYTM
EnteredMktVol<-MktVol

EnteredTsyMktData<-data.frame(EnteredCurCpnYTM,EnteredTsyPV,EnteredZeroYTM,EnteredMktVol,stringsAsFactors=FALSE)

write.csv(EnteredTsyMktData,"C:/Users/stime/Documents/R/EnteredTsyMktData.csv")

54
CODE SNIPPET #2
THE FOLLOWING CODE CREATES THE INTEREST RATE LATTICE CALIBRATED TO (1) OBSERVED
BENCHMARK/TREASURY ZERO COUPON BOND PRICES FOR ALL MATURITIES AND (2) OBSERVED VOLATILITY
OF ZERO-COUPON BOND YIELDS-TO-MATURITY:

#*********THIS FIRST SECTION IMPORTS OBSERVED MARKET PRICES AND VOLATILTIES

CurTsyMktData<-read.csv("C:/Users/stime/Documents/R/CurTsyMktData.csv",stringsAsFactors=FALSE)

MktPr<-matrix(NA,nrow=30,ncol=1)
for (i in 1:30){MktPr[i]<-CurTsyMktData$PV[i]}#sum(SSC[i,1:i])}

MktVol<-matrix(NA,nrow=30,ncol=1)
for (i in 1:29){MktVol[i+1]<-CurTsyMktData$YldVol[i+1]}

#***********THIS SECTION DIMENSIONS MATRIXES AND VARIABLES

TryLatticeR<-matrix(NA,nrow=31,ncol=31)
TryLowestR<-matrix(NA,nrow=30,ncol=1)
TryScalerK<-matrix(NA,nrow=30,ncol=1)

#*********THIS SECTION CLEARS OUT AND RESETS VARIABLES IN ACTIVE MEMORY

rm(Horizon)
rm(Maturity)
rm(TryPr)
rm(TryPr_R_Up)
rm(TryPr_K_Up)

55
TryLowestR[1]<-(1/MktPr[1])-1
TryScalerK[1]<-1

#**********THIS SECTION BEGINS FOR/NEXT FOR ALL MATURITY DATES

for (Horizon in 2:30){

Maturity<-Horizon+1

NewRSeed<-.01
NewKSeed<-1.75
LoopIndicator<-0
TryPr<-2*MktPr[Horizon]
TryVol<-1.15*MktVol[Horizon]

#***********THIS BEGINS NEWTON RAPHSON ROUTINE WITHIN A GIVEN MATURITY

while ((abs((MktPr[Horizon]-TryPr)/MktPr[Horizon])>=.000001)|(abs((MktVol[Horizon]-TryVol)/MktVol[Horizon])>=.001)){

if(LoopIndicator==0){if (Horizon>2){
TryLowestR[Horizon]<-TryLowestR[Horizon-1]
TryScalerK[Horizon]<-TryScalerK[Horizon-1]
}else {
TryLowestR[Horizon]<-.002
TryScalerK[Horizon]<-1.5
}}else{TryLowestR[Horizon]<-NewRSeed
TryScalerK[Horizon]<-NewKSeed}

#***********THREE CASES ARE NEEDED TO COMPUTE PARTIAL DERIVATIVES


#***********FOR NEWTON RAPHSON ROUTINE

56
CaseIndicator<-c(1,2,3)
for (CaseIndicator in 1:3){

if (CaseIndicator==2){TryLowestR[Horizon]<-TryLowestR[Horizon]+.000001}
if (CaseIndicator==3){TryLowestR[Horizon]<-TryLowestR[Horizon]-.000001
TryScalerK[Horizon]<-TryScalerK[Horizon]+.000001}
print(c(CaseIndicator,TryLowestR[Horizon],TryScalerK[Horizon]))

for (i in 0:(Horizon-1)){
for (j in 0:i){
TryLatticeR[i+1,j+1]<-TryLowestR[i+1]*TryScalerK[i+1]^j
}
}

#***********State Space Matrix Dimensioning and Price Creation

TrySSC<-matrix(NA,nrow=31,ncol=31)

#***********First we compute state-space prices for cases of zero jumps and


#***********maximum number of possible through horizon.

for (i in 0:Horizon){
for (j in 0:i){
if (i==0){TrySSC[i+1,j+1]<-1/(1+TryLatticeR[i+1,j+1])}
if((i!=0)&(j==0)){TrySSC[i+1,j+1]<-.5*TrySSC[i,1]/(1+TryLatticeR[i+1,1])}
if ((i==j)&(i!=0)){TrySSC[i+1,j+1]<-.5*TrySSC[i,j]/(1+TryLatticeR[i+1,j+1])}
}
}

#***********Second we compute state-space prices for horizons greater


#***********than period 2 and which are not on the upper or lower boundary
#***********of the interest rate lattice.

57
for (i in 1:Horizon){
for (j in 1:i){
if ((i!=j)&(i!=0)){TrySSC[i+1,j+1]<-(.5*TrySSC[i,j+1]+.5*TrySSC[i,j])/(1+TryLatticeR[i+1,j+1])}
}
}

#*************************************************************************

if(CaseIndicator==1){
TryPr<-sum(TrySSC[Horizon,1:Horizon])
}
if(CaseIndicator==2){
TryPr_R_Up<-sum(TrySSC[Horizon,1:Horizon])
}
if(CaseIndicator==3){
TryPr_K_Up<-sum(TrySSC[Horizon,1:Horizon])
}

#*************************************************************************
#We next derive State Space Claim Prices One Period Hence where
# the initial interest rate jump was DOWN

TrySSC_Down<-matrix(NA,nrow=30,ncol=30)

for (i in 0:(Horizon-1)){
for (j in 0:i){

58
if (i==0){TrySSC_Down[i+1,j+1]<-1/(1+TryLatticeR[i+2,j+1])}
if((i!=0)&(j==0)){TrySSC_Down[i+1,j+1]<-.5*TrySSC_Down[i,1]/(1+TryLatticeR[i+2,1])}
if ((i==j)&(i!=0)){TrySSC_Down[i+1,j+1]<-.5*TrySSC_Down[i,j]/(1+TryLatticeR[i+2,j+1])}
}
}

for (i in 1:(Horizon-1)){
for (j in 1:i){
if ((i!=j)&(i!=0)){TrySSC_Down[i+1,j+1]<-(.5*TrySSC_Down[i,j+1]+.5*TrySSC_Down[i,j])/(1+TryLatticeR[i+2,j+1])}
}
}

#*************************************************************************
#We next derive State Space Claim Prices One Period Hence where
# the initial interest rate jump was UP

TrySSC_Up<-matrix(NA,nrow=30,ncol=30)

for (i in 0:(Horizon-1)){
for (j in 0:i){
if (i==0){TrySSC_Up[i+1,j+1]<-1/(1+TryLatticeR[i+2,j+2])}
if((i!=0)&(j==0)){TrySSC_Up[i+1,j+1]<-.5*TrySSC_Up[i,1]/(1+TryLatticeR[i+2,2])}
if ((i==j)&(i!=0)){TrySSC_Up[i+1,j+1]<-.5*TrySSC_Up[i,j]/(1+TryLatticeR[i+2,j+2])}
}
}

for (i in 1:(Horizon-1)){
for (j in 1:i){
if ((i!=j)&(i!=0)){TrySSC_Up[i+1,j+1]<-(.5*TrySSC_Up[i,j+1]+.5*TrySSC_Up[i,j])/(1+TryLatticeR[i+2,j+2])}
}
}

59
if(CaseIndicator==1){
TryVol<-.5*log((sum(TrySSC_Up[Horizon-1,1:Horizon-1])^(-1/(Horizon-1))-1)/(sum(TrySSC_Down[Horizon-1,1:Horizon-1])^(-
1/(Horizon-1))-1))
}
if(CaseIndicator==2){
TryVol_R_Up<-.5*log((sum(TrySSC_Up[Horizon-1,1:Horizon-1])^(-1/(Horizon-1))-1)/(sum(TrySSC_Down[Horizon-1,1:Horizon-
1])^(-1/(Horizon-1))-1))
}
if(CaseIndicator==3){
TryVol_K_Up<-.5*log((sum(TrySSC_Up[Horizon-1,1:Horizon-1])^(-1/(Horizon-1))-1)/(sum(TrySSC_Down[Horizon-1,1:Horizon-
1])^(-1/(Horizon-1))-1))
}

} #USED ONLY TO CLOSE FOREGOING CaseIndicator FOR/NEXT LOOP.

#***********THIS SEGMENT COMPUTES PARTIAL DERIVATIVES NUMERICALLY

dWdR<-(TryPr_R_Up-TryPr)/.000001
dWdK<-(TryPr_K_Up-TryPr)/.000001
dVdR<-(TryVol_R_Up-TryVol)/.000001
dVdK<-(TryVol_K_Up-TryVol)/.000001
Det<-dWdR*dVdK-dVdR*dWdK

dRMinHolder<-(dVdK*(MktPr[Horizon]-TryPr)-dWdK*(MktVol[Horizon]-TryVol))/Det
dScalerKHolder<-(dWdR*(MktVol[Horizon]-TryVol)-dVdR*(MktPr[Horizon]-TryPr))/Det

if (TryLowestR[Horizon]+dRMinHolder>0){NewRSeed<-TryLowestR[Horizon]+dRMinHolder
}else {NewRSeed<-TryLowestR[Horizon]/2}

if (TryScalerK[Horizon]+dScalerKHolder>1.0001){max(NewKSeed<-TryScalerK[Horizon]+dScalerKHolder,1.1)
}else {NewKSeed<-max(TryScalerK[Horizon]/2,1.1)}

60
LoopIndicator<-LoopIndicator+1
if (LoopIndicator>100) {print(c("Program break at Horizon",Horizon))}
if (LoopIndicator>100){break}
} #CLOSES WHILE - DO LOOP FOR ITERATIONS WITHIN THE GIVEN HORIZON

print(c(Horizon,sum(TrySSC[Horizon,1:Horizon]),TryVol))
print(c("New R",NewRSeed,"Next K",NewKSeed))

} #CLOSES FOR - NEXT LOOP FOR EACH HORIZON CASE

#........THE OUTPUT IS FOUND in the matrix TryLatticeR


#........One can optionally print TryLatticeR here

61
CODE SNIPPET #3
THE FOLLOWING COMPUTES DEBT SECURITY PRICES, ONCE THE INTEREST RATE LATTICE HAS BEEN
COMPUTED.

THE OUTPUT FROM CODE SNIPPET 2 IS A MATRIX NAMED TryLatticeR

CODE SNIPPET #3 REQUIRES THAT the matrix LatticeR be created and set equal to TryLatticeR. See the first three comment
lines below.

#TryLatticeR matrix is obtained from Code Snippet 2


#Lattice R then obtained by LatticeR<-TryLatticeR
# after separately first creating and dimensioning as follows LatticeR<-matrix(NA,nrow=31,ncol=31)

#CALLABLE
#COUPON PAYING
#SUBJECT TO DEFAULT
#periodic unconditional default rate is q
#recovery fraction on default is RR
#coupon rate (in decimals) is CPN

#*************RESETS ACTIVE VARIABLES IN MEMORY


rm(q)
rm(RR)
rm(CPN)
rm(Horizon)
rm(Maturity)
rm(W)

#**************ENTER INPUTS BELOW BEFORE RUNNING SCRIPT

OAS<-.01 #AS DECIMAL, added to the Lattice Rate at Each Node

62
k<-5 #MATURITY in years (whole numbers only)
RR<-.5 #RECOVERY RATE as fraction between zero and one.
q<-.015 #UNCONDITIONAL ANNUAL DEFAULT RATE (AS DECIMAL)
CPN<-.0275 #COUPON, AS DECIMAL, PAR VALUE EQUALS 1.0

Horizon<-k
Maturity<-Horizon+1
W<-matrix(NA,nrow=Maturity,ncol=Maturity)

BondRedemptionSchedule<-read.csv("C:/Users/stime/Documents/R/BondRedemptionSchedule.csv",stringsAsFactors=FALSE)

CallPr<-matrix(NA,nrow=30,ncol=1)
for (i in 1:30){CallPr[i]<-BondRedemptionSchedule$CallPr[i]}

NodeCashFlow<-matrix(0,nrow=31,ncol=1)
for (i in 1:k){NodeCashFlow[i]<-CPN*((1-q)^(i-1))+(1+CPN)*RR*(q*((1-q)^(i-2)))}

for (j in Maturity:1){
W[Maturity,j]<-((1-q)^Horizon)*(1+CPN)+q*((1-q)^(Horizon-1))*RR*(1+CPN)
}

for (i in Horizon:1){
for (j in Horizon:1){
if (i==1){
W[i,j]<-CPN+(1/(1+(LatticeR[i,j]+OAS)))* min(CallPr[i]*((1-q)^i),(.5*W[i+1,j]+.5*W[i+1,j+1]))
}else {
W[i,j]<-NodeCashFlow[i]+(1/(1+(LatticeR[i,j]+OAS)))* min(CallPr[i]*((1-q)^i),(.5*W[i+1,j]+.5*W[i+1,j+1]))
}
}
}

63
#*****************OUTPUT PRESENTED HERE

for (i in Maturity:1){print(W[i,])}
print(W[1,1]-CPN)

64
MARKET DATA ADDENDUM
As a preliminary, we present the equations presented in Code Snippet #1 for obtaining
implied zero-coupon prices (present value factors) from a current-coupon benchmark/Treasury
yield curve. The premise is that the current coupon sets the price of coupon paying bonds equal
to par, that is, unity; therefore, the current coupon equals the yield to maturity for the current
coupon bond. (In all equations below, yields and coupons are expressed as decimals.)
For a fixed coupon-paying, default-free bond24 maturing at time M, the following is true:

8 ∙ + 8 ∙ + 8y ∙ +⋯+ 8 ∙ +

where PM is the current price of an M-period bond; CM is the periodic coupon rate; PVt is the
present value of $1 to be received at the end of period t; and F is par (or “face”) value at
maturity. If F =1 and CM is the current coupon for a bond priced to par then PM = 1, also.
Thus, the preceding equation becomes

1 8 ∙ + 8 ∙ + 8y ∙ + ⋯+ 8 ∙ +1

By beginning with the bond of one period, we see from above that
1 8 ∙ +1
which implies that
1
8
+1
Similarly, using the second period bond and the present value factor just computed for period
one, we obtain:

1 8 ∙ + 8 ∙ +1

This can be rearranged as:


1− 8 ∙
8
+1
By now, the pattern is clear. Thus,

24
This section also applies to the so-called Libor/Swap Yield Curve.

65
1− 8 ∙ − 8 ∙ 1− ∙ 8 + 8
8y
y y y

y+1 y+1

We go step by step, period by period, with the following generalized equation .

1− ∙ ∑- 8G
8-
- Gn
1+ -

66
The benchmark/Treasury data underlying the results in this paper are:

Coupon YTM Coupon YTM One-Year Zero Cpn


Maturity Observed Maturity Implied PV Factor Forward Rate YTM YLD Vol
1 2.00% 1 2.00% 0.9804 2.00% 2.00% #N/A
2 2.20% 2 2.20% 0.9574 2.40% 2.20% 26.03%
3 2.50% 3 2.50% 0.9283 3.13% 2.51% 24.64%
5 2.75% 4 2.63% 0.9011 3.02% 2.64% 23.23%
10 3.00% 5 2.75% 0.8724 3.29% 2.77% 22.43%
20 3.25% 6 2.80% 0.8464 3.07% 2.82% 20.84%
30 3.50% 7 2.85% 0.8203 3.18% 2.87% 19.49%
8 2.90% 0.7941 3.30% 2.92% 18.35%
9 2.95% 0.7679 3.41% 2.98% 17.40%
10 3.00% 0.7417 3.53% 3.03% 16.63%
11 3.03% 0.7178 3.32% 3.06% 16.27%
12 3.05% 0.6943 3.39% 3.09% 15.92%
13 3.08% 0.6712 3.45% 3.11% 15.59%
14 3.10% 0.6484 3.51% 3.14% 15.26%
15 3.13% 0.6260 3.58% 3.17% 14.94%
16 3.15% 0.6040 3.65% 3.20% 14.63%
17 3.18% 0.5824 3.71% 3.23% 14.33%
18 3.20% 0.5611 3.79% 3.26% 14.04%
19 3.23% 0.5403 3.86% 3.29% 13.76%
20 3.25% 0.5198 3.94% 3.33% 13.49%
21 3.275% 0.4997 4.01% 3.36% 13.23%
22 3.300% 0.4801 4.10% 3.39% 12.99%
23 3.325% 0.4608 4.18% 3.43% 12.76%
24 3.350% 0.4420 4.27% 3.46% 12.56%
25 3.375% 0.4235 4.36% 3.50% 12.37%
26 3.400% 0.4054 4.45% 3.53% 12.21%
27 3.425% 0.3878 4.55% 3.57% 12.07%
28 3.450% 0.3705 4.66% 3.61% 11.96%
29 3.475% 0.3537 4.76% 3.65% 11.89%
30 3.50% 0.3372 4.88% 3.69% 11.86%

67
Addendum Table 1 – Excel Output for Security Pricing
RR 0.5 Recovery Rate
q 0.015 Annual Unconditional Default Probability
Coupon 0.0275 Annual Coupon Rate
CallPr 1000 1000 1000 1000 1000

Interest Rate Lattice (Imported from TryLatticeR Matrix in R Program)


0.02
0.017949041 0.030211
0.018537059 0.029727 0.047672
0.015324901 0.023217 0.035173 0.053286
0.013507676 0.020354 0.03067 0.046214 0.069637

Year END
Up Jumps: 0 1 2 3 4 5
0 0.02 0.017949 0.018537 0.015325 0.013508
1 0.030211 0.029727 0.023217 0.020354
2 0.047672 0.035173 0.03067
3 0.053286 0.046214
4 0.069637

Probability of
Survival thru Year End 0.985 0.970225 0.955672 0.941337 0.927217
Default in Year 0.015 0.014775 0.014553 0.014335 0.01412
Cumulative Default Prob. 0.015 0.029775 0.044328 0.058663 0.072783

Probability Check 1 1 1 1 1

Year END
Expected 0 1 2 3 4 5
Cash Flow (Default) 0.007706 0.007591 0.007477 0.007365 0.007254
0.007706 0.007591 0.007477 0.007365 0.007254
0.007591 0.007477 0.007365 0.007254
0.007477 0.007365 0.007254
0.007365 0.007254
0.007254

Expected
Cash Flow (NO Default) 0.027088 0.026681 0.026281 0.025887 0.952715
0.027088 0.026681 0.026281 0.025887 0.952715
0.026681 0.026281 0.025887 0.952715
0.026281 0.025887 0.952715
0.025887 0.952715
0.952715

TOTAL Expected
Cash Flow 0 0.034794 0.034272 0.033758 0.033251 0.959969
0.034794 0.034272 0.033758 0.033251 0.959969
0.034272 0.033758 0.033251 0.959969
0.033758 0.033251 0.959969
0.033251 0.959969
0.959969
Stripped
Price 0.965711278 1.007964 1.004969 0.996256 0.980426 0.959969
0.962087 0.976307 0.981126 0.974071 0.959969
0.934308 0.958951 0.964655 0.959969
0.926933 0.950816 0.959969
0.930723 0.959969
0.959969

68
Addendum Table 2 – Excel Output for State-Space Claim Pricing

State Space Analysis - Prices


Year END
Up Jumps: 0 1 2 3 4 5
0 1 0.980392 0.481553 0.236394 0.116413 0.057431
1 0.475821 0.464868 0.342675 0.224965
2 0.227085 0.334221 0.328377
3 0.107798 0.211247
4 0.05039

Zero Cpn Bond Maturing 0.980392 0.957374 0.928347 0.901108 0.87241

Zero Cpn YTM 2.000% 2.202% 2.509% 2.637% 2.768%

One-Year Forward Rates at time 0


2.000% 2.404% 3.127% 3.023% 3.289%

69
BIBLIOGRAPHICAL REFERENCES

Acton, Forman S. 1990. Numerical Methods That Work. Washington, D.C.: The Mathematical
Association of America.
Black, Fischer, Emanuel Derman & William Toy (1990) “A One-Factor Model of Interest Rates
and Its Application to Treasury Bond Options”, Financial Analysts Journal, 46:1, 33-39, DOI:
10.2469/faj.v46.n1.33
Cochrane, John H. 2005. Asset Pricing, Revised Edition. Princeton and Oxford: Princeton
University Press.
Duffie, Darrell (1999) “Credit Swap Valuation”, Financial Analysts Journal, 55:1,
73-87, DOI: 10.2469/faj.v55.n1.2243

Duffie, Darrell and Kenneth Singleton (1999) “Modeling Term Structure of Defaultable Bonds”,
Review of Financial Studies, 12:4, https://www.jstor.org/stable/2645962

Hull, John and Alan White. 2001. “The General Hull-White Model and Supercalibration”,
Financial Analysts Journal 57:6, pgs. 34-43; https://doi.org/10.2469/faj.v57.n6.2491
Hull, John and Alan White. 2005. Hull-White on Derivatives . London: Haymarket House.
Kealhofer ,Stephen (2003) “Quantifying Credit Risk I: Default Prediction,” Financial Analysts
Journal, 59:1, 30-44, DOI: 10.2469/faj.v59.n1.2501
Jamshidian, Farshid (1991) “Forward Induction and Construction of Yield Curve Diffusion
Models”, The Journal of Fixed Income (June) 1(1):62-74; DOI:10.3905/jfi.1991.692348
Yan, Hong. 2001. “Dynamic Models of the Term Structure”, Financial Analysts Journal, 57:4,
pgs. 60-76; https://doi.org/10.2469/faj.v57.n4.2466

Wilmott, Paul, Sam Howison and Jeff Dewynne, 1995. The Mathematics of Financial
Derivatives. Cambridge: Cambridge University Press.

70

You might also like