Does anyone know if an adjustment should be made to a binomial forward rate model for discount or premium bonds?
I built a 5-year, annual step model, and calibrated it to zero coupon bonds from some token par/spot/dfactor/forward rates. As I hoped, a par bond maps perfectly to it. When I tried bumping the coupon on the bond up and down, my tree price vs. analytical solution diverged. The wider the discount (premium) the more negative (positive) the divergence became.
Is this to be expected? If so, what is normally done?
If they don’t agree, you’ve done something wrong.
Are you sure that you’re using par rates to calibrate the tree?
I used par rates --> bootstrapped spot --> implied forward, then, using the implied forward, did my first guess at the up and down nodes.
From that, I calibrated the rates to price the zeroes to match the DF from my bootstrapped spots.
Is this not the correct process? I wish I could show the work book to clarify. It’s all laid out.
Calibrate the rates using par bonds, not zeros.
I calibrated to price a set of bonds to par but I’m still having the same problem matching the price on a discount/premium bond using the tree.
The tree calibrated to zeroes had no issue pricing par bonds either. I feel like I’m missing something really important.
I looked over your model and discovered the problem.
The problem is the manner in which you’re trying to calibrate it. You start by creating a tree based on the forward curve (increasing or decreasing the rates at the nodes by multiplying or dividing by the volatility factor eσ). Because this doesn’t quite give the correct prices for par bonds, you then add a spread to those rates and adjust the spread until the tree prices the par bonds correctly.
Unfortunately, that doesn’t quite work. (I know: I remember doing it myself that way a long time ago.) The problem is that the ratios of the rates at different nodes at the same time are no longer correct.
What you need to do is:
- Set the rate at the lowermost node for a given time at some constant value. Using the formula that you already have will be a good starting point.
- Relate the rates at the higher nodes at that time to that lowermost value by multiplying by e2σ, e4σ, e6σ, and so on.
- Adjust the rate at the lowermost node (which will cause the other rates at that time to change as well) until the tree prices the par bond correctly.
Starting at the end goal of having the tree price a par bond correctly… I think it already does that for all five par bonds I tested (via the originating node, each one prices to $1). It’s the discount bond and premium bond that aren’t pricing correctly (cell N1 vs. N2).
At each time step, I’ve related the forward rates higher in the tree by a factor of e(2*sig) of the node below it… does that cover bullet point two?
I used a cell reference in the bottom nodes to add some spread to the forward rate then had Solver choose that number so that the sample par bond would actually price to par on the tree. Is there a different way you would recommend doing this?
I think I’m lost.
It sounds OK.
Let me examine it in more detail. It sounds as though it should be working fine.
The problem is the PRICE function. I thought that it might be the day count, but I tried several alternatives and can’t get it to work. I think that it’s a matter of one payment being off by one day, probably because of the leap year in 2020.
If you use your discount factors in column D and multiple them by the coupon and par payments and add them up, you’ll get the same price as you get in the tree.
So . . . the tree’s fine. It’s the PRICE function that’s off. Or, more accurately, the PRICE function is probably correct and the tree’s off because it isn’t accounting for one year with 366 days.
That’s really weird. The sensitivity of the calculation to +/- 1 day isn’t enough to remove the 13bp difference. Only 1bp.
That said, if I change the coupon in K5 to the par rate of 6.2%, it prices perfectly to par. That was what triggered my first question around a modification of this model for discount/premium bonds…
Aha! I tried pricing via the DF and it looks good. Very strange.