Skip to content
All library documents

Why Futures Rate Helpers Add Maturity Dates to a Yield Curve

Article Quant Q&A · Author: user89877

Summary

The document explains why dates supplied to QuantLib’s futures rate helpers may not appear as nodes in a bootstrapped yield curve. A futures contract provides a forward rate for an accrual period, so its start date is not the tenor date inferred by the curve. Instead, the bootstrap uses the end of that period, the contract’s maturity, as the relevant curve date.

The example uses three-month futures and shows that a supplied June start date corresponds to a September maturity date on the output curve. Likewise, a September start date maps to a December maturity. The output dates can also reflect business-day and calendar conventions applied by the helper, which accounts for shifts from some input dates. The explanation focuses on the relationship between the futures accrual period and curve nodes; it does not cover alternative helper settings or the full mechanics of yield curve construction.

Key ideas

  • A futures rate helper represents a forward rate over an accrual period.
  • The curve node associated with a futures quote is its accrual period’s end date, not its start date.
  • For a three-month future, the displayed curve date is generally the maturity about three months after the supplied start date.
  • Calendar and business-day conventions can shift dates used in curve construction.

Tags

Full text
# Python Quantlib yield curve dates different than input


# Python Quantlib yield curve dates different than input












Thanks very much for your help in advance.

I am trying to understand the yield curve construction from Python Quantlib. And it seems I cannot get the curve output the same dates(nodes) as my input when using the FuturesRateHelper. Here is my code:

```
calc_date = ql.Date(18, 2, 2015)
ql.Settings.instance().evaluationDate = calc_date

bussiness_convention = ql.ModifiedFollowing
daycount = ql.Actual365Fixed()
calendar = ql.JointCalendar(ql.UnitedStates(), ql.UnitedKingdom())

depo_r = {ql.Period(1, ql.Weeks): float(0.001375),       
      ql.Period(int(1), ql.Months): float(0.001717), 
      ql.Period(int(2), ql.Months): float(0.002112), 
      ql.Period(int(3), ql.Months): float(0.002381) 
    }

depoHelpers = [ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(depo_r[p])), 
            p, 
            0, calendar, bussiness_convention, False, daycount)
            for p in depo_r.keys()]

future_r = {ql.Date(17, 6, 2015): float(99.725),
            ql.Date(16, 9, 2015): float(99.585),
            ql.Date(16, 12, 2015):float(99.385),
            ql.Date(16, 3, 2016): float(99.16),
            ql.Date(15, 6, 2016): float(98.93),
            ql.Date(21, 9, 2016): float(98.715)
            }

futuresHelpers =[ql.FuturesRateHelper(ql.QuoteHandle(ql.SimpleQuote(future_r[d])),
                                     d, 3,
                                     calendar, bussiness_convention,
                                     True, daycount,
                                     ql.QuoteHandle(ql.SimpleQuote(0.0)))
                   for d in future_r.keys() ]

helpers = depoHelpers + futuresHelpers

curve = ql.PiecewiseFlatForward(0, calendar, helpers, daycount)
```

and here is my output when I printed curve.dates()

```
---------
February 18th, 2015
---------
February 25th, 2015
---------
March 18th, 2015
---------
April 20th, 2015
---------
May 18th, 2015
---------
September 17th, 2015
---------
December 16th, 2015
---------
March 16th, 2016
---------
June 16th, 2016
---------
September 15th, 2016
---------
December 21st, 2016
```

I am very confused as the the date of June 17, 2015 disappeared and several dates are also shifted from my input (e.g. Sep 21 2016 as in my input (which is an IMM date) but Sep 15 2016 was shown in the output). Why is it happening?

Many thanks for your help again.

## Answer by SmallChess (score 4, accepted)

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

Each future gives you forward rate between `t1` and `t2`. This is very important, it gives you the rate for `t2` from `t1`. Thus, the bootstrap algorithm extracts a value for `t2` NOT `t1`.

June 17, 2015 is your `t1`. It is the starting date of your future, which matures in three months. Sept 17, 2015 is the mature date, and it is indeed shown in your output.

Similarly, Sep 21 2016 is your `t1`, your `t2` is December 21st, 2016, again shown in your output.

Remember, it's the date your instrument matures defines your curve tenors, not when it starts.

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.