Valuation of Callable Putable Bonds-Derivative Pricing in Python

In a previous post, we presented a method for pricing a fixed-rate bond. In this post, we are going to discuss valuation of a callable bond.

A callable bond (also called redeemable bond) is a type of bond (debt security) that allows the issuer of the bond to retain the privilege of redeeming the bond at some point before the bond reaches its date of maturity. In other words, on the call date(s), the issuer has the right, but not the obligation, to buy back the bonds from the bond holders at a defined call price. Technically speaking, the bonds are not really bought and held by the issuer but are instead cancelled immediately.

The call price will usually exceed the par or issue price. In certain cases, mainly in the high-yield debt market, there can be a substantial call premium.

Thus, the issuer has an option which it pays for by offering a higher coupon rate. If interest rates in the market have gone down by the time of the call date, the issuer will be able to refinance its debt at a cheaper level and so will be incentivized to call the bonds it originally issued. Another way to look at this interplay is that, as interest rates go down, the present values of the bonds go up; therefore, it is advantageous to buy the bonds back at par value. Read more

Valuation of a callable bond requires a short-rate model. The valuation steps are as follows,

  1. Calibrate the short-rate model using market data
  2. Build an interest-rate tree
  3. Price the bond
valuation of callable bond

Swaption volatilities. Source: Bloomberg

We are going to present a concrete example of pricing a callable bond. The parameters of a hypothetical callable bond are as follows,

Valuation date: June 30, 2020

Issue date: September 30, 2019

Maturity: 5 years

Coupon: 2.5%

Call strike: 100

Call period: September 30, 2019 to maturity

We choose the Hull-White model to describe the interest rate dynamics.  This model is widely used in practice because it allows for the model to fit the term structure of interest rates. We utilize the method presented in Reference 1 in order to calibrate the model parameters to the market data. Specifically, we use swaption volatilities in the calibration and obtain σ=0.676% and α=0.127% as at the valuation date.

We then use a Python program to build a trinomial tree for the risk-free rates following the procedure detailed in References 2 and 3. After a trinomial interest-rate tree is built, the valuation of the callable bond proceeds as follows.

Let’s define the following terms with respect to a node (i,j) :

  • i: means that on the node (i,∙) the date is defined by i×dt where dt is the length of the time-step.
  • j: means the position (up/medium/down) of the tree,
  • C (i,j): call price at node (i,j),
  • P (i,j): put price at node (i,j) ,
  • R (i,j): the projected risk-free rates at nodes (i,j) which are modeled using the Hull-White interest rate dynamics,
  • V(i,j): continuation value of the bond at node (i,j) which is calculated as the expectation value of the continuation values of the next three possible nodes originating from (i,j) discounted by one period using the projected rates R(i,j).

The values of the bond at the terminal nodes N, where N=T/dt, and T is the time to maturity, is set to the notional at maturity (Notional_N) plus the interest payment at that time (interest_N), i.e.

V(N,∙)=Notional_N+ interest_N,

We then move back to the previous time step and calculate the bond continuation value at each node on this time slice using the continuation values at its precedent nodes and add any interest payment that occurs between the two time steps.

If the bond is callable at time i×dt, then the value of the bond is calculated as,

V(i,j)=min( V(i,j),C(i,j))

i.e. the issuer will exercise the call if the call value is smaller than the continuation value; that is, the position of the issuer can be improved by calling the bond.

Similarly, if the bond is puttable at time i×dt, then the value of the bond is calculated as,

V(i,j)=max( V(i,j),P(i,j))

i.e. the bond holder will exercise the put if the put value is greater than the continuation value.

The above procedure is repeated until we reach the root of the tree. The value of the callable/puttable bond at the valuation date is the continuation value at time zero.

The picture below shows the price of the hypothetical callable bond calculated by the Python program.

pricing a callable bond


[1] Hull, J. C. (2018), Options, Futures and Other Derivatives (10th Ed.), Prentice-Hall

[2]  Hull, J. C. and White, A. 1994, Numerical Procedures for Implementing Term Structure Models I: Single Factor Models, Journal of Derivatives

[3]  Hull, J. C. and White, A. 1996, Using Hull-White Interest-Rate Trees, Journal of Derivatives

Further questions

What's your question? Ask it in the discussion forum

Have an answer to the questions below? Post it here or in the forum


Leave a Reply