I'm trying to understand a step by step process of building curve from the instruments to the final result, particularly how overlapped FRAs are used.

i'm trying to build this in excel so I have a clear understanding of each step, if someone can explain each step

Here are the details of the instruments. For simplicity because I just want to understand the process i will only be using the index and FRAs

Curve date = 03/01/2023

Index 6M: 2.379

1x7 FRA: 3.007

2x8 FRA: 3.229

3x9 FRA: 3.995

4x10 FRA: 3.495

5x11 FRA: 3.555

6x12 FRA: 3.614

9x15 FRA: 3.555

12x18 FRA: 3.614

What sanity checks would one do? Can someone provide an example as well

  • $\begingroup$ Hi Naim, I'd recommend using the search function and/or buying JHM Darbyshire's book on IRD's (no affiliation whatsoever but it's excellent). $\endgroup$
    – oronimbus
    Commented Feb 16 at 11:07
  • $\begingroup$ Hey yes I have it and have visited its contents very frequently! i have read the relevant parts a few times but still having trouble. $\endgroup$ Commented Feb 16 at 11:54

1 Answer 1


Since you have my book I'll give you a step by step.

You have choices to make here. How you you want to parametrise your Curve, what interpolation do you use, which node points for the discount factors, etc. Since you are doing this in Excel you have constraints. One is that you need this to be bootstrappable.

If you do this in a library you can easily use a numerical solver, such as the following:

from rateslib import *

curve = Curve(
        dt(2023, 1, 3): 1.0,
        dt(2023, 7, 3): 1.0,
        dt(2023, 8, 3): 1.0, 
        dt(2023, 9, 3): 1.0, 
        dt(2023, 10, 3): 1.0,
        dt(2023, 11, 3): 1.0

And then solve and update the Curve values based on market prices. I am using GBP instruments to ignore payment delays and T+2 spot.

solver = Solver(
        IRS(dt(2023, 1, 3), "6m", spec="gbp_irs", curves=curve),
        IRS(dt(2023, 2, 3), "6m", spec="gbp_irs", curves=curve),
        IRS(dt(2023, 3, 3), "6m", spec="gbp_irs", curves=curve),
        IRS(dt(2023, 4, 3), "6m", spec="gbp_irs", curves=curve),
        IRS(dt(2023, 5, 3), "6m", spec="gbp_irs", curves=curve),
    s=[2.379, 3.007, 3.229, 3.995, 3.495]

This is what this produces:

# {datetime.datetime(2023, 1, 3, 0, 0): <Dual: 1.000000, ('0d6f0_0',), [1.]>,
#  datetime.datetime(2023, 7, 3, 0, 0): <Dual: 0.988340, ('0d6f0_1',), [1.]>,
#  datetime.datetime(2023, 8, 3, 0, 0): <Dual: 0.983330, ('0d6f0_2',), [1.]>,
#  datetime.datetime(2023, 9, 3, 0, 0): <Dual: 0.980333, ('0d6f0_3',), [1.]>,
#  datetime.datetime(2023, 10, 3, 0, 0): <Dual: 0.974663, ('0d6f0_4',), [1.]>,
#  datetime.datetime(2023, 11, 3, 0, 0): <Dual: 0.975075, ('0d6f0_5',), [1.]>}

Now you want to do this in Excel. Setup the same scheme. You will have the first discount factor (blue) set to 1.0 as identity. Your yellow cells are the parameters calibrated by the rates. Your Grey cells are the intermediate calculations required under interpolation to get the right values.

enter image description here

The formulae for log_linear interpolation look like this:

enter image description here

  • $\begingroup$ Thank you so much. I have another question if you don’t mind. I understand you can get the implied forward rates from the discount factors but is there a way to get the implied forward rates without calculating discount factors? $\endgroup$ Commented Feb 16 at 19:45
  • $\begingroup$ If you use a discount factor based curve, then no there is no other way. You have to extract the discount factors at the appropriate points and derive a rate from them. If you choose to construct a curve of a different type, such as one based solely on rates then you can directly extract a rate, but that curve cannot have any discount factors. It would be mathematically inconsistent to do so. Consider the concept of a LineCurve at this documentation: rateslib.readthedocs.io/en/stable/c_curves.html# $\endgroup$
    – Attack68
    Commented Feb 16 at 20:07
  • $\begingroup$ Okay. I want to understand intuitively the process of building the curve. Can you provide an intuitive explanation? Fundamentally why is a particular step happening? Thank you $\endgroup$ Commented Feb 17 at 13:11
  • $\begingroup$ To be frank, it is difficult to simplify this any further. There are 9 formulae in cells in the spreadsheet I have provided. Of which, 7 of them are reproductions of the cells above them. Thus there are really only 2 quite trivial, independent calculations, which are repeated as one sequentially builds a curve from the data that is provided and expected to be reproduced. If you are having trouble with this I would suggest trying to reproduce the spreadsheet yourself without copying and questioning the point of each step. $\endgroup$
    – Attack68
    Commented Feb 17 at 19:09
  • $\begingroup$ Understood! That’s exactly what I’m doing. The instruments were quoted from BBG and it’s the same instruments BBG uses to build their curve. Ultimately I want to compare the implied forward rates I build from excel against BBG. The interpolation scheme BBG uses is “Step Forward” which is step-function forward continuously-compounded forward rate I believe. How can this be incorporated? If needed I can send a screenshot of BBG curve by editing original message as I’m trying to reproduce their implied forward rates $\endgroup$ Commented Feb 18 at 12:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.