/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.instrument.annuity; import static org.testng.AssertJUnit.assertEquals; import java.util.ArrayList; import java.util.List; import org.testng.annotations.Test; import org.threeten.bp.DayOfWeek; import org.threeten.bp.Period; import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedON; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.instrument.index.IndexONMaster; import com.opengamma.financial.convention.businessday.BusinessDayConvention; import com.opengamma.financial.convention.businessday.BusinessDayConventions; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.convention.daycount.DayCount; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.timeseries.DoubleTimeSeries; import com.opengamma.timeseries.precise.zdt.ImmutableZonedDateTimeDoubleTimeSeries; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; /** * Tests on the constructor of annuity for overnight-indexed coupons with spread. */ @Test(groups = TestGroup.UNIT) public class AnnuityCouponONSpreadSimplifiedDefinitionTest { private static final IndexON EONIA = IndexONMaster.getInstance().getIndex("EONIA"); private static final Period PAYMENT_PERIOD = Period.ofMonths(6); private static final Calendar CALENDAR = new MondayToFridayCalendar("Weekend"); private static final DayCount DAY_COUNT = DayCounts.ACT_360; private static final boolean IS_EOM = true; private static final ZonedDateTime SETTLEMENT_DATE = DateUtils.getUTCDate(2012, 2, 1); private static final ZonedDateTime END_FIXING_DATE = DateUtils.getUTCDate(2022, 2, 1); private static final Period MATURITY_TENOR = Period.ofYears(10); private static final double NOTIONAL = 100000000; private static final double SPREAD = 0.0012; private static final BusinessDayConvention BUSINESS_DAY = BusinessDayConventions.FOLLOWING; private static final GeneratorSwapFixedON GENERATOR = new GeneratorSwapFixedON("OIS", EONIA, PAYMENT_PERIOD, DAY_COUNT, BUSINESS_DAY, IS_EOM, 2, CALENDAR); private static final boolean IS_PAYER = true; private static final AnnuityCouponONSpreadSimplifiedDefinition DEFINITION = AnnuityCouponONSpreadSimplifiedDefinition.from(SETTLEMENT_DATE, END_FIXING_DATE, NOTIONAL, SPREAD, GENERATOR, IS_PAYER); private static final DoubleTimeSeries<ZonedDateTime> FIXING_TS; private static final ZonedDateTime DATE = DateUtils.getUTCDate(2012, 3, 15); static { ZonedDateTime date = SETTLEMENT_DATE; final List<ZonedDateTime> dates = new ArrayList<>(); final List<Double> data = new ArrayList<>(); while (date.isBefore(DATE) || date.equals(DATE)) { dates.add(date); data.add(Math.random() / 100); date = date.plusDays(1); if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) { date = date.plusDays(2); } } FIXING_TS = ImmutableZonedDateTimeDoubleTimeSeries.of(dates, data, ZoneOffset.UTC); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullCoupons() { new AnnuityCouponONSimplifiedDefinition(null, GENERATOR.getIndex(), null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullSettlementDate1() { AnnuityCouponONSimplifiedDefinition.from(null, MATURITY_TENOR, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullPaymentFrequency() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, (Period) null, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullGenerator1() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_TENOR, NOTIONAL, null, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullSettlementDate2() { AnnuityCouponONSimplifiedDefinition.from(null, END_FIXING_DATE, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullMaturityDate() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, (ZonedDateTime) null, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullGenerator2() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, END_FIXING_DATE, NOTIONAL, null, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNoIndexTS() { DEFINITION.toDerivative(DATE); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullDate() { DEFINITION.toDerivative(null, FIXING_TS); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullIndexTS() { DEFINITION.toDerivative(DATE, (DoubleTimeSeries<ZonedDateTime>) null); } @Test public void from() { final AnnuityCouponONSpreadSimplifiedDefinition annuity = AnnuityCouponONSpreadSimplifiedDefinition.from(SETTLEMENT_DATE, END_FIXING_DATE, NOTIONAL, SPREAD, IS_PAYER, PAYMENT_PERIOD, EONIA, 2, BUSINESS_DAY, IS_EOM, CALENDAR); final int nbCouponComputed = annuity.getNumberOfPayments(); final int nbCouponExpected = 20; // 10 year * semi-annual assertEquals("AnnuityCouponONSpreadSimplifiedDefinition: from", nbCouponExpected, nbCouponComputed); assertEquals("AnnuityCouponONSpreadSimplifiedDefinition: from", SETTLEMENT_DATE, annuity.getNthPayment(0).getFixingPeriodStartDate()); assertEquals("AnnuityCouponONSpreadSimplifiedDefinition: from", SETTLEMENT_DATE, annuity.getNthPayment(0).getAccrualStartDate()); assertEquals("AnnuityCouponONSpreadSimplifiedDefinition: from", END_FIXING_DATE, annuity.getNthPayment(nbCouponComputed - 1).getFixingPeriodEndDate()); assertEquals("AnnuityCouponONSpreadSimplifiedDefinition: from", END_FIXING_DATE, annuity.getNthPayment(nbCouponComputed - 1).getAccrualEndDate()); for (int loopcpn = 0; loopcpn < nbCouponComputed; loopcpn++) { assertEquals("AnnuityCouponONSpreadSimplifiedDefinition: from", NOTIONAL * (IS_PAYER ? -1.0 : 1.0), annuity.getNthPayment(loopcpn).getNotional()); assertEquals("AnnuityCouponONSpreadSimplifiedDefinition: from", SPREAD, annuity.getNthPayment(loopcpn).getSpread()); } } }