/** * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.rate; 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_ACT_ISDA; import static com.opengamma.strata.basics.index.FxIndices.GBP_USD_WM; import static com.opengamma.strata.basics.index.IborIndices.USD_LIBOR_3M; import static com.opengamma.strata.basics.index.OvernightIndices.USD_FED_FUND; import static com.opengamma.strata.basics.index.PriceIndices.GB_RPI; import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg; import static org.testng.Assert.assertEquals; import java.time.LocalDate; import org.testng.annotations.Test; 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.ConstantCurve; import com.opengamma.strata.market.curve.Curve; 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.DiscountFactors; /** * Tests {@link ImmutableRatesProvider}. */ @Test public class ImmutableRatesProviderCombineTest { private static final LocalDate PREV_DATE = LocalDate.of(2014, 6, 27); private static final LocalDate VAL_DATE = LocalDate.of(2014, 6, 30); private static final double FX_GBP_USD = 1.6d; private static final FxMatrix FX_MATRIX = FxMatrix.of(GBP, USD, FX_GBP_USD); private static final CurveInterpolator INTERPOLATOR = CurveInterpolators.LINEAR; private static final double GBP_DSC = 0.99d; private static final double USD_DSC = 0.95d; private static final Curve DISCOUNT_CURVE_GBP = ConstantCurve.of( Curves.zeroRates("GBP-DSCON", ACT_ACT_ISDA), GBP_DSC); private static final Curve DISCOUNT_CURVE_USD = ConstantCurve.of( Curves.zeroRates("USD-DSCON", ACT_ACT_ISDA), USD_DSC); private static final Curve USD_LIBOR_CURVE = ConstantCurve.of( Curves.zeroRates("USD-LIBOR-3M", ACT_ACT_ISDA), 0.96d); private static final Curve FED_FUND_CURVE = ConstantCurve.of( Curves.zeroRates("USD-FED_FUND", ACT_ACT_ISDA), 0.97d); private static final Curve GBPRI_CURVE = InterpolatedNodalCurve.of( Curves.prices("GB-RPI"), DoubleArray.of(1d, 10d), DoubleArray.of(252d, 252d), INTERPOLATOR); private static final LocalDateDoubleTimeSeries TS = LocalDateDoubleTimeSeries.of(PREV_DATE, 0.62d); public void merge_content_2() { ImmutableRatesProvider test1 = ImmutableRatesProvider.builder(VAL_DATE) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .timeSeries(GBP_USD_WM, TS) .build(); ImmutableRatesProvider test2 = ImmutableRatesProvider.builder(VAL_DATE) .discountCurve(USD, DISCOUNT_CURVE_USD) .iborIndexCurve(USD_LIBOR_3M, USD_LIBOR_CURVE) .overnightIndexCurve(USD_FED_FUND, FED_FUND_CURVE) .priceIndexCurve(GB_RPI, GBPRI_CURVE) .timeSeries(GB_RPI, TS) .build(); ImmutableRatesProvider merged = ImmutableRatesProvider.combined(FX_MATRIX, test1, test2); assertEquals(merged.getValuationDate(), VAL_DATE); assertEquals(merged.discountFactors(USD), DiscountFactors.of(USD, VAL_DATE, DISCOUNT_CURVE_USD)); assertEquals(merged.discountFactors(GBP), DiscountFactors.of(GBP, VAL_DATE, DISCOUNT_CURVE_GBP)); assertEquals(merged.iborIndexRates(USD_LIBOR_3M), IborIndexRates.of(USD_LIBOR_3M, VAL_DATE, USD_LIBOR_CURVE)); assertEquals(merged.overnightIndexRates(USD_FED_FUND), OvernightIndexRates.of(USD_FED_FUND, VAL_DATE, FED_FUND_CURVE)); assertEquals(merged.priceIndexValues(GB_RPI), PriceIndexValues.of(GB_RPI, VAL_DATE, GBPRI_CURVE, TS)); assertEquals(merged.timeSeries(GBP_USD_WM), TS); assertEquals(merged.getFxRateProvider(), FX_MATRIX); } public void merge_content_3() { ImmutableRatesProvider test1 = ImmutableRatesProvider.builder(VAL_DATE) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .timeSeries(GBP_USD_WM, TS) .build(); ImmutableRatesProvider test2 = ImmutableRatesProvider.builder(VAL_DATE) .iborIndexCurve(USD_LIBOR_3M, USD_LIBOR_CURVE) .overnightIndexCurve(USD_FED_FUND, FED_FUND_CURVE) .build(); ImmutableRatesProvider test3 = ImmutableRatesProvider.builder(VAL_DATE) .discountCurve(USD, DISCOUNT_CURVE_USD) .priceIndexCurve(GB_RPI, GBPRI_CURVE) .timeSeries(GB_RPI, TS) .build(); ImmutableRatesProvider merged = ImmutableRatesProvider.combined(FX_MATRIX, test1, test2, test3); assertEquals(merged.getValuationDate(), VAL_DATE); assertEquals(merged.discountFactors(USD), DiscountFactors.of(USD, VAL_DATE, DISCOUNT_CURVE_USD)); assertEquals(merged.discountFactors(GBP), DiscountFactors.of(GBP, VAL_DATE, DISCOUNT_CURVE_GBP)); assertEquals(merged.iborIndexRates(USD_LIBOR_3M), IborIndexRates.of(USD_LIBOR_3M, VAL_DATE, USD_LIBOR_CURVE)); assertEquals(merged.overnightIndexRates(USD_FED_FUND), OvernightIndexRates.of(USD_FED_FUND, VAL_DATE, FED_FUND_CURVE)); assertEquals(merged.priceIndexValues(GB_RPI), PriceIndexValues.of(GB_RPI, VAL_DATE, GBPRI_CURVE, TS)); assertEquals(merged.timeSeries(GBP_USD_WM), TS); assertEquals(merged.getFxRateProvider(), FX_MATRIX); } public void merge_illegal_arguments() { ImmutableRatesProvider test_dsc = ImmutableRatesProvider.builder(VAL_DATE) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .build(); ImmutableRatesProvider test_ts = ImmutableRatesProvider.builder(VAL_DATE) .timeSeries(GBP_USD_WM, TS) .build(); ImmutableRatesProvider test_ibor = ImmutableRatesProvider.builder(VAL_DATE) .iborIndexCurve(USD_LIBOR_3M, USD_LIBOR_CURVE) .build(); ImmutableRatesProvider test_on = ImmutableRatesProvider.builder(VAL_DATE) .overnightIndexCurve(USD_FED_FUND, FED_FUND_CURVE) .build(); ImmutableRatesProvider test_pi = ImmutableRatesProvider.builder(VAL_DATE) .priceIndexCurve(GB_RPI, GBPRI_CURVE) .build(); assertThrowsIllegalArg(() -> ImmutableRatesProvider.combined(FX_MATRIX, test_dsc, test_dsc)); assertThrowsIllegalArg(() -> ImmutableRatesProvider.combined(FX_MATRIX, test_ts, test_ts)); assertThrowsIllegalArg(() -> ImmutableRatesProvider.combined(FX_MATRIX, test_ibor, test_ibor)); assertThrowsIllegalArg(() -> ImmutableRatesProvider.combined(FX_MATRIX, test_on, test_on)); assertThrowsIllegalArg(() -> ImmutableRatesProvider.combined(FX_MATRIX, test_pi, test_pi)); } }