• November 18, 2021
  • Abhyankar Ameya
  • Python

Introduction:

Bonds (fixed income) are an important asset class in the market. Bonds are used by market participants for various reasons, to name a few:

  1. Trading
  2. Risk Management
  3. Regulatory requirement for banks
  4. Safer investments
  5. Asset Liability Management
  6. Source of Capital for the firm etc.

Talking of the funding part, companies raise capital in the form of both: equity and debt. These two components define the capital structure of a company. Bonds are comparatively a cheaper way to raise capital, considering the tax shield they provide. Thus, companies may find it cheaper to raise capital at the same time keeping their firm’s total cost of capital (i.e., WACC) under check. Of course, the company needs to balance the potential risk from rising cost of bankruptcy which are a function of the amount of debt capital raised.

In the market, the volume of plain vanilla bonds is the highest. They are the most popular fixed income products used by market participants. However, there are structured bond varieties which may be used by bond Issuers from time to time. An example of this structured variety is a Callable Bond. One can visualize this product as a combination of the below:

Callable Bond = Bond + Issuer Call option

In this post, we will attempt to understand the economic rationale and the structure of the callable bond. Subsequently, we will build a pricing model for a Callable Bond using Python programming.  

Rationale for using callable bonds:

Callable bonds provide a flexibility to the issuers that plain vanilla bonds cannot. These bonds carry a Call Schedule which defines the time points and the prices at which the Issuer has the right to call back the bond issue if they deem fit. Naturally, the bond Issuer has to pay for this added flexibility. Callable bonds would have to be issued at a price lower than an equivalent plain vanilla bond (all other things remaining equal) in order for them to be accepted by the market. The reason being, market participants are taking a risk of the bond being called back prior to the pre-defined maturity date, that’s why they would expect these bonds to be available at a price lower than a plain vanilla bond.

Valuation technique:  

Bond component

Valuation of the bond component is straightforward. Its simply the present value of the discounted cash flows on the bond (periodic interest and principal) to be received in the future. 

Option component

Valuation of the option component is a bit tricky and as a result interesting! To begin with, we need a model for generating the paths for interest rates. In our model we have used the Hull and White model for interest rates path generation. Once, the rates are simulated, we have used the tree structure for pricing of the option component.   

Finally, when we have both the pricing of the aforesaid components ready, we can arrive at the MTM (or pricing) of the Callable Bond by combining the two component MTMs. Below is the implementation of the callable bond pricer using Python programming.

Below are the steps for implementing this algorithm using Python:

1. Input the bond details. I have used a hypothetical bond for this example. However, all the below inputs can be found in a bond prospectus.

2. Yield Curve input. We have assumed a Flat Yield curve for ease of demonstration. In practical scenarios, you will have to replace it with market quoted yields

3. Defining the Call Schedule for the bond

4. Defining and calling the bond pricing function

The price calculated above is the MTM / present value of the Callable bond and can be used for various purposes including reporting, risk calculations, capital charge etc.

There may be certain bonds which may also have an Investor Put option embedded in them. The above code may be modified a bit to accommodate this requirement easily.

This is one of the approaches to arrive at the pricing for a Callable Bond. We have leveraged the libraries available in Python for achieving our end objective. Doing this the hard way (without using ready libraries for say Hull White), would have taken a considerably longer time to develop this model. But thanks to scripting tools like Python, our activity of building prototype models happens with ease!