/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.datasets; import static com.opengamma.strata.basics.currency.Currency.EUR; import static com.opengamma.strata.basics.currency.Currency.USD; import static com.opengamma.strata.basics.date.DayCounts.ACT_ACT_ISDA; import static com.opengamma.strata.basics.index.IborIndices.EUR_EURIBOR_3M; import static com.opengamma.strata.basics.index.IborIndices.USD_LIBOR_1M; import static com.opengamma.strata.basics.index.IborIndices.USD_LIBOR_3M; import static com.opengamma.strata.basics.index.IborIndices.USD_LIBOR_6M; import static com.opengamma.strata.basics.index.OvernightIndices.EUR_EONIA; import static com.opengamma.strata.basics.index.OvernightIndices.USD_FED_FUND; import java.time.LocalDate; import com.opengamma.strata.basics.currency.FxMatrix; import com.opengamma.strata.collect.array.DoubleArray; import com.opengamma.strata.market.curve.Curves; import com.opengamma.strata.market.curve.InterpolatedNodalCurve; import com.opengamma.strata.market.curve.interpolator.CurveExtrapolator; import com.opengamma.strata.market.curve.interpolator.CurveExtrapolators; import com.opengamma.strata.market.curve.interpolator.CurveInterpolator; import com.opengamma.strata.market.curve.interpolator.CurveInterpolators; import com.opengamma.strata.pricer.rate.ImmutableRatesProvider; /** * RatesProvider data sets for testing. */ public class StandardDataSets { // values ported from StandardDataSetsMulticurveUSD and StandardDataSetsMulticurveEUR /** Wednesday. */ public static final LocalDate VAL_DATE_2014_01_22 = LocalDate.of(2014, 1, 22); public static final FxMatrix FX_MATRIX = FxMatrix.empty(); public static final FxMatrix FX_MATRIX_EUR_USD = FxMatrix.of(EUR, USD, 1.20); private static final CurveInterpolator INTERPOLATOR = CurveInterpolators.LINEAR; private static final CurveExtrapolator EXTRAPOLATOR = CurveExtrapolators.FLAT; //------------------------------------------------------------------------- // Group 1 // Discounting, Overnight, Libor 1/3/6 //------------------------------------------------------------------------- private static final DoubleArray GROUP1_USD_DSC_TIMES = DoubleArray.of( 0.0027397260273972603d, 0.005479452054794521d, 0.0958904109589041d, 0.1726027397260274d, 0.26301369863013696d, 0.5123287671232877d, 0.7643835616438356d, 1.0164383561643835d, 2.0135040047907777d, 3.010958904109589d, 4.010958904109589d, 5.016438356164383d, 6.016236245227937d, 7.013698630136986d, 8.01095890410959d, 9.01095890410959d, 10.010771764353619d); private static final DoubleArray GROUP1_USD_DSC_VALUES = DoubleArray.of( 0.001774301243044416d, 0.0016475657039787027d, 8.009449792765705e-4d, 7.991342366517293e-4d, 7.76942929281221e-4d, 8.011052753850107e-4d, 8.544769819435054e-4d, 0.0010101196182894087d, 0.0025295133435066d, 0.005928027386129779d, 0.009984669002766415d, 0.013910233828704998d, 0.017362472692574273d, 0.020265668368085216d, 0.02272069332675378d, 0.02478235199041099d, 0.026505391310201267); public static final InterpolatedNodalCurve GROUP1_USD_DSC = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("USD-DSCON-OIS", ACT_ACT_ISDA)) .xValues(GROUP1_USD_DSC_TIMES) .yValues(GROUP1_USD_DSC_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); public static final InterpolatedNodalCurve GROUP1_USD_ON = GROUP1_USD_DSC; //------------------------------------------------------------------------- private static final DoubleArray GROUP1_USD_L1M_TIMES = DoubleArray.of( 0.09041095890410959d, 0.5013698630136987d, 0.7534246575342466d, 1.010958904109589d, 2.0162362452279363d, 3.0136986301369864d, 4.010958904109589d, 5.005479452054795d, 7.016438356164383d, 10.010771764353619d, 12.01095890410959d, 15.01095890410959d, 20.01095890410959d, 25.008219178082193d, 30.016236245227937d); private static final DoubleArray GROUP1_USD_L1M_VALUES = DoubleArray.of( 0.001561285369284162d, 0.001677637032983316d, 0.0017963184917998965d, 0.0019241139503541746d, 0.0037825750499024123d, 0.00744254801877514d, 0.011692283234671374d, 0.015736966207301174d, 0.02235969769823604d, 0.028782832293124807d, 0.03156162339762925d, 0.03428973495769252d, 0.03649965088741946d, 0.0373988585367752d, 0.037751996205357616d); public static final InterpolatedNodalCurve GROUP1_USD_L1M = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("USD-LIBOR1M-FRABS", ACT_ACT_ISDA)) .xValues(GROUP1_USD_L1M_TIMES) .yValues(GROUP1_USD_L1M_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); //------------------------------------------------------------------------- private static final DoubleArray GROUP1_USD_L3M_TIMES = DoubleArray.of( 0.25205479452054796d, 0.5013698630136987d, 0.7534246575342466d, 1.010958904109589d, 2.0107717643536196d, 3.0054794520547947d, 4.005479452054795d, 5.005479452054795d, 7.010958904109589d, 10.005307283479302d, 12.01095890410959d, 15.005479452054795d, 20.005479452054793d, 25.008219178082193d, 30.01077176435362d); private static final DoubleArray GROUP1_USD_L3M_VALUES = DoubleArray.of( 0.0023773794390540754d, 0.002418692953929592d, 0.002500627386941208d, 0.0026475398935223386d, 0.004482958991370022d, 0.008123927669512582d, 0.012380488135102554d, 0.016448386998565587d, 0.023026212753825527d, 0.02933978147314788d, 0.03208786808445603d, 0.03475307015968327d, 0.03689179443401797d, 0.03776622232525567d, 0.03810645431268752d); public static final InterpolatedNodalCurve GROUP1_USD_L3M = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("USD-LIBOR3M-FRAIRS", ACT_ACT_ISDA)) .xValues(GROUP1_USD_L3M_TIMES) .yValues(GROUP1_USD_L3M_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); //------------------------------------------------------------------------- private static final DoubleArray GROUP1_USD_L6M_TIMES = DoubleArray.of( 0.5013698630136987d, 0.7534246575342466d, 1.0136986301369864d, 2.0107717643536196d, 3.008219178082192d, 4.005479452054795d, 5.005479452054795d, 7.010958904109589d, 10.005307283479302d, 12.013698630136986d, 15.005479452054795d, 20.008219178082193d, 25.01095890410959d, 30.01077176435362d); private static final DoubleArray GROUP1_USD_L6M_VALUES = DoubleArray.of( 0.003340024121442567d, 0.0034093794939005517d, 0.0035662655276726372d, 0.005397906145818395d, 0.00904615066816097d, 0.013303401778277804d, 0.0173694782570321d, 0.02398703895533916d, 0.030336147956946564d, 0.03313011714776066d, 0.03581566678731747d, 0.03793869351638767d, 0.038810658906253376d, 0.03914178215349321d); public static final InterpolatedNodalCurve GROUP1_USD_L6M = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("USD-LIBOR6M-FRABS", ACT_ACT_ISDA)) .xValues(GROUP1_USD_L6M_TIMES) .yValues(GROUP1_USD_L6M_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); //------------------------------------------------------------------------- // Group 2 // curve group with two curves (ONDSC-OIS/LIBOR3M-FRAIRS). // ONDSC-OIS was calibrated on OIS up to 10Y and LIBOR3M-FRAIRS was calibrated on FRA and IRS up to 30Y //------------------------------------------------------------------------- private static final DoubleArray GROUP2_USD_DSC_TIMES = DoubleArray.of( 0.0027397260273972603d, 0.005479452054794521d, 0.0958904109589041d, 0.1726027397260274d, 0.26301369863013696d, 0.5123287671232877d, 0.7643835616438356d, 1.0164383561643835d, 2.0135040047907777d, 3.010958904109589d, 4.010958904109589d, 5.016438356164383d, 6.016236245227937d, 7.013698630136986d, 8.01095890410959d, 9.01095890410959d, 10.010771764353619d); private static final DoubleArray GROUP2_USD_DSC_VALUES = DoubleArray.of( 0.0016222186172986405d, 0.00162221861730832d, 7.299773709349916E-4d, 8.670549606040686E-4d, 9.700626686374421E-4d, 9.177530275077657E-4d, 0.0010750576630832423d, 0.0012058612411863369d, 0.0032359093289564553d, 0.007163512731127383d, 0.011437211252834173d, 0.015530046481112931d, 0.018986079596038204d, 0.021785532652164402d, 0.024156440792908775d, 0.026125713163116404d, 0.027830307875488028d); public static final InterpolatedNodalCurve GROUP2_USD_DSC = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("USD-DSCON-OIS", ACT_ACT_ISDA)) .xValues(GROUP2_USD_DSC_TIMES) .yValues(GROUP2_USD_DSC_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); public static final InterpolatedNodalCurve GROUP2_USD_ON = GROUP2_USD_DSC; //------------------------------------------------------------------------- private static final DoubleArray GROUP2_USD_L3M_TIMES = DoubleArray.of( 0.25205479452054796d, 0.5013698630136987d, 0.7534246575342466d, 1.010958904109589d, 2.0107717643536196d, 3.0054794520547947d, 4.005479452054795d, 5.005479452054795d, 7.010958904109589d, 10.005307283479302d, 12.01095890410959d, 15.005479452054795d, 20.005479452054793d, 25.008219178082193d, 30.01077176435362d); private static final DoubleArray GROUP2_USD_L3M_VALUES = DoubleArray.of( 0.0023981519275776695d, 0.0025072335113249054d, 0.002672247938415502d, 0.0029388810318777664d, 0.005025004780170895d, 0.009394666160082296d, 0.013869551864087672d, 0.017472135847472845d, 0.02446348818110633d, 0.030235440372473818d, 0.03317759744596232d, 0.03565652765470901d, 0.03766720986914944d, 0.038414911035240557d, 0.03867657324723196d); public static final InterpolatedNodalCurve GROUP2_USD_L3M = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("USD-LIBOR3M-FRAIRS", ACT_ACT_ISDA)) .xValues(GROUP2_USD_L3M_TIMES) .yValues(GROUP2_USD_L3M_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); //------------------------------------------------------------------------- private static final DoubleArray GROUP2_EUR_DSC_TIMES = DoubleArray.of( 0.0027397260273972603d, 0.005479452054794521d, 0.08493150684931507d, 0.17534246575342466d, 0.25205479452054796d, 0.5041095890410959d, 0.7561643835616438d, 1.0136986301369864d, 2.0133018938543303d, 3.008219178082192d, 4.008219178082192d, 5.008219178082192d, 7.013698630136986d, 10.007837412980013d, 12.013698630136986d, 15.008219178082191d); private static final DoubleArray GROUP2_EUR_DSC_VALUES = DoubleArray.of( 9.88540328028829E-4d, 0.0016348915995835695d, 0.0016862448998847426d, 0.0015546295156997848d, 0.0014447983014907026d, 0.0012082816674727926d, 0.0011379440970582747d, 0.0010705162326298077d, 0.0014509089700443698d, 0.002528095999360014d, 0.004350134523697582d, 0.006441998340216978d, 0.01063335354910032d, 0.016080880989322904d, 0.018609566754615454d, 0.021475823757363427d); public static final InterpolatedNodalCurve GROUP2_EUR_DSC = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("EUR-DSCON-OIS", ACT_ACT_ISDA)) .xValues(GROUP2_EUR_DSC_TIMES) .yValues(GROUP2_EUR_DSC_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); public static final InterpolatedNodalCurve GROUP2_EUR_ON = GROUP2_EUR_DSC; //------------------------------------------------------------------------- private static final DoubleArray GROUP2_EUR_L3M_TIMES = DoubleArray.of( 0.2493150684931507d, 0.5013698630136987d, 0.7534246575342466d, 1.0054794520547945d, 2.010569653417172d, 3.008219178082192d, 4.005479452054795d, 5.005479452054795d, 6.005105172542855d, 7.010958904109589d, 8.01095890410959d, 9.008219178082191d, 10.005105172542855d, 12.005479452054795d, 15.005479452054795d, 20.008219178082193d, 30.01056965341717d); private static final DoubleArray GROUP2_EUR_L3M_VALUES = DoubleArray.of( 0.002908829285511484d, 0.002679595161474885d, 0.002610519134119294d, 0.0026038833073547614d, 0.003075239896709737d, 0.004451934843682878d, 0.0064044094866778966d, 0.008564374298554072d, 0.01069642266568141d, 0.012743948064905818d, 0.01463683846130409d, 0.016353074919227956d, 0.017875887346528844d, 0.020470246422656945d, 0.023099261079406665d, 0.024998109586262342d, 0.02549542298737718d); public static final InterpolatedNodalCurve GROUP2_EUR_L3M = InterpolatedNodalCurve.builder() .metadata(Curves.zeroRates("EUR-EURIBOR3M-FRAIRS", ACT_ACT_ISDA)) .xValues(GROUP2_EUR_L3M_TIMES) .yValues(GROUP2_EUR_L3M_VALUES) .extrapolatorLeft(EXTRAPOLATOR) .interpolator(INTERPOLATOR) .extrapolatorRight(EXTRAPOLATOR) .build(); //------------------------------------------------------------------------- /** * Provides rates for USD Discounting, Overnight FedFund and Libor 1/3/6 month. * * @return the rates provider */ public static ImmutableRatesProvider providerUsdDscOnL1L3L6() { // data from group 1 return ImmutableRatesProvider.builder(VAL_DATE_2014_01_22) .fxRateProvider(FX_MATRIX) .discountCurve(USD, GROUP1_USD_DSC) .overnightIndexCurve(USD_FED_FUND, GROUP1_USD_ON) .iborIndexCurve(USD_LIBOR_1M, GROUP1_USD_L1M) .iborIndexCurve(USD_LIBOR_3M, GROUP1_USD_L3M) .iborIndexCurve(USD_LIBOR_6M, GROUP1_USD_L6M) .build(); } //------------------------------------------------------------------------- /** * Provides rates for USD and EUR Discounting, Libor 3 month and Euribor 3M. * * @return the rates provider */ public static ImmutableRatesProvider providerUsdEurDscL3() { // data from group 2 return ImmutableRatesProvider.builder(VAL_DATE_2014_01_22) .fxRateProvider(FX_MATRIX_EUR_USD) .discountCurve(EUR, GROUP2_EUR_DSC) .discountCurve(USD, GROUP2_USD_DSC) .overnightIndexCurve(EUR_EONIA, GROUP2_EUR_ON) .iborIndexCurve(EUR_EURIBOR_3M, GROUP2_EUR_L3M) .overnightIndexCurve(USD_FED_FUND, GROUP2_USD_ON) .iborIndexCurve(USD_LIBOR_3M, GROUP2_USD_L3M) .build(); } }