Skip to content
All library documents

Bootstrapping a Discount Curve from Index and FRA Quotes

Article Quant Q&A · Author: Naim Hussain

Summary

The document outlines how to build a curve from an index instrument and a sequence of forward rate agreement quotes, including overlapping FRAs. It frames the task as choosing curve parameters, interpolation, and discount factor node dates so the setup can be bootstrapped. A code example uses a log-linear curve and a solver to fit instruments to market rates, then displays the resulting discount factors.

For a spreadsheet implementation, the author describes fixing the initial discount factor at one, calibrating later node values to market rates, and calculating intermediate values through interpolation. The excerpt ends just as it introduces the log-linear interpolation formulas, so it does not provide those formulas, a completed spreadsheet example, or the requested sanity checks. Its numerical illustration also simplifies market conventions by assuming GBP instruments and omitting payment delays and spot settlement effects; those choices limit how directly it transfers to other markets.

Key ideas

  • Curve construction requires selecting discount factor nodes, interpolation, and calibration instruments.
  • A solver can fit discount factors to index and FRA market quotes.
  • Log-linear interpolation supplies intermediate discount factors between curve nodes.
  • The example simplifies settlement conventions and does not show the promised spreadsheet formulas or sanity checks.

Tags

Full text
# Explicit step by step curve construction using FRAs


# Explicit step by step curve construction using FRAs












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

## Answer by Attack68 (score 4, accepted)

https://quant.stackexchange.com/a/78351

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(
    nodes={
        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
    },
    calendar="ldn",
    convention="act365f",
    interpolation="log_linear",
)
```

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(
    curves=[curve],
    instruments=[
        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:

```
curve.nodes
# {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.

The formulae for log_linear interpolation look like this:

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.