EUR curve building with Euribor futures failing to converge

I am trying calibrate multi curve with a discount curve, basis and 6M swap curve. I have done this successfully using just swaps, but I now want to use Euribor futures. When using Euribor futures I get “Failed to converge in backtracking, even after a Jacobian recalculation”.

I’ve redone with very simple example that only has a couple of entries for the three curves, up to 2 years. The configuration works if I include one Euribor future (ERU3), but fails if I include the next one (ERZ3) being unable to converge. The values in the quotes file are from Bloomberg, so I believe are realistic.

It seems I cannot upload zip with simple example, but here are the files used to configure. Is there anything that is obviously wrong? (Btw, I realise Euribor futures are 3 months, and I am using quotes to build 6M curve. This is intentional, but perhaps the quotes need to be adjusted? I tried adding a shift based on convexity values which I believed were realistic but still got the failure)

calibrations file contents:

Curve Name,Label,Symbology,Ticker,Field Name,Type,Convention,Time,Date,Min Gap,Clash Action,Spread
,
EUR-DSCON-OIS,OIS-1M,Identifier,OIS_1M,MarketValue,OIS,EUR-FIXED-1Y-ESTR-OIS,1M,
EUR-DSCON-OIS,OIS-2Y,Identifier,OIS_2Y,MarketValue,OIS,EUR-FIXED-1Y-ESTR-OIS,2Y,
,
EUR-EURIBOR3M-BS,FIX-3M,Identifier,EURIBOR_3M,MarketValue,FIX,EUR-EURIBOR-3M,
EUR-EURIBOR3M-BS,BS-1Y,Identifier,EUR_BS_1M3M_1Y,MarketValue,BS3,EUR-FIXED-1Y-EURIBOR-3M-EURIBOR-6M,1Y,
EUR-EURIBOR3M-BS,BS-2Y,Identifier,EUR_BS_1M3M_2Y,MarketValue,BS3,EUR-FIXED-1Y-EURIBOR-3M-EURIBOR-6M,2Y,
,
EUR-EURIBOR6M-FUTIRS,FIX-6M,Identifier,EURIBOR_6M,MarketValue,FIX,EUR-EURIBOR-6M,
EUR-EURIBOR6M-FUTIRS,FUT-2,Identifier,ERU3,SettlementPrice,IFU,EUR-EURIBOR-3M-IMM-ICE,SEP23,
EUR-EURIBOR6M-FUTIRS,FUT-3,Identifier,ERZ3,SettlementPrice,IFU,EUR-EURIBOR-3M-IMM-ICE,DEC23,
EUR-EURIBOR6M-FUTIRS,IRS-2Y,Identifier,EUR_IRS_2Y,MarketValue,IRS,EUR-FIXED-1Y-EURIBOR-6M,2Y,

quotes file:
Valuation Date,Symbology,Ticker,Field Name,Value
,
2023-03-13,Identifier,OIS_1M,MarketValue,0.00027509
2023-03-13,Identifier,OIS_2Y,MarketValue,0.00036521
,
2023-03-13,Identifier,EURIBOR_3M,MarketValue,0.0002948
2023-03-13,Identifier,EUR_BS_1M3M_1Y,MarketValue,0.00073
2023-03-13,Identifier,EUR_BS_1M3M_2Y,MarketValue,0.00074
,
2023-03-13,Identifier,EURIBOR_6M,MarketValue,0.0003461
2023-03-13,Identifier,ERU3,SettlementPrice,0.959125
2023-03-13,Identifier,ERZ3,SettlementPrice,0.95915
2023-03-13,Identifier,EUR_IRS_2Y,MarketValue,0.000388345

groups file:
Group Name,Curve Type,Reference,Curve Name
EUR-DSCONOIS-EURIBOR3MBS-EURIBOR6MFUTIRS,Discount,EUR,EUR-DSCON-OIS
EUR-DSCONOIS-EURIBOR3MBS-EURIBOR6MFUTIRS,Forward,EUR-ESTR,EUR-DSCON-OIS
EUR-DSCONOIS-EURIBOR3MBS-EURIBOR6MFUTIRS,Forward,EUR-EURIBOR-3M,EUR-EURIBOR3M-BS
EUR-DSCONOIS-EURIBOR3MBS-EURIBOR6MFUTIRS,Forward,EUR-EURIBOR-6M,EUR-EURIBOR6M-FUTIRS

settings file:
Curve Name,Value Type,Day Count,Interpolator,Left Extrapolator,Right Extrapolator
EUR-DSCON-OIS,df,Act/365F,LogNaturalSplineDiscountFactor,Interpolator,LogLinear
EUR-EURIBOR3M-BS,df,Act/365F,LogNaturalSplineDiscountFactor,Interpolator,LogLinear
EUR-EURIBOR6M-FUTIRS,df,Act/365F,LogNaturalSplineDiscountFactor,Interpolator,LogLinear

The code that runs this is very closed based on CalibrationEur3CheckExample given with Strata-mean.

Please let me know if I can provide more details (shame I cannot upload a zip)

As you indicated, futures are EURIBO-3M based. If you put them on the 6M curve definition, they will create a node (i.e. a time for interpolation) on the 6-month curve but will still be priced with the 3M curve (the trade description still contains EURIBOR-3M as index). In some sense you get too many constraints on the 3 month curves (fixing, 2 futures and 2 basis) for the 3 points and not enough on the 6 month curve (fixing and IRS) for 4 points. You are “lucky” in the one futures case that those issues compensate thanks to the basis swaps that interact between the 2 curves.

1 Like

Thanks very much the for reply Marc, and the clear explanation!
Makes sense.