Skip to content
All library documents

Building a USD LIBOR Forward Curve from Market Quotes

Article Quant Q&A · Author: jDraper

Summary

The discussion considers how to turn sparse USD LIBOR forward or projection rates into a curve for forecasting floating coupons in an interest rate swap, with a separate curve used for discounting. It cautions that a set of rates at selected maturities does not reveal all intervening forward rates, so the available points may be insufficient to calibrate a fully market-consistent curve.

One suggested approach is flat interpolation of quoted forwards after converting the rates to continuous compounding for a forward-curve implementation. The resulting forwards are piecewise flat, and extrapolation or smoothing introduces additional assumptions. A second approach uses more liquid Eurodollar futures at shorter maturities, adjusts futures-implied rates for convexity, and fits the convexity adjustment using swap points. These are practical alternatives rather than a unique best method; curve quality depends on available instruments, market conventions, and the limited density of the supplied data.

Key ideas

  • Sparse maturity quotes do not determine every intervening forward rate needed for swap valuation.
  • Flat interpolation creates piecewise-constant forwards and requires consistent compounding and day-count conventions.
  • Shorter-dated Eurodollar futures can add granular market calibration, with convexity adjustments applied to futures rates.
  • Curve fitting and interpolation choices add assumptions, especially when the input points are sparse.

Tags

Full text
# Best Approach to Creating a USD LIBOR Forward Curve from Market Data


# Best Approach to Creating a USD LIBOR Forward Curve from Market Data












This is a very basic question, I am convinced this has been answered before but I cannot seem to find it.

What is the best approach for constructing a USD Libor forward curve from market data?

For example, I am able to pull down the following forward/projection curves for USD Libor:

```
maturity   1M USD Libor   3M USD Libor   6M USD Libor   1Y USD Libor
1M          0.1551          0.2357         0.249          0.3658
3M          0.1622          0.2341         0.2473         0.3809
6M          0.1439          0.2051         0.2478         0.4081
1Y          0.1202          0.1948         0.2758         0.4797
2Y          0.1069          0.2265         0.3754         0.6704
3Y          0.2094          0.3452         0.5159         0.8479
4Y          0.392           0.5293         0.7074         1.0331
5Y          0.5843          0.7193         0.8862         1.2173
7Y          0.9077          1.0438         1.2055         1.5262
10Y         1.2002          1.3265         1.4985         1.763
15Y         1.255           1.3852         1.5278         1.7989
20Y         1.2285          1.3538         1.4866         1.7496
30Y         0.9059          1.0612         1.1455         1.3755
```

Note: For simplicity I have only included a selection of the rates along the curves I can access. In reality these are available to me at a daily frequency.

I have been attempting to import the above data (although I am not sure what Helper is most appropriate) with the end goal of using the resulting curve to forecast floating rates for valuing an IRS.

Edit: To clarify, the above curve might be best thought of as a forward-generating or projection curve. Its intended use is to project future 3M USD LIBOR rates.

Edit 2: The above curves are adjusted for tenor basis and I use a separate curve for discounting/valuation.

## Answer by David Duarte (score 3)

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

If those numbers are only 3M rates, I'm affraid you don't have enough information to build a curve to value other instruments.

For example, you have a 3M rate starting in 1Y and in 2Y, but without the spot or swap rate, you have no information on the 3M fowards starting in 1Y3M, 1Y6M and 1Y9M...

I think one thing you could do is build a curve that does a flat interpolation of those rates using the `ql.ForwardCurve` class (expects continuous rates as inputs).

```
import QuantLib as ql
import matplotlib.pyplot as plt

nodes = [
    ('1M', 0.2357),
    ('3M', 0.2341),
    ('6M', 0.2051),
    ('1Y', 0.1948),
    ('2Y', 0.2265),
    ('3Y', 0.3452),
    ('4Y', 0.5293),
    ('5Y', 0.7193),
    ('7Y', 1.0438),
    ('10Y', 1.3265),
    ('15Y', 1.3852),
    ('20Y', 1.3538),
    ('30Y', 1.0612),  
] 

today = ql.Date().todaysDate()
calendar = ql.TARGET()
dates = [calendar.advance(today, ql.Period(tenor)) for tenor, rate in nodes]
rates = [rate for tenor, rate in nodes]
dayCounter = ql.Actual360()
contRates = [ql.InterestRate(rate, dayCounter, ql.Compounded, ql.Quarterly).equivalentRate(ql.Continuous, ql.NoFrequency, 1).rate() for rate in rates]

curve = ql.ForwardCurve(dates, contRates, ql.Actual360())
curve.enableExtrapolation()

rates = [curve.forwardRate(dt, dt+ql.Period('3M'), ql.Actual360(),ql.Compounded, ql.Quarterly).rate() for dt, rate in curve.nodes()]
times = [dayCounter.yearFraction(today, dt) for dt, rate in curve.nodes()]
plt.plot(times, rates, 'o');
```

Notice that I plotted dots and not lines on purpose because what you actually get with this curve is flat interpolation of the forwards provided, ie:

```
allDates = ql.MakeSchedule(dates[0], curve.maxDate(), ql.Period('1D'))
allTimes = [dayCounter.yearFraction(today, dt) for dt in allDates]
fwds = [curve.forwardRate(dt, dt+ql.Period('3M'), ql.Actual360(),ql.Compounded, ql.Quarterly).rate() for dt in allDates]
plt.plot(allTimes, fwds)
```

Other alternatives would be to fit a curve to these points or use more advanced interpolation methods, although you probably have too few points for decent results on any of these alternatives.

Here is what the forward curve would look like using Monotone Convex interpolation.

## Answer by ZelliZello (score 1)

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

You have more liquid instruments available to build your LIBOR curve, especially below the 5Y point. What we do usually is take all the eurodollar futures contracts below 5Y (so last one as of now would be the SEP25 contract) and apply a proper smooth convexity function (remember forward libor = eurodollar future + convexity). You need a convexity value for ech of those future contracts (20 contracts), and usually you can fit a smooth convexity (log polynomial for example) with 1Y,2Y,3Y,4Y,5Y swap points for example. That way you have a more granular curve, and your forwards within the first 5 years are not subject to interpolation but calibrated to the market.

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.