/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.instrument.bond;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import org.threeten.bp.Period;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityCouponFixedDefinition;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityPaymentFixedDefinition;
import com.opengamma.analytics.financial.instrument.payment.CouponFixedDefinition;
import com.opengamma.analytics.financial.instrument.payment.PaymentFixedDefinition;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityPaymentFixed;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedSecurity;
import com.opengamma.analytics.financial.schedule.ScheduleCalculator;
import com.opengamma.financial.convention.StubType;
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.ActualActualICMA;
import com.opengamma.financial.convention.daycount.DayCount;
import com.opengamma.financial.convention.daycount.DayCounts;
import com.opengamma.financial.convention.yield.SimpleYieldConvention;
import com.opengamma.financial.convention.yield.YieldConvention;
import com.opengamma.financial.convention.yield.YieldConventionFactory;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Tests related to the construction of fixed coupon bond security Definition and conversion to Derivative.
*/
@Test(groups = TestGroup.UNIT)
public class BondFixedSecurityDefinitionTest {
//Semi-annual 2Y
private static final Currency CUR = Currency.EUR;
private static final Period PAYMENT_TENOR = Period.ofMonths(6);
private static final int COUPON_PER_YEAR = 2;
private static final Calendar CALENDAR = new MondayToFridayCalendar("A");
private static final String ISSUER_NAME = "Issuer";
private static final DayCount DAY_COUNT = DayCounts.ACT_ACT_ISDA;
private static final BusinessDayConvention BUSINESS_DAY = BusinessDayConventions.FOLLOWING;
private static final boolean IS_EOM = false;
private static final Period BOND_TENOR = Period.ofYears(2);
private static final int SETTLEMENT_DAYS = 2;
private static final ZonedDateTime START_ACCRUAL_DATE = DateUtils.getUTCDate(2011, 7, 13);
private static final ZonedDateTime MATURITY_DATE = START_ACCRUAL_DATE.plus(BOND_TENOR);
private static final double RATE = 0.0325;
private static final YieldConvention STREET_CONVENTION = YieldConventionFactory.INSTANCE.getYieldConvention("STREET CONVENTION");
private static final double NOTIONAL = 1.0;
private static final BondFixedSecurityDefinition BOND_SECURITY_DEFINITION = BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR,
RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, BUSINESS_DAY, STREET_CONVENTION, IS_EOM, ISSUER_NAME);
// to derivatives: common
private static final DayCount ACT_ACT = DayCounts.ACT_ACT_ISDA;
private static final String CREDIT_CURVE_NAME = "Credit";
private static final String REPO_CURVE_NAME = "Repo";
private static final String[] CURVES_NAME = {CREDIT_CURVE_NAME, REPO_CURVE_NAME };
// private static final YieldCurveBundle CURVES = TestsDataSets.createCurves1();
private static final ZonedDateTime REFERENCE_DATE_1 = DateUtils.getUTCDate(2011, 8, 18);
private static final double TOLERANCE_PRICE = 1.0E-10;
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurrency() {
BondFixedSecurityDefinition.from(null, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, BUSINESS_DAY, STREET_CONVENTION,
IS_EOM, ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullMaturity() {
BondFixedSecurityDefinition.from(CUR, null, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, BUSINESS_DAY, STREET_CONVENTION, IS_EOM,
ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullStart() {
BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, null, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, BUSINESS_DAY, STREET_CONVENTION, IS_EOM,
ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullPeriod() {
BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, null, RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, BUSINESS_DAY, STREET_CONVENTION, IS_EOM,
ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCalendar() {
BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, null, DAY_COUNT, BUSINESS_DAY, STREET_CONVENTION,
IS_EOM, ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullDayCount() {
BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, CALENDAR, null, BUSINESS_DAY, STREET_CONVENTION,
IS_EOM, ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullBusinessDay() {
BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, null, STREET_CONVENTION, IS_EOM,
ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullYield() {
BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, BUSINESS_DAY, null, IS_EOM,
ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testPositiveNominal() {
final AnnuityCouponFixedDefinition coupon = AnnuityCouponFixedDefinition.fromAccrualUnadjusted(CUR, START_ACCRUAL_DATE, MATURITY_DATE, PAYMENT_TENOR, true, true,
CALENDAR, DAY_COUNT, BUSINESS_DAY, IS_EOM, 1.0, RATE, false);
final AnnuityPaymentFixedDefinition nominal = new AnnuityPaymentFixedDefinition(new PaymentFixedDefinition[] {new PaymentFixedDefinition(CUR, MATURITY_DATE, -1.0) }, CALENDAR);
new BondFixedSecurityDefinition(nominal, coupon, 0, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, STREET_CONVENTION, COUPON_PER_YEAR, IS_EOM, ISSUER_NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testPositiveCoupon() {
final AnnuityCouponFixedDefinition coupon = AnnuityCouponFixedDefinition.fromAccrualUnadjusted(CUR, START_ACCRUAL_DATE, MATURITY_DATE, PAYMENT_TENOR, true, true,
CALENDAR, DAY_COUNT, BUSINESS_DAY, IS_EOM, 1.0, RATE, true);
final AnnuityPaymentFixedDefinition nominal = new AnnuityPaymentFixedDefinition(new PaymentFixedDefinition[] {new PaymentFixedDefinition(CUR, MATURITY_DATE, 1.0) }, CALENDAR);
new BondFixedSecurityDefinition(nominal, coupon, 0, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, STREET_CONVENTION, COUPON_PER_YEAR, IS_EOM, ISSUER_NAME);
}
@Test
public void testGetters() {
assertEquals(SETTLEMENT_DAYS, BOND_SECURITY_DEFINITION.getSettlementDays());
assertEquals(DAY_COUNT, BOND_SECURITY_DEFINITION.getDayCount());
assertEquals(STREET_CONVENTION, BOND_SECURITY_DEFINITION.getYieldConvention());
assertEquals(COUPON_PER_YEAR, BOND_SECURITY_DEFINITION.getCouponPerYear());
assertEquals(0, BOND_SECURITY_DEFINITION.getExCouponDays()); //Default
assertEquals(CUR, BOND_SECURITY_DEFINITION.getCurrency());
final AnnuityCouponFixedDefinition coupon = AnnuityCouponFixedDefinition.fromAccrualUnadjusted(CUR, START_ACCRUAL_DATE, MATURITY_DATE, PAYMENT_TENOR, true, true,
CALENDAR, DAY_COUNT, BUSINESS_DAY, IS_EOM, 1.0, RATE, false);
assertEquals(coupon, BOND_SECURITY_DEFINITION.getCoupons());
final AnnuityDefinition<PaymentFixedDefinition> nominal = new AnnuityDefinition<>(new PaymentFixedDefinition[] {new PaymentFixedDefinition(CUR,
BUSINESS_DAY.adjustDate(CALENDAR, MATURITY_DATE), 1.0) }, CALENDAR);
assertEquals(nominal.getCurrency(), BOND_SECURITY_DEFINITION.getNominal().getCurrency());
assertEquals(nominal.getNthPayment(0).getPaymentDate(), BOND_SECURITY_DEFINITION.getNominal().getNthPayment(0).getPaymentDate());
assertEquals(nominal.getNthPayment(0).getReferenceAmount(), BOND_SECURITY_DEFINITION.getNominal().getNthPayment(0).getReferenceAmount());
}
@Test
public void testDates() {
final BondFixedSecurityDefinition BOND_DEFINITION = BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS,
CALENDAR, DAY_COUNT, BUSINESS_DAY, STREET_CONVENTION, IS_EOM, ISSUER_NAME);
final ZonedDateTime[] expectedPaymentDates = new ZonedDateTime[] {DateUtils.getUTCDate(2012, 1, 13), DateUtils.getUTCDate(2012, 7, 13),
DateUtils.getUTCDate(2013, 1, 14), DateUtils.getUTCDate(2013, 7, 15) };
final ZonedDateTime[] expectedStartDates = new ZonedDateTime[] {DateUtils.getUTCDate(2011, 7, 13), DateUtils.getUTCDate(2012, 1, 13),
DateUtils.getUTCDate(2012, 7, 13), DateUtils.getUTCDate(2013, 1, 13) };
final ZonedDateTime[] expectedEndDates = new ZonedDateTime[] {DateUtils.getUTCDate(2012, 1, 13), DateUtils.getUTCDate(2012, 7, 13),
DateUtils.getUTCDate(2013, 1, 13), DateUtils.getUTCDate(2013, 7, 13) };
for (int loopcpn = 0; loopcpn < BOND_DEFINITION.getCoupons().getNumberOfPayments(); loopcpn++) {
assertEquals("Payment " + loopcpn, expectedPaymentDates[loopcpn], BOND_DEFINITION.getCoupons().getNthPayment(loopcpn).getPaymentDate());
assertEquals("Start accrual " + loopcpn, expectedStartDates[loopcpn], BOND_DEFINITION.getCoupons().getNthPayment(loopcpn).getAccrualStartDate());
assertEquals("End accrual " + loopcpn, expectedEndDates[loopcpn], BOND_DEFINITION.getCoupons().getNthPayment(loopcpn).getAccrualEndDate());
}
}
@Test
public void toDerivativeUST() {
final BondFixedSecurity bondConverted = BOND_SECURITY_DEFINITION.toDerivative(REFERENCE_DATE_1);
AnnuityPaymentFixedDefinition nominalDefinition = (AnnuityPaymentFixedDefinition) BOND_SECURITY_DEFINITION.getNominal();
AnnuityCouponFixedDefinition couponDefinition = BOND_SECURITY_DEFINITION.getCoupons();
final ZonedDateTime spotDate1 = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE_1, SETTLEMENT_DAYS, CALENDAR);
nominalDefinition = nominalDefinition.trimBefore(spotDate1);
couponDefinition = couponDefinition.trimBefore(spotDate1);
final AnnuityPaymentFixed nominal = nominalDefinition.toDerivative(REFERENCE_DATE_1);
final AnnuityCouponFixed coupon = couponDefinition.toDerivative(REFERENCE_DATE_1);
final double spotTime1 = ACT_ACT.getDayCountFraction(REFERENCE_DATE_1, spotDate1);
final double accruedInterest = DAY_COUNT.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), spotDate1, couponDefinition.getNthPayment(0)
.getAccrualEndDate(), RATE, COUPON_PER_YEAR)
* NOTIONAL;
final double factorSpot = DAY_COUNT.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), spotDate1, couponDefinition.getNthPayment(0)
.getAccrualEndDate(), RATE, COUPON_PER_YEAR);
final double factorPeriod = DAY_COUNT.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), couponDefinition.getNthPayment(0)
.getAccrualEndDate(), couponDefinition.getNthPayment(0).getAccrualEndDate(), RATE, COUPON_PER_YEAR);
final double factorToNextCoupon = (factorPeriod - factorSpot) / factorPeriod;
final BondFixedSecurity bondExpected = new BondFixedSecurity(nominal, coupon, spotTime1, accruedInterest, factorToNextCoupon, STREET_CONVENTION, COUPON_PER_YEAR,
"");
assertEquals("Bond Fixed Security Definition to derivative", bondConverted.getFactorToNextCoupon(), bondExpected.getFactorToNextCoupon(), 1.0E-10);
assertEquals("Bond Fixed Security Definition to derivative", bondConverted.getAccruedInterest(), bondExpected.getAccruedInterest(), 1.0E-10);
assertEquals("Bond Fixed Security Definition to derivative", bondConverted.getYieldConvention(), bondExpected.getYieldConvention());
assertTrue("Bond Fixed Security Definition to derivative", bondConverted.equals(bondExpected));
final BondFixedSecurity bondConvertedDate = BOND_SECURITY_DEFINITION.toDerivative(REFERENCE_DATE_1, spotDate1);
assertTrue("Bond Fixed Security Definition to derivative", bondConverted.equals(bondConvertedDate));
}
// UKT 5 09/07/14 - ISIN-GB0031829509
private static final String ISSUER = "UK";
private static final String REPO_TYPE = "General collateral";
private static final Currency CUR_G = Currency.GBP;
private static final Period PAYMENT_TENOR_G = Period.ofMonths(6);
private static final int COUPON_PER_YEAR_G = 2;
private static final Calendar CALENDAR_G = new MondayToFridayCalendar("A");
private static final DayCount DAY_COUNT_G = DayCounts.ACT_ACT_ICMA; // To check
private static final BusinessDayConvention BUSINESS_DAY_G = BusinessDayConventions.FOLLOWING;
private static final boolean IS_EOM_G = false;
private static final Period BOND_TENOR_G = Period.ofYears(12);
private static final int SETTLEMENT_DAYS_G = 2;
private static final int EX_DIVIDEND_DAYS_G = 7;
private static final ZonedDateTime START_ACCRUAL_DATE_G = DateUtils.getUTCDate(2002, 9, 7);
private static final ZonedDateTime MATURITY_DATE_G = START_ACCRUAL_DATE_G.plus(BOND_TENOR_G);
private static final double RATE_G = 0.0500;
private static final double NOTIONAL_G = 100;
private static final YieldConvention YIELD_CONVENTION_G = YieldConventionFactory.INSTANCE.getYieldConvention("UK:BUMP/DMO METHOD");
private static final BondFixedSecurityDefinition BOND_SECURITY_DEFINITION_G = BondFixedSecurityDefinition.from(CUR_G, MATURITY_DATE_G, START_ACCRUAL_DATE_G,
PAYMENT_TENOR_G, RATE_G, SETTLEMENT_DAYS_G, NOTIONAL_G, EX_DIVIDEND_DAYS_G, CALENDAR_G, DAY_COUNT_G, BUSINESS_DAY_G, YIELD_CONVENTION_G, IS_EOM_G, ISSUER,
REPO_TYPE);
@Test
public void testGettersUKT() {
assertEquals(SETTLEMENT_DAYS_G, BOND_SECURITY_DEFINITION_G.getSettlementDays());
assertEquals(NOTIONAL_G, BOND_SECURITY_DEFINITION_G.getNominal().getNthPayment(0).getReferenceAmount());
assertEquals(EX_DIVIDEND_DAYS_G, BOND_SECURITY_DEFINITION_G.getExCouponDays());
}
@Test
public void toDerivativeUKT() {
final BondFixedSecurity bondConverted = BOND_SECURITY_DEFINITION_G.toDerivative(REFERENCE_DATE_1);
AnnuityPaymentFixedDefinition nominalDefinition = (AnnuityPaymentFixedDefinition) BOND_SECURITY_DEFINITION_G.getNominal();
AnnuityCouponFixedDefinition couponDefinition = BOND_SECURITY_DEFINITION_G.getCoupons();
final ZonedDateTime spotDate1 = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE_1, SETTLEMENT_DAYS_G, CALENDAR_G);
nominalDefinition = nominalDefinition.trimBefore(spotDate1);
couponDefinition = couponDefinition.trimBefore(spotDate1);
final AnnuityPaymentFixed nominal = nominalDefinition.toDerivative(REFERENCE_DATE_1);
final AnnuityCouponFixed coupon = couponDefinition.toDerivative(REFERENCE_DATE_1);
final double spotTime1 = ACT_ACT.getDayCountFraction(REFERENCE_DATE_1, spotDate1);
final double accruedInterest = DAY_COUNT_G.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), spotDate1, couponDefinition.getNthPayment(0)
.getAccrualEndDate(), RATE_G, COUPON_PER_YEAR_G)
* NOTIONAL_G;
final double factorSpot = DAY_COUNT_G.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), spotDate1, couponDefinition.getNthPayment(0)
.getAccrualEndDate(), RATE_G, COUPON_PER_YEAR_G);
final double factorPeriod = DAY_COUNT_G.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), couponDefinition.getNthPayment(0)
.getAccrualEndDate(), couponDefinition.getNthPayment(0).getAccrualEndDate(), RATE_G, COUPON_PER_YEAR_G);
final double factorToNextCoupon = (factorPeriod - factorSpot) / factorPeriod;
final BondFixedSecurity bondExpected = new BondFixedSecurity(nominal, coupon, spotTime1, accruedInterest, factorToNextCoupon, YIELD_CONVENTION_G, COUPON_PER_YEAR_G,
"");
assertEquals("Bond Fixed Security Definition to derivative", bondExpected.getFactorToNextCoupon(), bondConverted.getFactorToNextCoupon(), 1.0E-10);
assertEquals("Bond Fixed Security Definition to derivative", bondExpected.getAccruedInterest(), bondConverted.getAccruedInterest(), 1.0E-10);
assertEquals("Bond Fixed Security Definition to derivative", bondExpected.getYieldConvention(), bondConverted.getYieldConvention());
}
@Test
public void toDerivativeUKTExCoupon() {
final ZonedDateTime referenceDate2 = DateUtils.getUTCDate(2011, 9, 2); // Ex-dividend is 30-Aug-2011
final BondFixedSecurity bondConverted = BOND_SECURITY_DEFINITION_G.toDerivative(referenceDate2);
AnnuityPaymentFixedDefinition nominalDefinition = (AnnuityPaymentFixedDefinition) BOND_SECURITY_DEFINITION_G.getNominal();
AnnuityCouponFixedDefinition couponDefinition = BOND_SECURITY_DEFINITION_G.getCoupons();
final ZonedDateTime spotDate = ScheduleCalculator.getAdjustedDate(referenceDate2, SETTLEMENT_DAYS_G, CALENDAR_G);
nominalDefinition = nominalDefinition.trimBefore(spotDate);
couponDefinition = couponDefinition.trimBefore(spotDate);
final CouponFixedDefinition[] couponDefinitionExArray = new CouponFixedDefinition[couponDefinition.getNumberOfPayments()];
System.arraycopy(couponDefinition.getPayments(), 1, couponDefinitionExArray, 1, couponDefinition.getNumberOfPayments() - 1);
couponDefinitionExArray[0] = new CouponFixedDefinition(couponDefinition.getNthPayment(0), 0.0);
final AnnuityCouponFixedDefinition couponDefinitionEx = new AnnuityCouponFixedDefinition(couponDefinitionExArray, CALENDAR_G);
final AnnuityPaymentFixed nominal = nominalDefinition.toDerivative(referenceDate2);
final AnnuityCouponFixed coupon = couponDefinitionEx.toDerivative(referenceDate2);
final double spotTime = ACT_ACT.getDayCountFraction(referenceDate2, spotDate);
final double accruedInterest = (DAY_COUNT_G.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), spotDate, couponDefinition.getNthPayment(0)
.getAccrualEndDate(), RATE_G, COUPON_PER_YEAR_G) - RATE_G / COUPON_PER_YEAR_G)
* NOTIONAL_G;
final double factorSpot = DAY_COUNT_G.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), spotDate, couponDefinition.getNthPayment(0)
.getAccrualEndDate(), RATE_G, COUPON_PER_YEAR_G);
final double factorPeriod = DAY_COUNT_G.getAccruedInterest(couponDefinition.getNthPayment(0).getAccrualStartDate(), couponDefinition.getNthPayment(0)
.getAccrualEndDate(), couponDefinition.getNthPayment(0).getAccrualEndDate(), RATE_G, COUPON_PER_YEAR_G);
final double factorToNextCoupon = (factorPeriod - factorSpot) / factorPeriod;
final BondFixedSecurity bondExpected = new BondFixedSecurity(nominal, coupon, spotTime, accruedInterest, factorToNextCoupon, YIELD_CONVENTION_G, COUPON_PER_YEAR_G,
"");
assertEquals("Bond Fixed Security Definition to derivative", bondExpected.getFactorToNextCoupon(), bondConverted.getFactorToNextCoupon(), 1.0E-10);
assertEquals("Bond Fixed Security Definition to derivative", bondExpected.getAccruedInterest(), bondConverted.getAccruedInterest(), 1.0E-10);
assertEquals("Bond Fixed Security Definition to derivative", bondExpected.getYieldConvention(), bondConverted.getYieldConvention());
}
/** Test the toDerivative for each business date around the ex-dividend period. */
@Test
public void toDerivativeUKTAllDate() {
ZonedDateTime referenceDate2 = DateUtils.getUTCDate(2011, 8, 1); // Ex-dividend is 30-Aug-2011
int nbDateTest = 40; // 2M
double[] accruedInterest = new double[nbDateTest];
for (int loopref = 0; loopref < nbDateTest; loopref++) {
referenceDate2 = ScheduleCalculator.getAdjustedDate(referenceDate2, 1, CALENDAR_G);
final BondFixedSecurity bondConverted = BOND_SECURITY_DEFINITION_G.toDerivative(referenceDate2);
accruedInterest[loopref] = bondConverted.getAccruedInterest();
}
int indexJump = 19;
for (int loopref = 0; loopref < nbDateTest - 1; loopref++) {
if (loopref != indexJump) {
assertTrue("Bond Fixed Security Definition to derivative - " + loopref,
accruedInterest[loopref + 1] - accruedInterest[loopref] < NOTIONAL_G * RATE_G / 360 * 3); // 3 days of accrued
}
}
}
// DBR 1 1/2 02/15/23 - ISIN: DE0001102309 - Check the long first coupon
private static final Currency EUR = Currency.EUR;
private static final ActualActualICMA DAY_COUNT_ACTACTICMA = new ActualActualICMA();
private static final BusinessDayConvention FOLLOWING = BusinessDayConventions.FOLLOWING;
private static final String ISSUER_DE = "BUNDESREPUB. DEUTSCHLAND";
private static final YieldConvention YIELD_CONVENTION_GERMANY = SimpleYieldConvention.GERMAN_BOND;
private static final int SETTLEMENT_DAYS_DE = 3;
private static final Period PAYMENT_TENOR_DE = Period.ofMonths(12);
private static final int COUPON_PER_YEAR_DE = 1;
private static final ZonedDateTime BOND_MATURITY_DE = DateUtils.getUTCDate(2023, 2, 15);
private static final ZonedDateTime BOND_START_DE = DateUtils.getUTCDate(2013, 1, 18);
private static final ZonedDateTime BOND_FIRSTCPN_DE = DateUtils.getUTCDate(2014, 2, 15);
private static final double RATE_DE = 0.0150;
private static final BondFixedSecurityDefinition BOND_DE_SECURITY_DEFINITION = BondFixedSecurityDefinition.from(EUR, BOND_START_DE, BOND_FIRSTCPN_DE, BOND_MATURITY_DE, PAYMENT_TENOR_DE, RATE_DE,
SETTLEMENT_DAYS_DE, CALENDAR, DAY_COUNT_ACTACTICMA, FOLLOWING, YIELD_CONVENTION_GERMANY, IS_EOM, ISSUER_DE);
@Test
public void longFirstCouponDE() {
final double accrualFirstComputed = BOND_DE_SECURITY_DEFINITION.getCoupons().getNthPayment(0).getPaymentYearFraction();
assertTrue("Bond Fixed Security - long first coupon ActActICMA", accrualFirstComputed > 1);
final double accrualFirstExpected = DAY_COUNT_ACTACTICMA.getAccruedInterest(BOND_START_DE, BOND_FIRSTCPN_DE, BOND_FIRSTCPN_DE, 1.0, COUPON_PER_YEAR_DE, StubType.LONG_START);
assertEquals("Bond Fixed Security - long first coupon ActActICMA", accrualFirstExpected, accrualFirstComputed, TOLERANCE_PRICE);
}
// MDLZ 5 3/8 12/11/14 - ISIN: XS0417033007 - Check the long first coupon and accrued
private static final Currency GBP = Currency.GBP;
private static final String ISSUER_MON = " MONDELEZ INTERNATIONAL";
private static final YieldConvention US_STREET = SimpleYieldConvention.US_STREET;
private static final int SETTLEMENT_DAYS_MON = 3;
private static final Period PAYMENT_TENOR_MON = Period.ofMonths(6);
// private static final int COUPON_PER_YEAR_MON = 2;
private static final ZonedDateTime BOND_MATURITY_MON = DateUtils.getUTCDate(2014, 12, 11);
private static final ZonedDateTime BOND_START_MON = DateUtils.getUTCDate(2009, 3, 11);
private static final ZonedDateTime BOND_FIRSTCPN_MON = DateUtils.getUTCDate(2009, 12, 11);
private static final double RATE_MON = 0.05375;
private static final BondFixedSecurityDefinition BOND_MON_SECURITY_DEFINITION = BondFixedSecurityDefinition.from(GBP, BOND_START_MON, BOND_FIRSTCPN_MON, BOND_MATURITY_MON, PAYMENT_TENOR_MON,
RATE_MON, SETTLEMENT_DAYS_MON, CALENDAR, DAY_COUNT_ACTACTICMA, FOLLOWING, US_STREET, IS_EOM, ISSUER_MON);
@Test
public void longFirstCouponMon() {
final double notional = 1000000;
final double accrualFirstExpected = 40460.17;
final double accrualFirstComputed = BOND_MON_SECURITY_DEFINITION.getCoupons().getNthPayment(0).getAmount();
assertEquals("Bond Fixed Security - XS0417033007 - accrued 1st cpn", accrualFirstExpected, accrualFirstComputed * notional, 1.0E-2);
final double accrualSecondExpected = 26875.00;
for (int loopcpn = 1; loopcpn < BOND_MON_SECURITY_DEFINITION.getCoupons().getNumberOfPayments(); loopcpn++) {
assertEquals("Bond Fixed Security - XS0417033007 - accrued 1st cpn", accrualSecondExpected, BOND_MON_SECURITY_DEFINITION.getCoupons().getNthPayment(loopcpn).getAmount() * notional, 1.0E-2);
}
}
}