/** * 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.GBP; import static com.opengamma.strata.basics.currency.Currency.USD; import static com.opengamma.strata.basics.date.DayCounts.ACT_360; import static com.opengamma.strata.basics.index.IborIndices.EUR_EURIBOR_3M; import static com.opengamma.strata.basics.index.IborIndices.EUR_EURIBOR_6M; import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_3M; import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_6M; 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.GBP_SONIA; import static com.opengamma.strata.basics.index.OvernightIndices.USD_FED_FUND; import static com.opengamma.strata.basics.index.PriceIndices.US_CPI_U; import java.time.LocalDate; import com.opengamma.strata.basics.currency.FxMatrix; import com.opengamma.strata.collect.array.DoubleArray; import com.opengamma.strata.collect.timeseries.LocalDateDoubleTimeSeries; import com.opengamma.strata.market.curve.Curve; import com.opengamma.strata.market.curve.CurveMetadata; import com.opengamma.strata.market.curve.CurveName; import com.opengamma.strata.market.curve.Curves; import com.opengamma.strata.market.curve.InterpolatedNodalCurve; 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 RatesProviderDataSets { /** Wednesday. */ public static final LocalDate VAL_DATE_2014_01_22 = LocalDate.of(2014, 1, 22); public static final LocalDate VAL_DATE_END_OF_MONTH = LocalDate.of(2014, 1, 31); public static final DoubleArray TIMES_1 = DoubleArray.of( 0.01, 0.25, 0.50, 1.0, 2.0, 3.0, 5.0, 7.0, 10.0, 30.0); // 10 nodes public static final DoubleArray TIMES_2 = DoubleArray.of( 0.25, 0.50, 1.0, 2.0, 3.0, 5.0, 7.0, 10.0, 30.0); // 9 nodes public static final DoubleArray TIMES_3 = DoubleArray.of( 0.50, 1.0, 2.0, 3.0, 5.0, 7.0, 10.0, 30.0); // 8 nodes public static final DoubleArray TIMES_4 = DoubleArray.of( 10.0, 22.0, 34.0, 58.0, 82.0, 118.0, 178.0); // 7 nodes public static final DoubleArray RATES_1 = DoubleArray.of( 0.0100, 0.0110, 0.0120, 0.0130, 0.0140, 0.0150, 0.0160, 0.0170, 0.0180, 0.0190); public static final DoubleArray RATES_2 = DoubleArray.of( 0.0120, 0.0130, 0.0140, 0.0150, 0.0160, 0.0170, 0.0180, 0.0190, 0.0200); public static final DoubleArray RATES_3 = DoubleArray.of( 0.0140, 0.0150, 0.0160, 0.0170, 0.0180, 0.0190, 0.0200, 0.0210); public static final DoubleArray RATES_1_1 = DoubleArray.of( 0.0100, 0.0110, 0.0120, 0.0130, 0.0140, 0.0150, 0.0160, 0.0170, 0.0180, 0.0190); public static final DoubleArray RATES_2_1 = DoubleArray.of( 0.0120, 0.0130, 0.0140, 0.0150, 0.0160, 0.0170, 0.0180, 0.0190, 0.0200); public static final DoubleArray RATES_3_1 = DoubleArray.of( 0.0140, 0.0150, 0.0160, 0.0170, 0.0180, 0.0190, 0.0200, 0.0210); public static final DoubleArray RATES_1_2 = DoubleArray.of( 0.0200, 0.0210, 0.0220, 0.0230, 0.0240, 0.0250, 0.0260, 0.0270, 0.0280, 0.0290); public static final DoubleArray RATES_2_2 = DoubleArray.of( 0.0220, 0.0230, 0.0240, 0.0250, 0.0260, 0.0270, 0.0280, 0.0290, 0.0300); public static final DoubleArray RATES_3_2 = DoubleArray.of( 0.0240, 0.0250, 0.0260, 0.0270, 0.0280, 0.0290, 0.0300, 0.0310); public static final DoubleArray RATES_1_3 = DoubleArray.of( 0.0150, 0.0160, 0.0170, 0.0180, 0.0190, 0.0200, 0.0210, 0.0220, 0.0230, 0.0240); public static final DoubleArray RATES_2_3 = DoubleArray.of( 0.0170, 0.0180, 0.0190, 0.0200, 0.0210, 0.0220, 0.0230, 0.0240, 0.0250); public static final DoubleArray RATES_3_3 = DoubleArray.of( 0.0190, 0.0200, 0.0210, 0.0220, 0.0230, 0.0240, 0.0250, 0.0260); public static final DoubleArray VALUES_4 = DoubleArray.of( 1.98, 2.05, 2.14, 2.28, 2.42, 2.57, 2.88); // small values for testing purposes public static final DoubleArray RATES_1_1_SIMPLE; public static final DoubleArray RATES_2_1_SIMPLE; public static final DoubleArray RATES_3_1_SIMPLE; public static final DoubleArray RATES_1_2_SIMPLE; public static final DoubleArray RATES_2_2_SIMPLE; public static final DoubleArray RATES_3_2_SIMPLE; public static final DoubleArray RATES_1_3_SIMPLE; public static final DoubleArray RATES_2_3_SIMPLE; public static final DoubleArray RATES_3_3_SIMPLE; static { double[] simple11 = new double[TIMES_1.size()]; double[] simple12 = new double[TIMES_1.size()]; double[] simple13 = new double[TIMES_1.size()]; double[] simple21 = new double[TIMES_2.size()]; double[] simple22 = new double[TIMES_2.size()]; double[] simple23 = new double[TIMES_2.size()]; double[] simple31 = new double[TIMES_3.size()]; double[] simple32 = new double[TIMES_3.size()]; double[] simple33 = new double[TIMES_3.size()]; for (int i = 0; i < TIMES_1.size(); ++i) { simple11[i] = Math.exp(-TIMES_1.get(i) * RATES_1_1.get(i)); simple12[i] = Math.exp(-TIMES_1.get(i) * RATES_1_2.get(i)); simple13[i] = Math.exp(-TIMES_1.get(i) * RATES_1_3.get(i)); } for (int i = 0; i < TIMES_2.size(); ++i) { simple21[i] = Math.exp(-TIMES_2.get(i) * RATES_2_1.get(i)); simple22[i] = Math.exp(-TIMES_2.get(i) * RATES_2_2.get(i)); simple23[i] = Math.exp(-TIMES_2.get(i) * RATES_2_3.get(i)); } for (int i = 0; i < TIMES_3.size(); ++i) { simple31[i] = Math.exp(-TIMES_3.get(i) * RATES_3_1.get(i)); simple32[i] = Math.exp(-TIMES_3.get(i) * RATES_3_2.get(i)); simple33[i] = Math.exp(-TIMES_3.get(i) * RATES_3_3.get(i)); } RATES_1_1_SIMPLE = DoubleArray.copyOf(simple11); RATES_1_2_SIMPLE = DoubleArray.copyOf(simple12); RATES_1_3_SIMPLE = DoubleArray.copyOf(simple13); RATES_2_1_SIMPLE = DoubleArray.copyOf(simple21); RATES_2_2_SIMPLE = DoubleArray.copyOf(simple22); RATES_2_3_SIMPLE = DoubleArray.copyOf(simple23); RATES_3_1_SIMPLE = DoubleArray.copyOf(simple31); RATES_3_2_SIMPLE = DoubleArray.copyOf(simple32); RATES_3_3_SIMPLE = DoubleArray.copyOf(simple33); } //------------------------------------------------------------------------- public static final CurveInterpolator INTERPOLATOR = CurveInterpolators.LINEAR; //------------------------------------------------------------------------- // ===== USD ===== private static final FxMatrix FX_MATRIX_USD = FxMatrix.builder().addRate(USD, USD, 1.00).build(); public static final CurveName USD_SINGLE_NAME = CurveName.of("USD-ALL"); public static final CurveName USD_DSC_NAME = CurveName.of("USD-DSCON"); public static final CurveName USD_L3_NAME = CurveName.of("USD-LIBOR3M"); public static final CurveName USD_L6_NAME = CurveName.of("USD-LIBOR6M"); public static final CurveName USD_CPI_NAME = CurveName.of("US-CPI-U"); private static final CurveMetadata USD_SINGLE_METADATA = Curves.zeroRates(USD_SINGLE_NAME, ACT_360); private static final CurveMetadata USD_DSC_METADATA = Curves.zeroRates(USD_DSC_NAME, ACT_360); private static final CurveMetadata USD_L3_METADATA = Curves.zeroRates(USD_L3_NAME, ACT_360); private static final CurveMetadata USD_L6_METADATA = Curves.zeroRates(USD_L6_NAME, ACT_360); private static final CurveMetadata USD_DSC_METADATA_SIMPLE = Curves.discountFactors(USD_DSC_NAME, ACT_360); private static final CurveMetadata USD_L3_METADATA_SIMPLE = Curves.discountFactors(USD_L3_NAME, ACT_360); private static final CurveMetadata USD_L6_METADATA_SIMPLE = Curves.discountFactors(USD_L6_NAME, ACT_360); private static final CurveMetadata PRICE_INDEX_METADATA = Curves.prices(USD_CPI_NAME); private static final Curve USD_SINGLE_CURVE = InterpolatedNodalCurve.of(USD_SINGLE_METADATA, TIMES_1, RATES_1_1, INTERPOLATOR); private static final LocalDateDoubleTimeSeries PRICE_INDEX_TS = LocalDateDoubleTimeSeries.of(VAL_DATE_END_OF_MONTH, 193.0); public static final ImmutableRatesProvider SINGLE_USD = singleUsd(VAL_DATE_2014_01_22); public static final ImmutableRatesProvider singleUsd(LocalDate valDate) { return ImmutableRatesProvider.builder(valDate) .fxRateProvider(FX_MATRIX_USD) .discountCurve(USD, USD_SINGLE_CURVE) .overnightIndexCurve(USD_FED_FUND, USD_SINGLE_CURVE) .iborIndexCurve(USD_LIBOR_3M, USD_SINGLE_CURVE) .iborIndexCurve(USD_LIBOR_6M, USD_SINGLE_CURVE) .build(); } //------------------------------------------------------------------------- private static final Curve USD_DSC = InterpolatedNodalCurve.of(USD_DSC_METADATA, TIMES_1, RATES_1_1, INTERPOLATOR); private static final Curve USD_L3 = InterpolatedNodalCurve.of(USD_L3_METADATA, TIMES_2, RATES_2_1, INTERPOLATOR); private static final Curve USD_L6 = InterpolatedNodalCurve.of(USD_L6_METADATA, TIMES_3, RATES_3_1, INTERPOLATOR); private static final Curve USD_DSC_SIMPLE = InterpolatedNodalCurve.of(USD_DSC_METADATA_SIMPLE, TIMES_1, RATES_1_1_SIMPLE, INTERPOLATOR); private static final Curve USD_L3_SIMPLE = InterpolatedNodalCurve.of(USD_L3_METADATA_SIMPLE, TIMES_2, RATES_2_1_SIMPLE, INTERPOLATOR); private static final Curve USD_L6_SIMPLE = InterpolatedNodalCurve.of(USD_L6_METADATA_SIMPLE, TIMES_3, RATES_3_1_SIMPLE, INTERPOLATOR); private static final InterpolatedNodalCurve US_CPI_U_CURVE = InterpolatedNodalCurve.of(PRICE_INDEX_METADATA, TIMES_4, VALUES_4, INTERPOLATOR); public static final ImmutableRatesProvider MULTI_USD = multiUsd(VAL_DATE_2014_01_22); public static final ImmutableRatesProvider multiUsd(LocalDate valDate) { return ImmutableRatesProvider.builder(valDate) .fxRateProvider(FX_MATRIX_USD) .discountCurve(USD, USD_DSC) .overnightIndexCurve(USD_FED_FUND, USD_DSC) .iborIndexCurve(USD_LIBOR_3M, USD_L3) .iborIndexCurve(USD_LIBOR_6M, USD_L6) .build(); } public static final ImmutableRatesProvider MULTI_CPI_USD = ImmutableRatesProvider.builder(VAL_DATE_2014_01_22) .fxRateProvider(FX_MATRIX_USD) .discountCurve(USD, USD_DSC) .overnightIndexCurve(USD_FED_FUND, USD_DSC) .iborIndexCurve(USD_LIBOR_3M, USD_L3) .iborIndexCurve(USD_LIBOR_6M, USD_L6) .priceIndexCurve(US_CPI_U, US_CPI_U_CURVE) .timeSeries(US_CPI_U, PRICE_INDEX_TS) .build(); //------------------------------------------------------------------------- // ===== GBP ===== private static final FxMatrix FX_MATRIX_GBP = FxMatrix.builder().addRate(GBP, GBP, 1.00).build(); public static final CurveName GBP_DSC_NAME = CurveName.of("GBP-DSCON"); public static final CurveName GBP_L3_NAME = CurveName.of("GBP-LIBOR3M"); public static final CurveName GBP_L6_NAME = CurveName.of("GBP-LIBOR6M"); private static final CurveMetadata GBP_DSC_METADATA = Curves.zeroRates(GBP_DSC_NAME, ACT_360); private static final CurveMetadata GBP_L3_METADATA = Curves.zeroRates(GBP_L3_NAME, ACT_360); private static final CurveMetadata GBP_L6_METADATA = Curves.zeroRates(GBP_L6_NAME, ACT_360); private static final CurveMetadata GBP_DSC_METADATA_SIMPLE = Curves.discountFactors(GBP_DSC_NAME, ACT_360); private static final CurveMetadata GBP_L3_METADATA_SIMPLE = Curves.discountFactors(GBP_L3_NAME, ACT_360); private static final CurveMetadata GBP_L6_METADATA_SIMPLE = Curves.discountFactors(GBP_L6_NAME, ACT_360); private static final Curve GBP_DSC = InterpolatedNodalCurve.of(GBP_DSC_METADATA, TIMES_1, RATES_1_2, INTERPOLATOR); private static final Curve GBP_L3 = InterpolatedNodalCurve.of(GBP_L3_METADATA, TIMES_2, RATES_2_2, INTERPOLATOR); private static final Curve GBP_L6 = InterpolatedNodalCurve.of(GBP_L6_METADATA, TIMES_3, RATES_3_2, INTERPOLATOR); private static final Curve GBP_DSC_SIMPLE = InterpolatedNodalCurve.of(GBP_DSC_METADATA_SIMPLE, TIMES_1, RATES_1_2_SIMPLE, INTERPOLATOR); private static final Curve GBP_L3_SIMPLE = InterpolatedNodalCurve.of(GBP_L3_METADATA_SIMPLE, TIMES_2, RATES_2_2_SIMPLE, INTERPOLATOR); private static final Curve GBP_L6_SIMPLE = InterpolatedNodalCurve.of(GBP_L6_METADATA_SIMPLE, TIMES_3, RATES_3_2_SIMPLE, INTERPOLATOR); public static final ImmutableRatesProvider MULTI_GBP = multiGbp(VAL_DATE_2014_01_22); public static final ImmutableRatesProvider multiGbp(LocalDate valDate) { return ImmutableRatesProvider.builder(valDate) .fxRateProvider(FX_MATRIX_GBP) .discountCurve(GBP, GBP_DSC) .overnightIndexCurve(GBP_SONIA, GBP_DSC) .iborIndexCurve(GBP_LIBOR_3M, GBP_L3) .iborIndexCurve(GBP_LIBOR_6M, GBP_L6) .build(); } //------------------------------------------------------------------------- // ===== EUR ===== private static final FxMatrix FX_MATRIX_EUR = FxMatrix.builder().addRate(EUR, EUR, 1.00).build(); public static final CurveName EUR_DSC_NAME = CurveName.of("EUR-DSCON"); public static final CurveName EUR_L3_NAME = CurveName.of("EUR-LIBOR3M"); public static final CurveName EUR_L6_NAME = CurveName.of("EUR-LIBOR6M"); private static final CurveMetadata EUR_DSC_METADATA = Curves.zeroRates(EUR_DSC_NAME, ACT_360); private static final CurveMetadata EUR_L3_METADATA = Curves.zeroRates(EUR_L3_NAME, ACT_360); private static final CurveMetadata EUR_L6_METADATA = Curves.zeroRates(EUR_L6_NAME, ACT_360); private static final Curve EUR_DSC = InterpolatedNodalCurve.of(EUR_DSC_METADATA, TIMES_1, RATES_1_2, INTERPOLATOR); private static final Curve EUR_L3 = InterpolatedNodalCurve.of(EUR_L3_METADATA, TIMES_2, RATES_2_2, INTERPOLATOR); private static final Curve EUR_L6 = InterpolatedNodalCurve.of(EUR_L6_METADATA, TIMES_3, RATES_3_2, INTERPOLATOR); public static final ImmutableRatesProvider MULTI_EUR = multiEur(VAL_DATE_2014_01_22); public static final ImmutableRatesProvider multiEur(LocalDate valDate) { return ImmutableRatesProvider.builder(valDate) .fxRateProvider(FX_MATRIX_EUR) .discountCurve(EUR, EUR_DSC) .overnightIndexCurve(EUR_EONIA, EUR_DSC) .iborIndexCurve(EUR_EURIBOR_3M, EUR_L3) .iborIndexCurve(EUR_EURIBOR_6M, EUR_L6) .build(); } //------------------------------------------------------------------------- // ===== GBP + USD ===== public static final FxMatrix FX_MATRIX_GBP_USD = FxMatrix.builder().addRate(GBP, USD, 1.50).build(); // zero rate curves public static final ImmutableRatesProvider MULTI_GBP_USD = multiGbpUsd(VAL_DATE_2014_01_22); public static final ImmutableRatesProvider multiGbpUsd(LocalDate valDate) { return ImmutableRatesProvider.builder(valDate) .fxRateProvider(FX_MATRIX_GBP_USD) .discountCurve(GBP, GBP_DSC) .discountCurve(USD, USD_DSC) .overnightIndexCurve(GBP_SONIA, GBP_DSC) .iborIndexCurve(GBP_LIBOR_3M, GBP_L3) .iborIndexCurve(GBP_LIBOR_6M, GBP_L6) .overnightIndexCurve(USD_FED_FUND, USD_DSC) .iborIndexCurve(USD_LIBOR_3M, USD_L3) .iborIndexCurve(USD_LIBOR_6M, USD_L6) .build(); } // discount factor curves public static final ImmutableRatesProvider MULTI_GBP_USD_SIMPLE = multiGbpUsdSimple(VAL_DATE_2014_01_22); public static final ImmutableRatesProvider multiGbpUsdSimple(LocalDate valDate) { return ImmutableRatesProvider.builder(valDate) .fxRateProvider(FX_MATRIX_GBP_USD) .discountCurve(GBP, GBP_DSC_SIMPLE) .discountCurve(USD, USD_DSC_SIMPLE) .overnightIndexCurve(GBP_SONIA, GBP_DSC_SIMPLE) .iborIndexCurve(GBP_LIBOR_3M, GBP_L3_SIMPLE) .iborIndexCurve(GBP_LIBOR_6M, GBP_L6_SIMPLE) .overnightIndexCurve(USD_FED_FUND, USD_DSC_SIMPLE) .iborIndexCurve(USD_LIBOR_3M, USD_L3_SIMPLE) .iborIndexCurve(USD_LIBOR_6M, USD_L6_SIMPLE) .build(); } }