0
$\begingroup$

I am new to QuantLib-Python and I am trying to replicate the implementation of a Dual Curve bootstrap using QuantLib-Python. I have followed the steps in Chapter 9 of the QuantLib Python Cookbook. That is, I have initialized the helpers for Deposits+OIS to build the Eonia Curve and subsequently passed this to the helpers for the Tenor Curve (Euribor 6M).

My understanding is that in QuantLib the choice of the interpolation methods is given by the objects called, for example, PiecewiseLogCubicDiscount. In this case the cubic interpolation is performed on Log Discount Factors.

I would like to interpolate using Monotonic Cubic Spline on Log Discount Factor. I saw that in this file some interpolation are exported. I saw in the interpolation.i file that other interpolation methods are available. I just do not know how to access those. Thank you.

$\endgroup$
2
  • $\begingroup$ So what exactly is your question? $\endgroup$ May 6, 2020 at 20:16
  • $\begingroup$ I edited my question. Sorry for being unclear. $\endgroup$
    – Alepo
    May 7, 2020 at 7:13

1 Answer 1

0
$\begingroup$

You are correct. In QuantLib python you should choose the appropriate class to get the interpolation method and variable you want.

Here is an example with some of the methods:

import QuantLib as ql

market_data = [
    ('DEPOSIT', '6M', -0.114),
    ('FRA', '6M', -0.252),
    ('FRA', '12M', -0.306),
    ('SWAP', '2Y', -0.325),
    ('SWAP', '3Y', -0.347)
]

helpers = ql.RateHelperVector()
index = ql.Euribor6M()
for instrument, tenor, rate in market_data:
    rate /= 100
    if instrument == 'DEPOSIT':
        helpers.append(ql.DepositRateHelper(rate, index))
    if instrument == 'FRA':
        monthsToStart = ql.Period(tenor).length()    
        helpers.append(ql.FraRateHelper(rate, monthsToStart, index))
    if instrument == 'SWAP':
        helpers.append(
            ql.SwapRateHelper(
                rate, ql.Period(tenor), ql.TARGET(), ql.Annual,
                ql.Following, ql.Thirty360(), index
            )
        )

params = [2, ql.TARGET(), helpers, ql.ActualActual()]
curves = {
    "PiecewiseFlatForward": ql.PiecewiseFlatForward(*params),
    "LogLinearDiscount": ql.PiecewiseLogLinearDiscount(*params),
    "LogCubicDiscount": ql.PiecewiseLogCubicDiscount(*params),
    "LinearZero": ql.PiecewiseLinearZero(*params),
    "CubicZero": ql.PiecewiseCubicZero(*params),
    "LinearForward": ql.PiecewiseLinearForward(*params),
    "SplineCubicDiscount": ql.PiecewiseSplineCubicDiscount(*params)
}

If you inspect the discount factors for the curve nodes, they will be identical:

import pandas as pd

df = pd.DataFrame(index=[row[0] for row in curves['LogLinearDiscount'].nodes()])
for curve in curves:
    dfs = [curves[curve].discount(idx) for idx in df.index]
    df[curve] = dfs

enter image description here

But if you get discount factors from dates that are not given by the instruments used to build the curve, you will get diferent values because you are using diferent interpolation methods on different variables:

new_df = pd.DataFrame(index=[idx + ql.Period('15d') for idx in df.index])
for curve in curves:
    curves[curve].enableExtrapolation()
    dfs = [curves[curve].discount(idx) for idx in new_df.index]
    new_df[curve] = dfs

enter image description here

$\endgroup$
1
  • $\begingroup$ Thank you very much for the answer. One follow up question, I was wondering whether there are also other interpolation methods available when constructing the helpers. In the piecewisecurve.i file I see the ones that you have used, is it possible to export other methods than the ones you have used? $\endgroup$
    – Alepo
    May 10, 2020 at 18:58

Your Answer

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

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