/**
* 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.Tenor;
import com.opengamma.strata.basics.index.IborIndex;
import com.opengamma.strata.basics.index.IborIndices;
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.CompoundingMethod;
import com.opengamma.strata.product.swap.ResolvedSwap;
import com.opengamma.strata.product.swap.SwapTrade;
/**
* Test {@link IborIborSwapConventions}.
* <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 IborIborSwapConventionsTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
@DataProvider(name = "spotLag")
static Object[][] data_spot_lag() {
return new Object[][] {
{IborIborSwapConventions.USD_LIBOR_3M_LIBOR_6M, 2},
{IborIborSwapConventions.USD_LIBOR_1M_LIBOR_3M, 2},
{IborIborSwapConventions.JPY_LIBOR_1M_LIBOR_6M, 2},
{IborIborSwapConventions.JPY_LIBOR_3M_LIBOR_6M, 2},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_EUROYEN_6M, 2},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_JAPAN_6M, 2},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_1M_TIBOR_EUROYEN_6M, 2},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_3M_TIBOR_EUROYEN_6M, 2},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_1M_TIBOR_JAPAN_6M, 2},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_3M_TIBOR_JAPAN_6M, 2},
};
}
@Test(dataProvider = "spotLag")
public void test_spot_lag(ImmutableIborIborSwapConvention convention, int lag) {
assertEquals(convention.getSpotDateOffset().getDays(), lag);
}
//-------------------------------------------------------------------------
@DataProvider(name = "period")
static Object[][] data_period() {
return new Object[][] {
{IborIborSwapConventions.USD_LIBOR_3M_LIBOR_6M, Frequency.P6M},
{IborIborSwapConventions.USD_LIBOR_1M_LIBOR_3M, Frequency.P3M},
{IborIborSwapConventions.JPY_LIBOR_1M_LIBOR_6M, Frequency.P1M},
{IborIborSwapConventions.JPY_LIBOR_3M_LIBOR_6M, Frequency.P3M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_EUROYEN_6M, Frequency.P6M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_JAPAN_6M, Frequency.P6M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_1M_TIBOR_EUROYEN_6M, Frequency.P1M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_3M_TIBOR_EUROYEN_6M, Frequency.P3M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_1M_TIBOR_JAPAN_6M, Frequency.P1M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_3M_TIBOR_JAPAN_6M, Frequency.P3M}
};
}
@Test(dataProvider = "period")
public void test_period(IborIborSwapConvention convention, Frequency frequency) {
assertEquals(convention.getSpreadLeg().getPaymentFrequency(), frequency);
}
//-------------------------------------------------------------------------
@DataProvider(name = "dayCount")
static Object[][] data_day_count() {
return new Object[][] {
{IborIborSwapConventions.USD_LIBOR_3M_LIBOR_6M, CompoundingMethod.FLAT},
{IborIborSwapConventions.USD_LIBOR_1M_LIBOR_3M, CompoundingMethod.FLAT},
{IborIborSwapConventions.JPY_LIBOR_1M_LIBOR_6M, CompoundingMethod.NONE},
{IborIborSwapConventions.JPY_LIBOR_3M_LIBOR_6M, CompoundingMethod.NONE},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_EUROYEN_6M, CompoundingMethod.NONE},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_JAPAN_6M, CompoundingMethod.NONE},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_1M_TIBOR_EUROYEN_6M, CompoundingMethod.NONE},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_3M_TIBOR_EUROYEN_6M, CompoundingMethod.NONE},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_1M_TIBOR_JAPAN_6M, CompoundingMethod.NONE},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_3M_TIBOR_JAPAN_6M, CompoundingMethod.NONE}
};
}
@Test(dataProvider = "dayCount")
public void test_composition(IborIborSwapConvention convention, CompoundingMethod comp) {
assertEquals(convention.getSpreadLeg().getCompoundingMethod(), comp);
}
//-------------------------------------------------------------------------
@DataProvider(name = "spreadLeg")
static Object[][] data_spread_leg() {
return new Object[][] {
{IborIborSwapConventions.USD_LIBOR_3M_LIBOR_6M, IborIndices.USD_LIBOR_3M},
{IborIborSwapConventions.USD_LIBOR_1M_LIBOR_3M, IborIndices.USD_LIBOR_1M},
{IborIborSwapConventions.JPY_LIBOR_1M_LIBOR_6M, IborIndices.JPY_LIBOR_1M},
{IborIborSwapConventions.JPY_LIBOR_3M_LIBOR_6M, IborIndices.JPY_LIBOR_3M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_EUROYEN_6M, IborIndices.JPY_LIBOR_6M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_JAPAN_6M, IborIndices.JPY_LIBOR_6M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_1M_TIBOR_EUROYEN_6M, IborIndices.JPY_TIBOR_EUROYEN_1M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_3M_TIBOR_EUROYEN_6M, IborIndices.JPY_TIBOR_EUROYEN_3M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_1M_TIBOR_JAPAN_6M, IborIndices.JPY_TIBOR_JAPAN_1M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_3M_TIBOR_JAPAN_6M, IborIndices.JPY_TIBOR_JAPAN_3M}
};
}
@Test(dataProvider = "spreadLeg")
public void test_float_leg(IborIborSwapConvention convention, IborIndex index) {
assertEquals(convention.getSpreadLeg().getIndex(), index);
}
//-------------------------------------------------------------------------
@DataProvider(name = "flatLeg")
static Object[][] data_flat_leg() {
return new Object[][] {
{IborIborSwapConventions.USD_LIBOR_3M_LIBOR_6M, IborIndices.USD_LIBOR_6M},
{IborIborSwapConventions.USD_LIBOR_1M_LIBOR_3M, IborIndices.USD_LIBOR_3M},
{IborIborSwapConventions.JPY_LIBOR_1M_LIBOR_6M, IborIndices.JPY_LIBOR_6M},
{IborIborSwapConventions.JPY_LIBOR_3M_LIBOR_6M, IborIndices.JPY_LIBOR_6M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_EUROYEN_6M, IborIndices.JPY_TIBOR_EUROYEN_6M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_JAPAN_6M, IborIndices.JPY_TIBOR_JAPAN_6M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_1M_TIBOR_EUROYEN_6M, IborIndices.JPY_TIBOR_EUROYEN_6M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_3M_TIBOR_EUROYEN_6M, IborIndices.JPY_TIBOR_EUROYEN_6M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_1M_TIBOR_JAPAN_6M, IborIndices.JPY_TIBOR_JAPAN_6M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_3M_TIBOR_JAPAN_6M, IborIndices.JPY_TIBOR_JAPAN_6M}
};
}
@Test(dataProvider = "flatLeg")
public void test_flat_leg(IborIborSwapConvention convention, IborIndex index) {
assertEquals(convention.getFlatLeg().getIndex(), index);
}
//-------------------------------------------------------------------------
@DataProvider(name = "dayConvention")
static Object[][] data_day_convention() {
return new Object[][] {
{IborIborSwapConventions.USD_LIBOR_3M_LIBOR_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.USD_LIBOR_1M_LIBOR_3M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_LIBOR_1M_LIBOR_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_LIBOR_3M_LIBOR_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_EUROYEN_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_JAPAN_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_1M_TIBOR_EUROYEN_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_3M_TIBOR_EUROYEN_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_1M_TIBOR_JAPAN_6M, BusinessDayConventions.MODIFIED_FOLLOWING},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_3M_TIBOR_JAPAN_6M, BusinessDayConventions.MODIFIED_FOLLOWING}
};
}
@Test(dataProvider = "dayConvention")
public void test_day_convention(IborIborSwapConvention convention, BusinessDayConvention dayConvention) {
assertEquals(convention.getSpreadLeg().getAccrualBusinessDayAdjustment().getConvention(), dayConvention);
}
//-------------------------------------------------------------------------
@DataProvider(name = "stubIbor")
static Object[][] data_stub_ibor() {
return new Object[][] {
{IborIborSwapConventions.USD_LIBOR_3M_LIBOR_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_LIBOR_1M_LIBOR_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_LIBOR_3M_LIBOR_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_EUROYEN_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_LIBOR_6M_TIBOR_JAPAN_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_1M_TIBOR_EUROYEN_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_TIBOR_EUROYEN_3M_TIBOR_EUROYEN_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_1M_TIBOR_JAPAN_6M, Tenor.TENOR_8M},
{IborIborSwapConventions.JPY_TIBOR_JAPAN_3M_TIBOR_JAPAN_6M, Tenor.TENOR_8M}
};
}
@Test(dataProvider = "stubIbor")
public void test_stub_ibor(IborIborSwapConvention 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(IborIborSwapConventions.class);
coverPrivateConstructor(StandardIborIborSwapConventions.class);
}
}