/** * Copyright (C) 2014 - 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 org.testng.annotations.Test; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.datasets.CalendarUSD; import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition; import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinitionBuilder; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.instrument.index.IndexIborMaster; import com.opengamma.analytics.financial.instrument.payment.CouponDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponFixedDefinition; import com.opengamma.analytics.financial.instrument.payment.PaymentDefinition; import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity; import com.opengamma.analytics.financial.interestrate.bond.definition.BillSecurity; import com.opengamma.analytics.financial.interestrate.bond.definition.BillTotalReturnSwap; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.util.time.TimeCalculator; import com.opengamma.financial.convention.StubType; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.timeseries.precise.zdt.ImmutableZonedDateTimeDoubleTimeSeries; import com.opengamma.timeseries.precise.zdt.ZonedDateTimeDoubleTimeSeries; import com.opengamma.util.money.Currency; import com.opengamma.util.time.DateUtils; /** * Test related to the description of a bill total return swap with an underlying bill and a funding leg. */ public class BillTotalReturnSwapDefinitionTest { private static final Currency EUR = Currency.EUR; private static final ZonedDateTime EFFECTIVE_DATE = DateUtils.getUTCDate(2014, 6, 25); private static final ZonedDateTime TERMINATION_DATE = DateUtils.getUTCDate(2014, 12, 22); private static final BillSecurityDefinition BELDEC14_DEFINITION = BillDataSets.billBel_20141218(); // Funding: unique fixed coupon in EUR: pay TRS bill, receive funding private static final double NOTIONAL_TRS = 123456000; private static final double NOTIONAL_BILL = 100000000; private static final double RATE = 0.0043; private static final CouponFixedDefinition FUNDING_FIXED_CPN_REC_DEFINITION = new CouponFixedDefinition(EUR, TERMINATION_DATE, EFFECTIVE_DATE, TERMINATION_DATE, 0.50, NOTIONAL_TRS, RATE); private static final AnnuityDefinition<? extends PaymentDefinition> FUNDING_LEG_FIXED_REC_DEFINITION = new AnnuityDefinition<>(new CouponFixedDefinition[] {FUNDING_FIXED_CPN_REC_DEFINITION }, BELDEC14_DEFINITION.getCalendar()); private static final BillTotalReturnSwapDefinition TRS_PAY_FIXED_REC_DEFINITION = new BillTotalReturnSwapDefinition(EFFECTIVE_DATE, TERMINATION_DATE, FUNDING_LEG_FIXED_REC_DEFINITION, BELDEC14_DEFINITION, -NOTIONAL_BILL); // Funding: unique fixed coupon in GBP: receive TRS bond, pay funding private static final CouponFixedDefinition FUNDING_FIXED_CPN_PAY_DEFINITION = new CouponFixedDefinition(EUR, TERMINATION_DATE, EFFECTIVE_DATE, TERMINATION_DATE, 0.50, -NOTIONAL_TRS, RATE); private static final AnnuityDefinition<? extends PaymentDefinition> FUNDING_LEG_FIXED_PAY_DEFINITION = new AnnuityDefinition<>(new CouponFixedDefinition[] {FUNDING_FIXED_CPN_PAY_DEFINITION }, BELDEC14_DEFINITION.getCalendar()); private static final BillTotalReturnSwapDefinition TRS_REC_FIXED_PAY_DEFINITION = new BillTotalReturnSwapDefinition(EFFECTIVE_DATE, TERMINATION_DATE, FUNDING_LEG_FIXED_PAY_DEFINITION, BELDEC14_DEFINITION, NOTIONAL_BILL); // Funding: multiple USD Libor coupons private static final Calendar NYC = new CalendarUSD("NYC"); private static final double SPREAD = 0.0010; private static final IborIndex USDLIBOR1M = IndexIborMaster.getInstance().getIndex("USDLIBOR1M"); private static final AnnuityDefinition<CouponDefinition> FUNDING_LEG_IBOR_PAY_DEFINITION = AnnuityDefinitionBuilder.couponIborSpreadWithNotional(EFFECTIVE_DATE, TERMINATION_DATE, NOTIONAL_TRS, SPREAD, USDLIBOR1M, USDLIBOR1M.getDayCount(), USDLIBOR1M.getBusinessDayConvention(), true, USDLIBOR1M.getTenor(), USDLIBOR1M.isEndOfMonth(), NYC, StubType.SHORT_START, 0, false, true); private static final BillTotalReturnSwapDefinition TRS_REC_IBOR_PAY_DEFINITION = new BillTotalReturnSwapDefinition(EFFECTIVE_DATE, TERMINATION_DATE, FUNDING_LEG_IBOR_PAY_DEFINITION, BELDEC14_DEFINITION, NOTIONAL_BILL); private static final ZonedDateTime[] FIXING_DATES = new ZonedDateTime[] {DateUtils.getUTCDate(2014, 2, 7), DateUtils.getUTCDate(2014, 6, 23), DateUtils.getUTCDate(2014, 7, 18) }; private static final double[] FIXING_RATES = new double[] {0.0040, 0.0041, 0.0042 }; private static final ZonedDateTimeDoubleTimeSeries FIXING_TS = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC(FIXING_DATES, FIXING_RATES); private static final ZonedDateTime REFERENCE_DATE_1 = DateUtils.getUTCDate(2014, 6, 23); // Before effective date. private static final ZonedDateTime REFERENCE_DATE_2 = DateUtils.getUTCDate(2014, 8, 18); // After effective date. @Test(expectedExceptions = IllegalArgumentException.class) public void nullEffectiveDate() { new BillTotalReturnSwapDefinition(null, TERMINATION_DATE, FUNDING_LEG_FIXED_PAY_DEFINITION, BELDEC14_DEFINITION, NOTIONAL_BILL); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullTerminationDate() { new BillTotalReturnSwapDefinition(EFFECTIVE_DATE, null, FUNDING_LEG_FIXED_PAY_DEFINITION, BELDEC14_DEFINITION, NOTIONAL_BILL); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullFundingLeg() { new BillTotalReturnSwapDefinition(EFFECTIVE_DATE, TERMINATION_DATE, null, BELDEC14_DEFINITION, NOTIONAL_BILL); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullUnderlyingBond() { new BillTotalReturnSwapDefinition(EFFECTIVE_DATE, TERMINATION_DATE, FUNDING_LEG_FIXED_PAY_DEFINITION, null, NOTIONAL_BILL); } @Test public void getter() { assertEquals("BondTotalReturnSwapDefinition: getter", EFFECTIVE_DATE, TRS_REC_FIXED_PAY_DEFINITION.getEffectiveDate()); assertEquals("BondTotalReturnSwapDefinition: getter", TERMINATION_DATE, TRS_REC_FIXED_PAY_DEFINITION.getTerminationDate()); assertEquals("BondTotalReturnSwapDefinition: getter", FUNDING_LEG_FIXED_PAY_DEFINITION, TRS_REC_FIXED_PAY_DEFINITION.getFundingLeg()); assertEquals("BondTotalReturnSwapDefinition: getter", BELDEC14_DEFINITION, TRS_REC_FIXED_PAY_DEFINITION.getAsset()); assertEquals("BondTotalReturnSwapDefinition: getter", NOTIONAL_BILL, TRS_REC_FIXED_PAY_DEFINITION.getQuantity()); } @Test public void toDerivativeFixedRecBeforeEffectiveDate() { double effectiveTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_1, EFFECTIVE_DATE); double terminationTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_1, TERMINATION_DATE); Annuity<? extends Payment> fundingLeg = FUNDING_LEG_FIXED_PAY_DEFINITION.toDerivative(REFERENCE_DATE_1); BillSecurity bond = BELDEC14_DEFINITION.toDerivative(REFERENCE_DATE_1, EFFECTIVE_DATE); BillTotalReturnSwap trsExpected = new BillTotalReturnSwap(effectiveTime, terminationTime, fundingLeg, bond, NOTIONAL_BILL); BillTotalReturnSwap trsConverted = TRS_REC_FIXED_PAY_DEFINITION.toDerivative(REFERENCE_DATE_1); assertEquals("BillTotalReturnSwapDefinition: toDerivative", trsExpected, trsConverted); } @Test public void toDerivativeFixedPayBeforeEffectiveDate() { double effectiveTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_1, EFFECTIVE_DATE); double terminationTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_1, TERMINATION_DATE); Annuity<? extends Payment> fundingLeg = FUNDING_LEG_FIXED_REC_DEFINITION.toDerivative(REFERENCE_DATE_1); BillSecurity bond = BELDEC14_DEFINITION.toDerivative(REFERENCE_DATE_1, EFFECTIVE_DATE); BillTotalReturnSwap trsExpected = new BillTotalReturnSwap(effectiveTime, terminationTime, fundingLeg, bond, -NOTIONAL_BILL); BillTotalReturnSwap trsConverted = TRS_PAY_FIXED_REC_DEFINITION.toDerivative(REFERENCE_DATE_1); assertEquals("BondTotalReturnSwapDefinition: toDerivative", trsExpected, trsConverted); } @Test public void toDerivativeFixedAfterEffectiveDate() { double effectiveTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_2, EFFECTIVE_DATE); double terminationTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_2, TERMINATION_DATE); Annuity<? extends Payment> fundingLeg = FUNDING_LEG_FIXED_PAY_DEFINITION.toDerivative(REFERENCE_DATE_2); BillSecurity bond = BELDEC14_DEFINITION.toDerivative(REFERENCE_DATE_2, EFFECTIVE_DATE); BillTotalReturnSwap trsExpected = new BillTotalReturnSwap(effectiveTime, terminationTime, fundingLeg, bond, NOTIONAL_BILL); BillTotalReturnSwap trsConverted = TRS_REC_FIXED_PAY_DEFINITION.toDerivative(REFERENCE_DATE_2); assertEquals("BondTotalReturnSwapDefinition: toDerivative", trsExpected, trsConverted); } @Test public void toDerivativeIborBeforeEffectiveDate() { double effectiveTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_1, EFFECTIVE_DATE); double terminationTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_1, TERMINATION_DATE); Annuity<? extends Payment> fundingLeg = FUNDING_LEG_IBOR_PAY_DEFINITION.toDerivative(REFERENCE_DATE_1, FIXING_TS); BillSecurity bond = BELDEC14_DEFINITION.toDerivative(REFERENCE_DATE_1, EFFECTIVE_DATE); BillTotalReturnSwap trsExpected = new BillTotalReturnSwap(effectiveTime, terminationTime, fundingLeg, bond, NOTIONAL_BILL); BillTotalReturnSwap trsConverted = TRS_REC_IBOR_PAY_DEFINITION.toDerivative(REFERENCE_DATE_1, FIXING_TS); assertEquals("BondTotalReturnSwapDefinition: toDerivative", trsExpected, trsConverted); } @Test public void toDerivativeIborAfterEffectiveDate() { double effectiveTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_2, EFFECTIVE_DATE); double terminationTime = TimeCalculator.getTimeBetween(REFERENCE_DATE_2, TERMINATION_DATE); Annuity<? extends Payment> fundingLeg = FUNDING_LEG_IBOR_PAY_DEFINITION.toDerivative(REFERENCE_DATE_2, FIXING_TS); BillSecurity bond = BELDEC14_DEFINITION.toDerivative(REFERENCE_DATE_2, EFFECTIVE_DATE); BillTotalReturnSwap trsExpected = new BillTotalReturnSwap(effectiveTime, terminationTime, fundingLeg, bond, NOTIONAL_BILL); BillTotalReturnSwap trsConverted = TRS_REC_IBOR_PAY_DEFINITION.toDerivative(REFERENCE_DATE_2, FIXING_TS); assertEquals("BondTotalReturnSwapDefinition: toDerivative", trsExpected, trsConverted); } }