/** * Copyright (C) 2015 - 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.index.OvernightIndices.GBP_SONIA; import static com.opengamma.strata.basics.index.OvernightIndices.USD_FED_FUND; import static com.opengamma.strata.collect.TestHelper.assertSerialization; 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 com.opengamma.strata.collect.TestHelper.date; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertSame; import java.time.LocalDate; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; import com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.basics.currency.CurrencyPair; import com.opengamma.strata.basics.currency.FxMatrix; import com.opengamma.strata.basics.index.OvernightIndexObservation; import com.opengamma.strata.market.sensitivity.MutablePointSensitivities; import com.opengamma.strata.market.sensitivity.PointSensitivities; import com.opengamma.strata.market.sensitivity.PointSensitivityBuilder; import com.opengamma.strata.pricer.ZeroRateSensitivity; /** * Test {@link OvernightRateSensitivity}. */ @Test public class OvernightRateSensitivityTest { private static final ReferenceData REF_DATA = ReferenceData.standard(); private static final LocalDate DATE = date(2015, 8, 27); private static final LocalDate DATE2 = date(2015, 9, 27); private static final OvernightIndexObservation GBP_SONIA_OBSERVATION = OvernightIndexObservation.of(GBP_SONIA, DATE, REF_DATA); private static final OvernightIndexObservation GBP_SONIA_OBSERVATION2 = OvernightIndexObservation.of(GBP_SONIA, DATE2, REF_DATA); private static final OvernightIndexObservation USD_FED_FUND_OBSERVATION2 = OvernightIndexObservation.of(USD_FED_FUND, DATE2, REF_DATA); //------------------------------------------------------------------------- public void test_of_noCurrency() { OvernightRateSensitivity test = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); assertEquals(test.getIndex(), GBP_SONIA); assertEquals(test.getCurrency(), GBP); assertEquals(test.getEndDate(), date(2015, 8, 28)); assertEquals(test.getSensitivity(), 32d); assertEquals(test.getIndex(), GBP_SONIA); } public void test_of_currency() { OvernightRateSensitivity test = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, USD, 32d); assertEquals(test.getIndex(), GBP_SONIA); assertEquals(test.getCurrency(), USD); assertEquals(test.getEndDate(), date(2015, 8, 28)); assertEquals(test.getSensitivity(), 32d); assertEquals(test.getIndex(), GBP_SONIA); } public void test_ofPeriod() { OvernightRateSensitivity test = OvernightRateSensitivity.ofPeriod( GBP_SONIA_OBSERVATION, date(2015, 10, 27), GBP, 32d); assertEquals(test.getIndex(), GBP_SONIA); assertEquals(test.getCurrency(), GBP); assertEquals(test.getEndDate(), date(2015, 10, 27)); assertEquals(test.getSensitivity(), 32d); assertEquals(test.getIndex(), GBP_SONIA); } public void test_badDateOrder() { assertThrowsIllegalArg(() -> OvernightRateSensitivity.ofPeriod(GBP_SONIA_OBSERVATION, DATE, GBP, 32d)); } //------------------------------------------------------------------------- public void test_withCurrency() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); assertSame(base.withCurrency(GBP), base); LocalDate mat = GBP_SONIA_OBSERVATION.getMaturityDate(); OvernightRateSensitivity expected = OvernightRateSensitivity.ofPeriod(GBP_SONIA_OBSERVATION, mat, USD, 32d); OvernightRateSensitivity test = base.withCurrency(USD); assertEquals(test, expected); } //------------------------------------------------------------------------- public void test_withSensitivity() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); OvernightRateSensitivity expected = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 20d); OvernightRateSensitivity test = base.withSensitivity(20d); assertEquals(test, expected); } //------------------------------------------------------------------------- public void test_compareKey() { OvernightRateSensitivity a1 = OvernightRateSensitivity.ofPeriod(GBP_SONIA_OBSERVATION, date(2015, 10, 27), GBP, 32d); OvernightRateSensitivity a2 = OvernightRateSensitivity.ofPeriod(GBP_SONIA_OBSERVATION, date(2015, 10, 27), GBP, 32d); OvernightRateSensitivity b = OvernightRateSensitivity.ofPeriod(USD_FED_FUND_OBSERVATION2, date(2015, 10, 27), GBP, 32d); OvernightRateSensitivity c = OvernightRateSensitivity.ofPeriod(GBP_SONIA_OBSERVATION, date(2015, 10, 27), USD, 32d); OvernightRateSensitivity d = OvernightRateSensitivity.ofPeriod(GBP_SONIA_OBSERVATION2, date(2015, 10, 27), GBP, 32d); OvernightRateSensitivity e = OvernightRateSensitivity.ofPeriod(GBP_SONIA_OBSERVATION, date(2015, 11, 27), GBP, 32d); ZeroRateSensitivity other = ZeroRateSensitivity.of(GBP, 2d, 32d); assertEquals(a1.compareKey(a2), 0); assertEquals(a1.compareKey(b) < 0, true); assertEquals(b.compareKey(a1) > 0, true); assertEquals(a1.compareKey(c) < 0, true); assertEquals(c.compareKey(a1) > 0, true); assertEquals(a1.compareKey(e) < 0, true); assertEquals(d.compareKey(a1) > 0, true); assertEquals(a1.compareKey(d) < 0, true); assertEquals(e.compareKey(a1) > 0, true); assertEquals(a1.compareKey(other) < 0, true); assertEquals(other.compareKey(a1) > 0, true); } //------------------------------------------------------------------------- public void test_convertedTo() { LocalDate fixingDate = DATE; LocalDate endDate = date(2015, 10, 27); double sensi = 32d; OvernightRateSensitivity base = OvernightRateSensitivity.ofPeriod( OvernightIndexObservation.of(GBP_SONIA, fixingDate, REF_DATA), endDate, GBP, sensi); double rate = 1.5d; FxMatrix matrix = FxMatrix.of(CurrencyPair.of(GBP, USD), rate); OvernightRateSensitivity test1 = (OvernightRateSensitivity) base.convertedTo(USD, matrix); OvernightRateSensitivity expected = OvernightRateSensitivity.ofPeriod( OvernightIndexObservation.of(GBP_SONIA, fixingDate, REF_DATA), endDate, USD, rate * sensi); assertEquals(test1, expected); OvernightRateSensitivity test2 = (OvernightRateSensitivity) base.convertedTo(GBP, matrix); assertEquals(test2, base); } //------------------------------------------------------------------------- public void test_multipliedBy() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); OvernightRateSensitivity expected = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d * 3.5d); OvernightRateSensitivity test = base.multipliedBy(3.5d); assertEquals(test, expected); } //------------------------------------------------------------------------- public void test_mapSensitivity() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); OvernightRateSensitivity expected = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 1 / 32d); OvernightRateSensitivity test = base.mapSensitivity(s -> 1 / s); assertEquals(test, expected); } //------------------------------------------------------------------------- public void test_normalize() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); OvernightRateSensitivity test = base.normalize(); assertSame(test, base); } //------------------------------------------------------------------------- public void test_combinedWith() { OvernightRateSensitivity base1 = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); OvernightRateSensitivity base2 = OvernightRateSensitivity.of( OvernightIndexObservation.of(GBP_SONIA, date(2015, 10, 27), REF_DATA), 22d); MutablePointSensitivities expected = new MutablePointSensitivities(); expected.add(base1).add(base2); PointSensitivityBuilder test = base1.combinedWith(base2); assertEquals(test, expected); } public void test_combinedWith_mutable() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); MutablePointSensitivities expected = new MutablePointSensitivities(); expected.add(base); PointSensitivityBuilder test = base.combinedWith(new MutablePointSensitivities()); assertEquals(test, expected); } //------------------------------------------------------------------------- public void test_buildInto() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); MutablePointSensitivities combo = new MutablePointSensitivities(); MutablePointSensitivities test = base.buildInto(combo); assertSame(test, combo); assertEquals(test.getSensitivities(), ImmutableList.of(base)); } //------------------------------------------------------------------------- public void test_build() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); PointSensitivities test = base.build(); assertEquals(test.getSensitivities(), ImmutableList.of(base)); } //------------------------------------------------------------------------- public void test_cloned() { OvernightRateSensitivity base = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); OvernightRateSensitivity test = base.cloned(); assertSame(test, base); } //------------------------------------------------------------------------- public void coverage() { OvernightRateSensitivity test = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); coverImmutableBean(test); OvernightRateSensitivity test2 = OvernightRateSensitivity.of(USD_FED_FUND_OBSERVATION2, 16d); coverBeanEquals(test, test2); } public void test_serialization() { OvernightRateSensitivity test = OvernightRateSensitivity.of(GBP_SONIA_OBSERVATION, 32d); assertSerialization(test); } }