/** * Copyright (C) 2014 - 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 com.opengamma.strata.collect.TestHelper.coverBeanEquals; import static com.opengamma.strata.collect.TestHelper.coverImmutableBean; import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertSame; import java.time.LocalDate; import org.joda.beans.Bean; import org.joda.beans.ser.JodaBeanSer; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.opengamma.strata.basics.currency.CurrencyPair; 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.ZeroRateDiscountFactors; import com.opengamma.strata.pricer.fx.DiscountFxForwardRates; /** * Test {@link ImmutableRatesProvider}. */ @Test public class ImmutableRatesProviderTest { 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-Discount", ACT_ACT_ISDA), GBP_DSC); private static final Curve DISCOUNT_CURVE_USD = ConstantCurve.of( Curves.zeroRates("USD-Discount", ACT_ACT_ISDA), USD_DSC); private static final Curve USD_LIBOR_CURVE = ConstantCurve.of( Curves.zeroRates("USD-Discount", ACT_ACT_ISDA), 0.96d); private static final Curve FED_FUND_CURVE = ConstantCurve.of( Curves.zeroRates("USD-Discount", 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); //------------------------------------------------------------------------- public void test_builder() { LocalDateDoubleTimeSeries ts = LocalDateDoubleTimeSeries.of(PREV_DATE, 0.62d); ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .timeSeries(GBP_USD_WM, ts) .build(); assertEquals(test.getValuationDate(), VAL_DATE); assertEquals(ImmutableRatesProvider.meta().timeSeries().get(test), ImmutableMap.of(GBP_USD_WM, ts)); assertSame(test.toImmutableRatesProvider(), test); } //------------------------------------------------------------------------- public void test_discountFactors() { ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .discountCurve(USD, DISCOUNT_CURVE_USD) .build(); assertEquals(test.discountFactors(GBP).getCurrency(), GBP); } public void test_discountFactors_notKnown() { ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .build(); assertThrowsIllegalArg(() -> test.discountFactors(GBP)); assertThrowsIllegalArg(() -> test.discountFactor(GBP, LocalDate.of(2014, 7, 30))); } //------------------------------------------------------------------------- public void test_fxRate_separate() { ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .fxRateProvider(FX_MATRIX) .build(); assertEquals(test.fxRate(USD, GBP), 1 / FX_GBP_USD, 0d); assertEquals(test.fxRate(USD, USD), 1d, 0d); } public void test_fxRate_pair() { ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .fxRateProvider(FX_MATRIX) .build(); assertEquals(test.fxRate(CurrencyPair.of(USD, GBP)), 1 / FX_GBP_USD, 0d); } //------------------------------------------------------------------------- public void test_fxIndexRates() { LocalDateDoubleTimeSeries ts = LocalDateDoubleTimeSeries.of(VAL_DATE, 0.62d); ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .fxRateProvider(FX_MATRIX) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .discountCurve(USD, DISCOUNT_CURVE_USD) .timeSeries(GBP_USD_WM, ts) .build(); assertEquals(test.fxIndexRates(GBP_USD_WM).getIndex(), GBP_USD_WM); assertEquals(test.fxIndexRates(GBP_USD_WM).getFixings(), ts); } //------------------------------------------------------------------------- public void test_fxForwardRates() { ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .fxRateProvider(FX_MATRIX) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .discountCurve(USD, DISCOUNT_CURVE_USD) .build(); DiscountFxForwardRates res = (DiscountFxForwardRates) test.fxForwardRates(CurrencyPair.of(GBP, USD)); assertEquals(res.getBaseCurrencyDiscountFactors(), ZeroRateDiscountFactors.of(GBP, VAL_DATE, DISCOUNT_CURVE_GBP)); assertEquals(res.getCounterCurrencyDiscountFactors(), ZeroRateDiscountFactors.of(USD, VAL_DATE, DISCOUNT_CURVE_USD)); assertEquals(res.getCurrencyPair(), CurrencyPair.of(GBP, USD)); assertEquals(res.getFxRateProvider(), FX_MATRIX); assertEquals(res.getValuationDate(), VAL_DATE); } //------------------------------------------------------------------------- public void test_iborIndexRates() { LocalDateDoubleTimeSeries ts = LocalDateDoubleTimeSeries.of(VAL_DATE, 0.62d); ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .iborIndexCurve(USD_LIBOR_3M, USD_LIBOR_CURVE) .timeSeries(USD_LIBOR_3M, ts) .build(); assertEquals(test.iborIndexRates(USD_LIBOR_3M).getIndex(), USD_LIBOR_3M); assertEquals(test.iborIndexRates(USD_LIBOR_3M).getFixings(), ts); } //------------------------------------------------------------------------- public void test_overnightIndexRates() { LocalDateDoubleTimeSeries ts = LocalDateDoubleTimeSeries.of(VAL_DATE, 0.62d); ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .overnightIndexCurve(USD_FED_FUND, FED_FUND_CURVE) .timeSeries(USD_FED_FUND, ts) .build(); assertEquals(test.overnightIndexRates(USD_FED_FUND).getIndex(), USD_FED_FUND); assertEquals(test.overnightIndexRates(USD_FED_FUND).getFixings(), ts); } //------------------------------------------------------------------------- public void test_priceIndexValues() { LocalDateDoubleTimeSeries ts = LocalDateDoubleTimeSeries.of(VAL_DATE, 0.62d); ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .priceIndexCurve(GB_RPI, GBPRI_CURVE) .timeSeries(GB_RPI, ts) .build(); assertEquals(test.priceIndexValues(GB_RPI).getIndex(), GB_RPI); assertEquals(test.priceIndexValues(GB_RPI).getFixings(), ts); } public void test_priceIndexValues_notKnown() { ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .build(); assertThrowsIllegalArg(() -> test.priceIndexValues(GB_RPI)); } //------------------------------------------------------------------------- public void coverage() { ImmutableRatesProvider test = ImmutableRatesProvider.builder(VAL_DATE) .build(); coverImmutableBean(test); ImmutableRatesProvider test2 = ImmutableRatesProvider.builder(LocalDate.of(2014, 6, 27)) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .build(); coverBeanEquals(test, test2); } public void testSerializeDeserialize() { cycleBean(ImmutableRatesProvider.builder(VAL_DATE).build()); } private void cycleBean(Bean bean) { JodaBeanSer ser = JodaBeanSer.COMPACT; String result = ser.xmlWriter().write(bean); Bean cycled = ser.xmlReader().read(result); assertThat(cycled).isEqualTo(bean); } }