/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.future.derivative; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.util.ArrayList; import java.util.List; import org.testng.annotations.Test; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.instrument.index.IndexONMaster; import com.opengamma.analytics.util.time.TimeCalculator; 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.util.money.Currency; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; /** * Tests related to the construction of Federal Fund future. */ @Test(groups = TestGroup.UNIT) public class FederalFundsFutureSecurityTest { private static final ZonedDateTime REFERENCE_DATE = DateUtils.getUTCDate(2012, 1, 30); private static final Calendar NYC = new MondayToFridayCalendar("NYC"); private static final IndexON INDEX_FEDFUND = IndexONMaster.getInstance().getIndex("FED FUND"); private static final Currency USD = INDEX_FEDFUND.getCurrency(); private static final BusinessDayConvention BUSINESS_DAY_PRECEDING = BusinessDayConventions.PRECEDING; private static final BusinessDayConvention BUSINESS_DAY_FOLLOWING = BusinessDayConventions.FOLLOWING; private static final ZonedDateTime MARCH_1 = DateUtils.getUTCDate(2012, 3, 1); private static final ZonedDateTime APRIL_1 = DateUtils.getUTCDate(2012, 4, 1); private static final ZonedDateTime LAST_TRADING_DATE = BUSINESS_DAY_PRECEDING.adjustDate(NYC, APRIL_1); private static final ZonedDateTime PERIOD_FIRST_DATE = BUSINESS_DAY_FOLLOWING.adjustDate(NYC, MARCH_1); private static final ZonedDateTime PERIOD_LAST_DATE = BUSINESS_DAY_FOLLOWING.adjustDate(NYC, APRIL_1.minusDays(1)); private static final List<ZonedDateTime> FIXING_LIST = new ArrayList<>(); private static final ZonedDateTime[] FIXING_DATE; static { ZonedDateTime date = PERIOD_FIRST_DATE; while (!date.isAfter(PERIOD_LAST_DATE)) { FIXING_LIST.add(date); date = BUSINESS_DAY_FOLLOWING.adjustDate(NYC, date.plusDays(1)); } FIXING_DATE = FIXING_LIST.toArray(new ZonedDateTime[FIXING_LIST.size()]); } private static final double[] FIXING_ACCURAL_FACTOR = new double[FIXING_DATE.length - 1]; private static final double LAST_TRADING_TIME = TimeCalculator.getTimeBetween(REFERENCE_DATE, LAST_TRADING_DATE); private static final double[] FIXING_TIME = new double[FIXING_DATE.length]; private static double FIXING_TOTAL_ACCURAL_FACTOR = 0.0; static { for (int loopfix = 0; loopfix < FIXING_DATE.length - 1; loopfix++) { FIXING_ACCURAL_FACTOR[loopfix] = INDEX_FEDFUND.getDayCount().getDayCountFraction(FIXING_DATE[loopfix], FIXING_DATE[loopfix + 1]); FIXING_TOTAL_ACCURAL_FACTOR += FIXING_ACCURAL_FACTOR[loopfix]; } for (int loopfix = 0; loopfix < FIXING_DATE.length; loopfix++) { FIXING_TIME[loopfix] = TimeCalculator.getTimeBetween(REFERENCE_DATE, FIXING_DATE[loopfix]); } } private static final double NOTIONAL = 5000000; private static final double PAYMENT_ACCURAL_FACTOR = 1.0 / 12.0; private static final String NAME = "FFH2"; private static final double ACCRUED_INTERESTS = 0; private static final FederalFundsFutureSecurity FUTURE_FEDFUND = new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); @Test(expectedExceptions = IllegalArgumentException.class) public void nullLastTrading() { new FederalFundsFutureSecurity(null, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullFixingTime() { new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, null, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullFixingAccrual() { new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, null, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullName() { new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, null); } @Test(expectedExceptions = IllegalArgumentException.class) public void fixingLength() { new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, new double[3], LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); } @Test /** * Tests the getter methods. */ public void getter() { assertEquals("Fed fund future security", INDEX_FEDFUND, FUTURE_FEDFUND.getIndex()); assertEquals("Fed fund future security", ACCRUED_INTERESTS, FUTURE_FEDFUND.getAccruedInterest()); assertEquals("Fed fund future security", FIXING_TIME, FUTURE_FEDFUND.getFixingPeriodTime()); assertEquals("Fed fund future security", FIXING_ACCURAL_FACTOR, FUTURE_FEDFUND.getFixingPeriodAccrualFactor()); assertEquals("Fed fund future security", NOTIONAL, FUTURE_FEDFUND.getNotional()); assertEquals("Fed fund future security", PAYMENT_ACCURAL_FACTOR, FUTURE_FEDFUND.getPaymentAccrualFactor()); assertEquals("Fed fund future security", NAME, FUTURE_FEDFUND.getName()); assertEquals("Fed fund future security", USD, FUTURE_FEDFUND.getCurrency()); } @Test /** * Tests the equal and hashCode methods. */ public void equalHash() { assertTrue(FUTURE_FEDFUND.equals(FUTURE_FEDFUND)); final FederalFundsFutureSecurity other = new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); assertTrue(FUTURE_FEDFUND.equals(other)); assertTrue(FUTURE_FEDFUND.hashCode() == other.hashCode()); FederalFundsFutureSecurity modifiedFuture; modifiedFuture = new FederalFundsFutureSecurity(IndexONMaster.getInstance().getIndex("EONIA"), ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); assertFalse(FUTURE_FEDFUND.equals(modifiedFuture)); modifiedFuture = new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS + 0.1, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, NAME); assertFalse(FUTURE_FEDFUND.equals(modifiedFuture)); modifiedFuture = new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL + 10.0, PAYMENT_ACCURAL_FACTOR, NAME); assertFalse(FUTURE_FEDFUND.equals(modifiedFuture)); modifiedFuture = new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, 0.25, NAME); assertFalse(FUTURE_FEDFUND.equals(modifiedFuture)); modifiedFuture = new FederalFundsFutureSecurity(INDEX_FEDFUND, ACCRUED_INTERESTS, FIXING_TIME, LAST_TRADING_TIME, FIXING_ACCURAL_FACTOR, FIXING_TOTAL_ACCURAL_FACTOR, NOTIONAL, PAYMENT_ACCURAL_FACTOR, "Wrong"); assertFalse(FUTURE_FEDFUND.equals(modifiedFuture)); assertFalse(FUTURE_FEDFUND.equals(INDEX_FEDFUND)); assertFalse(FUTURE_FEDFUND.equals(null)); } }