Pricing Callable Bonds


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

a. Trading

b. Risk Management

c. Regulatory requirement for banks

d. Safer investments

e. Asset Liability Management

f. 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:

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

b. 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!




Founder: FinQuest Institute | Ekspert Consulting;;

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

Use Consul as a Load Balancer with Nginx

ODP.NET Now Available with Free Use License — No More Click-Through

How to Track button clicks in WordPress with Google Analytics

Google Cloud Pub/Sub Reliability User Guide: Part 1 Publishing

Using Windows Deployment Services

How To Integrate Microservices

🐍Let’s Play Snake and Ladders

YeeCo Weekly Update

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Ameya Abhyankar

Ameya Abhyankar

Founder: FinQuest Institute | Ekspert Consulting;;

More from Medium

The Python Quants Certificate Program Week 5: DNNs and EWMA Optimization

Using Old Algorithms for New Trading Strategies

Volatility Regime Classification with GARCH(1,1)&Markov Models

Crowd-Sourced Automatic Trading Strategies: Are They Any Good?