/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.convention.daycount; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import org.threeten.bp.ZonedDateTime; import com.opengamma.financial.convention.StubType; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; /** * Test DayCount accrued interest. */ @Test(groups = TestGroup.UNIT) public class DayCountAccruedInterestTest { private static final ActualActualISDA ACT_ACT_ISDA = new ActualActualISDA(); private static final ActualActualAFB ACT_ACT_AFB = new ActualActualAFB(); private static final ActualActualICMA ACT_ACT_ICMA = new ActualActualICMA(); private static final ActualThreeSixty ACT_360 = new ActualThreeSixty(); private static final ActualThreeSixtyFive ACT_365 = new ActualThreeSixtyFive(); private static final ActualThreeSixtyFiveLong ACT_365L = new ActualThreeSixtyFiveLong(); private static final ThirtyUThreeSixty U30_360 = new ThirtyUThreeSixty(); private static final ThirtyEThreeSixty E30_360 = new ThirtyEThreeSixty(); private static final ThirtyEThreeSixtyISDA E30_360_ISDA = new ThirtyEThreeSixtyISDA(); private static final ThirtyEPlusThreeSixtyISDA E_PLUS_30_360_ISDA = new ThirtyEPlusThreeSixtyISDA(); private static final OneOneDayCount ONE_ONE = new OneOneDayCount(); private static final FlatDayCount FLAT = new FlatDayCount(); private static final double EPS = 1e-9; @Test public void testISDAExample1() { final ZonedDateTime d1 = DateUtils.getUTCDate(2003, 11, 1); final ZonedDateTime d2 = DateUtils.getUTCDate(2004, 5, 1); final double coupon = 0.1; final int paymentsPerYear = 2; assertEquals(ACT_ACT_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (61. / 365 + 121. / 366), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (182. / 366), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear, StubType.NONE), coupon * (182. / 364), EPS); assertEquals(ONE_ONE.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon / paymentsPerYear, EPS); assertEquals(FLAT.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), 0, EPS); } @Test public void testISDAExample2() { final ZonedDateTime d1 = DateUtils.getUTCDate(1999, 2, 1); final ZonedDateTime d2 = DateUtils.getUTCDate(1999, 7, 1); final ZonedDateTime d3 = DateUtils.getUTCDate(2000, 7, 1); final double coupon = 0.1; final int paymentsPerYear = 1; assertEquals(ACT_ACT_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (150. / 365), EPS); assertEquals(ACT_ACT_ISDA.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear), coupon * (184. / 365 + 182. / 366), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (150. / 365), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear), coupon * (366. / 366), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear, StubType.SHORT_START), coupon * (150. / 365), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear, StubType.SHORT_START), coupon * (366. / 366), EPS); } @Test public void testISDAExample3() { final ZonedDateTime d1 = DateUtils.getUTCDate(2002, 8, 15); final ZonedDateTime d2 = DateUtils.getUTCDate(2003, 7, 15); final ZonedDateTime d3 = DateUtils.getUTCDate(2004, 1, 15); final ZonedDateTime d4 = DateUtils.getUTCDate(2002, 9, 15); final ZonedDateTime d5 = DateUtils.getUTCDate(2003, 2, 15); final double coupon = 0.1; final int paymentsPerYear = 2; assertEquals(ACT_ACT_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (334. / 365), EPS); assertEquals(ACT_ACT_ISDA.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear), coupon * (170. / 365 + 14. / 366), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (334. / 365), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear), coupon * (184. / 365), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear, StubType.LONG_START), coupon * (181. / 362 + 153. / 368), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear, StubType.LONG_START), coupon * (184. / 368), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d1, d4, d2, coupon, paymentsPerYear, StubType.LONG_START), coupon * (31.0 / 184.0) / 2.0, EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d1, d5, d2, coupon, paymentsPerYear, StubType.LONG_START), coupon * (153.0 / 184.0 + 31.0 / 181.0) / 2.0, EPS); } @Test public void testISDAExample4() { final ZonedDateTime d1 = DateUtils.getUTCDate(1999, 7, 30); final ZonedDateTime d2 = DateUtils.getUTCDate(2000, 1, 30); final ZonedDateTime d3 = DateUtils.getUTCDate(2000, 6, 30); final double coupon = 0.1; final int paymentsPerYear = 2; assertEquals(ACT_ACT_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (155. / 365 + 29. / 366), EPS); assertEquals(ACT_ACT_ISDA.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear), coupon * (152. / 366), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (184. / 365), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear), coupon * (152. / 366), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear, StubType.SHORT_END), coupon * (184. / 368), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d2, d3, d3, coupon, paymentsPerYear, StubType.SHORT_END), coupon * (152. / 364), EPS); } @Test public void testISDAExample5() { final ZonedDateTime d1 = DateUtils.getUTCDate(1999, 11, 30); final ZonedDateTime d2 = DateUtils.getUTCDate(2000, 4, 30); final double coupon = 0.1; final int paymentsPerYear = 4; assertEquals(ACT_ACT_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (32. / 365 + 120. / 366), EPS); assertEquals(ACT_ACT_AFB.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (152. / 366), EPS); assertEquals(ACT_ACT_ICMA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear, StubType.LONG_END), coupon * (91. / 364 + 61. / 368), EPS); } @Test public void testExample1() { final ZonedDateTime d1 = DateUtils.getUTCDate(2007, 12, 28); final ZonedDateTime d2 = DateUtils.getUTCDate(2008, 2, 28); final double coupon = 0.1; final int paymentsPerYear = 2; assertEquals(ACT_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (62. / 360), EPS); assertEquals(ACT_365.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (62. / 365), EPS); assertEquals(ACT_365L.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (62. / 366), EPS); assertEquals(U30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (60. / 360), EPS); assertEquals(E30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (60. / 360), EPS); assertEquals(E30_360_ISDA.getAccruedInterest(d1, d2, coupon, true), coupon * (60. / 360), EPS); assertEquals(E_PLUS_30_360_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (60. / 360), EPS); } @Test public void testExample2() { final ZonedDateTime d1 = DateUtils.getUTCDate(2007, 12, 28); final ZonedDateTime d2 = DateUtils.getUTCDate(2008, 2, 29); final double coupon = 0.1; final int paymentsPerYear = 2; assertEquals(ACT_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (63. / 360), EPS); assertEquals(ACT_365.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (63. / 365), EPS); assertEquals(ACT_365L.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (63. / 366), EPS); assertEquals(U30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (61. / 360), EPS); assertEquals(E30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (61. / 360), EPS); assertEquals(E30_360_ISDA.getAccruedInterest(d1, d2, coupon, true), coupon * (61. / 360), EPS); assertEquals(E_PLUS_30_360_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (61. / 360), EPS); } @Test public void testExample3() { final ZonedDateTime d1 = DateUtils.getUTCDate(2007, 10, 31); final ZonedDateTime d2 = DateUtils.getUTCDate(2008, 11, 30); final double coupon = 0.1; final int paymentsPerYear = 2; assertEquals(ACT_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (396. / 360), EPS); assertEquals(ACT_365.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (396. / 365), EPS); assertEquals(ACT_365L.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (396. / 366), EPS); assertEquals(U30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (390. / 360), EPS); assertEquals(E30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (390. / 360), EPS); assertEquals(E30_360_ISDA.getAccruedInterest(d1, d2, coupon, true), coupon * (390. / 360), EPS); assertEquals(E_PLUS_30_360_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (390. / 360), EPS); } @Test public void testExample4() { final ZonedDateTime d1 = DateUtils.getUTCDate(2008, 2, 1); final ZonedDateTime d2 = DateUtils.getUTCDate(2009, 5, 31); final double coupon = 0.1; final int paymentsPerYear = 2; assertEquals(ACT_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (485. / 360), EPS); assertEquals(ACT_365.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (485. / 365), EPS); assertEquals(ACT_365L.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (485. / 365), EPS); assertEquals(U30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (480. / 360), EPS); assertEquals(E30_360.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (479. / 360), EPS); assertEquals(E30_360_ISDA.getAccruedInterest(d1, d2, coupon, true), coupon * (480. / 360), EPS); assertEquals(E_PLUS_30_360_ISDA.getAccruedInterest(d1, d2, d2, coupon, paymentsPerYear), coupon * (480. / 360), EPS); } }