/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.product.swap.type; import static com.opengamma.strata.collect.TestHelper.coverPrivateConstructor; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import java.time.LocalDate; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.basics.date.BusinessDayConvention; import com.opengamma.strata.basics.date.BusinessDayConventions; import com.opengamma.strata.basics.date.DayCount; import com.opengamma.strata.basics.date.DayCounts; import com.opengamma.strata.basics.date.Tenor; import com.opengamma.strata.basics.index.OvernightIndex; import com.opengamma.strata.basics.index.OvernightIndices; import com.opengamma.strata.basics.schedule.Frequency; import com.opengamma.strata.product.common.BuySell; import com.opengamma.strata.product.common.PayReceive; import com.opengamma.strata.product.swap.ResolvedSwap; import com.opengamma.strata.product.swap.SwapTrade; /** * Test {@link FixedOvernightSwapConventions}. * <p> * These tests match the table 18.1 in the following guide: * http://www.opengamma.com/sites/default/files/interest-rate-instruments-and-market-conventions.pdf */ @Test public class FixedOvernightSwapConventionsTest { private static final ReferenceData REF_DATA = ReferenceData.standard(); @DataProvider(name = "spotLag") static Object[][] data_spot_lag() { return new Object[][] { {FixedOvernightSwapConventions.USD_FIXED_TERM_FED_FUND_OIS, 2}, {FixedOvernightSwapConventions.USD_FIXED_1Y_FED_FUND_OIS, 2}, {FixedOvernightSwapConventions.EUR_FIXED_TERM_EONIA_OIS, 2}, {FixedOvernightSwapConventions.EUR_FIXED_1Y_EONIA_OIS, 2}, {FixedOvernightSwapConventions.GBP_FIXED_TERM_SONIA_OIS, 0}, {FixedOvernightSwapConventions.GBP_FIXED_1Y_SONIA_OIS, 0}, {FixedOvernightSwapConventions.JPY_FIXED_TERM_TONAR_OIS, 0}, {FixedOvernightSwapConventions.JPY_FIXED_1Y_TONAR_OIS, 2}, }; } @Test(dataProvider = "spotLag") public void test_spot_lag(ImmutableFixedOvernightSwapConvention convention, int lag) { assertEquals(convention.getSpotDateOffset().getDays(), lag); } //------------------------------------------------------------------------- @DataProvider(name = "period") static Object[][] data_period() { return new Object[][] { {FixedOvernightSwapConventions.USD_FIXED_TERM_FED_FUND_OIS, Frequency.TERM}, {FixedOvernightSwapConventions.USD_FIXED_1Y_FED_FUND_OIS, Frequency.P12M}, {FixedOvernightSwapConventions.EUR_FIXED_TERM_EONIA_OIS, Frequency.TERM}, {FixedOvernightSwapConventions.EUR_FIXED_1Y_EONIA_OIS, Frequency.P12M}, {FixedOvernightSwapConventions.GBP_FIXED_TERM_SONIA_OIS, Frequency.TERM}, {FixedOvernightSwapConventions.GBP_FIXED_1Y_SONIA_OIS, Frequency.P12M}, {FixedOvernightSwapConventions.JPY_FIXED_TERM_TONAR_OIS, Frequency.TERM}, {FixedOvernightSwapConventions.JPY_FIXED_1Y_TONAR_OIS, Frequency.P12M}, }; } @Test(dataProvider = "period") public void test_accrualPeriod(FixedOvernightSwapConvention convention, Frequency frequency) { assertEquals(convention.getFixedLeg().getAccrualFrequency(), frequency); } @Test(dataProvider = "period") public void test_paymentPeriod(FixedOvernightSwapConvention convention, Frequency frequency) { assertEquals(convention.getFixedLeg().getPaymentFrequency(), frequency); } //------------------------------------------------------------------------- @DataProvider(name = "dayCount") static Object[][] data_day_count() { return new Object[][] { {FixedOvernightSwapConventions.USD_FIXED_TERM_FED_FUND_OIS, DayCounts.ACT_360}, {FixedOvernightSwapConventions.USD_FIXED_1Y_FED_FUND_OIS, DayCounts.ACT_360}, {FixedOvernightSwapConventions.EUR_FIXED_TERM_EONIA_OIS, DayCounts.ACT_360}, {FixedOvernightSwapConventions.EUR_FIXED_1Y_EONIA_OIS, DayCounts.ACT_360}, {FixedOvernightSwapConventions.GBP_FIXED_TERM_SONIA_OIS, DayCounts.ACT_365F}, {FixedOvernightSwapConventions.GBP_FIXED_1Y_SONIA_OIS, DayCounts.ACT_365F}, {FixedOvernightSwapConventions.JPY_FIXED_TERM_TONAR_OIS, DayCounts.ACT_365F}, {FixedOvernightSwapConventions.JPY_FIXED_1Y_TONAR_OIS, DayCounts.ACT_365F}, }; } @Test(dataProvider = "dayCount") public void test_day_count(FixedOvernightSwapConvention convention, DayCount dayCount) { assertEquals(convention.getFixedLeg().getDayCount(), dayCount); } //------------------------------------------------------------------------- @DataProvider(name = "floatLeg") static Object[][] data_float_leg() { return new Object[][] { {FixedOvernightSwapConventions.USD_FIXED_TERM_FED_FUND_OIS, OvernightIndices.USD_FED_FUND}, {FixedOvernightSwapConventions.USD_FIXED_1Y_FED_FUND_OIS, OvernightIndices.USD_FED_FUND}, {FixedOvernightSwapConventions.EUR_FIXED_TERM_EONIA_OIS, OvernightIndices.EUR_EONIA}, {FixedOvernightSwapConventions.EUR_FIXED_1Y_EONIA_OIS, OvernightIndices.EUR_EONIA}, {FixedOvernightSwapConventions.GBP_FIXED_TERM_SONIA_OIS, OvernightIndices.GBP_SONIA}, {FixedOvernightSwapConventions.GBP_FIXED_1Y_SONIA_OIS, OvernightIndices.GBP_SONIA}, {FixedOvernightSwapConventions.JPY_FIXED_TERM_TONAR_OIS, OvernightIndices.JPY_TONAR}, {FixedOvernightSwapConventions.JPY_FIXED_1Y_TONAR_OIS, OvernightIndices.JPY_TONAR}, }; } @Test(dataProvider = "floatLeg") public void test_float_leg(FixedOvernightSwapConvention convention, OvernightIndex floatLeg) { assertEquals(convention.getFloatingLeg().getIndex(), floatLeg); } //------------------------------------------------------------------------- @DataProvider(name = "dayConvention") static Object[][] data_day_convention() { return new Object[][] { {FixedOvernightSwapConventions.USD_FIXED_TERM_FED_FUND_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, {FixedOvernightSwapConventions.USD_FIXED_1Y_FED_FUND_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, {FixedOvernightSwapConventions.EUR_FIXED_TERM_EONIA_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, {FixedOvernightSwapConventions.EUR_FIXED_1Y_EONIA_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, {FixedOvernightSwapConventions.GBP_FIXED_TERM_SONIA_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, {FixedOvernightSwapConventions.GBP_FIXED_1Y_SONIA_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, {FixedOvernightSwapConventions.JPY_FIXED_TERM_TONAR_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, {FixedOvernightSwapConventions.JPY_FIXED_1Y_TONAR_OIS, BusinessDayConventions.MODIFIED_FOLLOWING}, }; } @Test(dataProvider = "dayConvention") public void test_day_convention(FixedOvernightSwapConvention convention, BusinessDayConvention dayConvention) { assertEquals(convention.getFixedLeg().getAccrualBusinessDayAdjustment().getConvention(), dayConvention); } //------------------------------------------------------------------------- @DataProvider(name = "stubOn") static Object[][] data_stub_on() { return new Object[][] { {FixedOvernightSwapConventions.USD_FIXED_1Y_FED_FUND_OIS, Tenor.TENOR_18M}, {FixedOvernightSwapConventions.EUR_FIXED_1Y_EONIA_OIS, Tenor.TENOR_18M}, {FixedOvernightSwapConventions.GBP_FIXED_1Y_SONIA_OIS, Tenor.TENOR_18M}, {FixedOvernightSwapConventions.JPY_FIXED_1Y_TONAR_OIS, Tenor.TENOR_18M}, }; } @Test(dataProvider = "stubOn") public void test_stub_overnight(FixedOvernightSwapConvention convention, Tenor tenor) { LocalDate tradeDate = LocalDate.of(2015, 10, 20); SwapTrade swap = convention.createTrade(tradeDate, tenor, BuySell.BUY, 1, 0.01, REF_DATA); ResolvedSwap swapResolved = swap.getProduct().resolve(REF_DATA); LocalDate endDate = swapResolved.getLeg(PayReceive.PAY).get().getEndDate(); assertTrue(endDate.isAfter(tradeDate.plus(tenor).minusMonths(1))); assertTrue(endDate.isBefore(tradeDate.plus(tenor).plusMonths(1))); } //------------------------------------------------------------------------- public void coverage() { coverPrivateConstructor(FixedOvernightSwapConventions.class); coverPrivateConstructor(StandardFixedOvernightSwapConventions.class); } }