/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.swap.provider; import org.threeten.bp.LocalDate; import org.threeten.bp.Period; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.NotionalProvider; import com.opengamma.analytics.financial.instrument.VariableNotionalProvider; import com.opengamma.analytics.financial.instrument.annuity.AbstractAnnuityDefinitionBuilder.CouponStub; import com.opengamma.analytics.financial.instrument.annuity.AdjustedDateParameters; import com.opengamma.analytics.financial.instrument.annuity.AnnuityCouponFixedDefinition; import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition; import com.opengamma.analytics.financial.instrument.annuity.CompoundingMethod; import com.opengamma.analytics.financial.instrument.annuity.FixedAnnuityDefinitionBuilder; import com.opengamma.analytics.financial.instrument.annuity.FloatingAnnuityDefinitionBuilder; import com.opengamma.analytics.financial.instrument.annuity.OffsetAdjustedDateParameters; import com.opengamma.analytics.financial.instrument.annuity.OffsetType; import com.opengamma.analytics.financial.instrument.index.GeneratorAttributeIR; import com.opengamma.analytics.financial.instrument.index.GeneratorLegFixed; import com.opengamma.analytics.financial.instrument.index.GeneratorLegIbor; import com.opengamma.analytics.financial.instrument.index.GeneratorLegIborCompounding; import com.opengamma.analytics.financial.instrument.index.GeneratorLegIborMaster; import com.opengamma.analytics.financial.instrument.index.GeneratorLegONArithmeticAverage; import com.opengamma.analytics.financial.instrument.index.GeneratorLegONCompounded; import com.opengamma.analytics.financial.instrument.index.GeneratorLegOnAaMaster; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedIbor; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedIborMaster; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedON; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedONMaster; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapSingleCurrency; 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.instrument.swap.SwapCouponFixedCouponDefinition; import com.opengamma.analytics.financial.instrument.swap.SwapDefinition; import com.opengamma.analytics.financial.instrument.swap.SwapFixedIborDefinition; import com.opengamma.analytics.financial.interestrate.datasets.StandardDataSetsMulticurveUSD; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap; 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.daycount.DayCount; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.financial.convention.rolldate.RollConvention; import com.opengamma.financial.convention.rolldate.RollDateAdjuster; 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; /** * Data set of swaps used in the end-to-end tests. */ public class SwapInstrumentsDataSet { private SwapInstrumentsDataSet() { /* private constructor */ } private static final ZonedDateTime VALUATION_DATE = DateUtils.getUTCDate(2014, 1, 22); private static final Calendar NYC = StandardDataSetsMulticurveUSD.calendarArray()[0]; private static final IndexIborMaster MASTER_IBOR = IndexIborMaster.getInstance(); private static final IborIndex USDLIBOR1M = MASTER_IBOR.getIndex("USDLIBOR1M"); private static final IborIndex USDLIBOR3M = MASTER_IBOR.getIndex("USDLIBOR3M"); private static final IborIndex USDLIBOR6M = MASTER_IBOR.getIndex("USDLIBOR6M"); private static final Currency USD = USDLIBOR3M.getCurrency(); /** Fixing data */ private static final ZonedDateTimeDoubleTimeSeries TS_USDLIBOR1M = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC( new ZonedDateTime[] {DateUtils.getUTCDate(2013, 12, 10), DateUtils.getUTCDate(2013, 12, 12) }, new double[] {0.00123, 0.00123}); private static final ZonedDateTimeDoubleTimeSeries TS_USDLIBOR3M = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC( new ZonedDateTime[] {DateUtils.getUTCDate(2013, 12, 10), DateUtils.getUTCDate(2013, 12, 12) }, new double[] {0.0024185, 0.0024285}); private static final ZonedDateTimeDoubleTimeSeries TS_USDLIBOR6M = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC( new ZonedDateTime[] {DateUtils.getUTCDate(2013, 12, 10), DateUtils.getUTCDate(2013, 12, 12) }, new double[] {0.0030, 0.0035 }); private static final ZonedDateTimeDoubleTimeSeries TS_USDON = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC( new ZonedDateTime[] { DateUtils.getUTCDate(2014, 1, 17), DateUtils.getUTCDate(2014, 1, 21), DateUtils.getUTCDate(2014, 1, 22) }, new double[] {0.0007, 0.0007, 0.0007}); private static final ZonedDateTimeDoubleTimeSeries[] TS_ARRAY_USDLIBOR3M = new ZonedDateTimeDoubleTimeSeries[] {TS_USDLIBOR3M }; private static final ZonedDateTimeDoubleTimeSeries[] TS_ARRAY_USDLIBOR3M_2X = new ZonedDateTimeDoubleTimeSeries[] {TS_USDLIBOR3M, TS_USDLIBOR3M }; private static final ZonedDateTimeDoubleTimeSeries[] TS_ARRAY_USDLIBOR3M_USDLIBOR6M = new ZonedDateTimeDoubleTimeSeries[] {TS_USDLIBOR3M, TS_USDLIBOR6M }; private static final ZonedDateTimeDoubleTimeSeries[] TS_ARRAY_USDLIBOR1M_USDLIBOR3M = new ZonedDateTimeDoubleTimeSeries[] {TS_USDLIBOR1M, TS_USDLIBOR3M }; private static final ZonedDateTimeDoubleTimeSeries[] TS_ARRAY_USDON = new ZonedDateTimeDoubleTimeSeries[] {TS_USDON }; /** Standard market conventions */ private static final CompoundingMethod CMP_FLAT = CompoundingMethod.FLAT; private static final int OFFSET_SPOT = 2; private static final int OFFSET_PAYMENT = 0; private static final Period P3M = Period.ofMonths(3); private static final Period P6M = Period.ofMonths(6); private static final DayCount DC_30U_360 = DayCounts.THIRTY_U_360; private static final BusinessDayConvention BDC_MODFOL = BusinessDayConventions.MODIFIED_FOLLOWING; private static final BusinessDayConvention BDC_FOL = BusinessDayConventions.FOLLOWING; private static final StubType STUB_SHORT_START = StubType.SHORT_START; private static final AdjustedDateParameters ADJUSTED_DATE_USDLIBOR = new AdjustedDateParameters(NYC, BDC_MODFOL); private static final OffsetAdjustedDateParameters OFFSET_FIXING_USDLIBOR = new OffsetAdjustedDateParameters(-OFFSET_SPOT, OffsetType.BUSINESS, NYC, BDC_FOL); private static final GeneratorLegIbor LEG_USDLIBOR3M = GeneratorLegIborMaster.getInstance().getGenerator("USDLIBOR3M", NYC); private static final GeneratorLegIbor LEG_USDLIBOR6M = GeneratorLegIborMaster.getInstance().getGenerator("USDLIBOR6M", NYC); private static final GeneratorLegONArithmeticAverage LEG_USDFEDFUNDAA3M = GeneratorLegOnAaMaster.getInstance().getGenerator("USDFEDFUNDAA3M", NYC); private static final GeneratorLegONCompounded LEG_USDFEDFUNDCMP1Y = new GeneratorLegONCompounded("LEG_USDFEDFUNDCMP1Y", USD, LEG_USDFEDFUNDAA3M.getIndexON(), Period.ofMonths(12), 2, 2, LEG_USDFEDFUNDAA3M.getBusinessDayConvention(), true, STUB_SHORT_START, false, NYC, NYC); private static final GeneratorLegIborCompounding LEG_USDLIBOR1MCMP3M = new GeneratorLegIborCompounding("LEG_USDLIBOR1MCMP3M", USD, USDLIBOR1M, P3M, CMP_FLAT, OFFSET_SPOT, OFFSET_PAYMENT, BusinessDayConventions.MODIFIED_FOLLOWING, true, STUB_SHORT_START, false, NYC, NYC); private static final GeneratorLegFixed LEG_USDFixed1Y = new GeneratorLegFixed("LEG_USDFixed1Y", USD, OFFSET_SPOT, P6M, DC_30U_360, BDC_MODFOL, OFFSET_PAYMENT, true, STUB_SHORT_START, false, NYC); private static final GeneratorSwapSingleCurrency USDFFAA3MLIBOR3M = new GeneratorSwapSingleCurrency("USDFEDFUNDAA3MLIBOR3M", LEG_USDFEDFUNDAA3M, LEG_USDLIBOR3M); private static final GeneratorSwapFixedIborMaster GENERATOR_SWAP_FIXED_IBOR_MASTER = GeneratorSwapFixedIborMaster.getInstance(); private static final GeneratorSwapFixedONMaster GENERATOR_SWAP_FIXED_ONCMP_MASTER = GeneratorSwapFixedONMaster.getInstance(); private static final GeneratorSwapFixedIbor USD6MLIBOR1M = GENERATOR_SWAP_FIXED_IBOR_MASTER.getGenerator("USD6MLIBOR1M", NYC); private static final GeneratorSwapFixedIbor USD6MLIBOR3M = GENERATOR_SWAP_FIXED_IBOR_MASTER.getGenerator("USD6MLIBOR3M", NYC); private static final GeneratorSwapFixedON USD1YFEDFUND = GENERATOR_SWAP_FIXED_ONCMP_MASTER.getGenerator("USD1YFEDFUND", NYC); /** Instruments descriptions */ private static final double NOTIONAL = 100000000; //100 m static NotionalProvider NOTIONAL_PROVIDER = new NotionalProvider() { @Override public double getAmount(final LocalDate date) { return NOTIONAL; } }; // Instrument description: Swap Fixed vs ON Cmp (X) private static final ZonedDateTime TRADE_DATE_ON = DateUtils.getUTCDate(2014, 2, 3); private static final Period TENOR_SWAP_ON = Period.ofMonths(2); private static final double FIXED_RATE_ON = 0.00123; private static final GeneratorAttributeIR ATTRIBUTE_ON = new GeneratorAttributeIR(TENOR_SWAP_ON); private static final SwapDefinition SWAP_FIXED_ON_DEFINITION = USD1YFEDFUND.generateInstrument(TRADE_DATE_ON, FIXED_RATE_ON, NOTIONAL, ATTRIBUTE_ON); public static final Swap<? extends Payment, ? extends Payment> SWAP_FIXED_ON = SWAP_FIXED_ON_DEFINITION.toDerivative(VALUATION_DATE); // Instrument description: Swap Fixed vs ON Cmp Already started (with fixing) (X) private static final ZonedDateTime TRADE_DATE_ON_S = DateUtils.getUTCDate(2014, 1, 15); private static final Period TENOR_SWAP_ON_S = Period.ofMonths(2); private static final double FIXED_RATE_ON_S = 0.00123; private static final GeneratorAttributeIR ATTRIBUTE_ON_S = new GeneratorAttributeIR(TENOR_SWAP_ON_S); private static final SwapDefinition SWAP_FIXED_ON_DEFINITION_S = USD1YFEDFUND.generateInstrument(TRADE_DATE_ON_S, FIXED_RATE_ON_S, NOTIONAL, ATTRIBUTE_ON_S); public static final Swap<? extends Payment, ? extends Payment> SWAP_FIXED_ON_S = SWAP_FIXED_ON_DEFINITION_S.toDerivative(VALUATION_DATE, TS_ARRAY_USDON); // Instrument description: Swap ON AA + Spread vs Libor 3M (X) private static final ZonedDateTime TRADE_DATE_FF = DateUtils.getUTCDate(2014, 9, 10); private static final Period TENOR_SWAP_FF = Period.ofYears(6); private static final double SPREAD_FF = 0.0025; private static final GeneratorAttributeIR ATTRIBUTE_FF = new GeneratorAttributeIR(TENOR_SWAP_FF); private static final SwapDefinition SWAP_FF_3M_0_DEFINITION = USDFFAA3MLIBOR3M.generateInstrument(TRADE_DATE_FF, 0.0, NOTIONAL, ATTRIBUTE_FF); public static final Swap<? extends Payment, ? extends Payment> SWAP_FF_3M_0 = SWAP_FF_3M_0_DEFINITION.toDerivative(VALUATION_DATE); private static final SwapDefinition SWAP_FF_3M_DEFINITION = USDFFAA3MLIBOR3M.generateInstrument(TRADE_DATE_FF, SPREAD_FF, NOTIONAL, ATTRIBUTE_FF); public static final Swap<? extends Payment, ? extends Payment> SWAP_FF_3M = SWAP_FF_3M_DEFINITION.toDerivative(VALUATION_DATE); // Instrument description: Swap Fixed vs Libor3M (X) private static final ZonedDateTime TRADE_DATE_3M = DateUtils.getUTCDate(2014, 9, 10); private static final Period TENOR_SWAP_3M = Period.ofYears(7); private static final double FIXED_RATE_3M = 0.0150; private static final GeneratorAttributeIR ATTRIBUTE_3M = new GeneratorAttributeIR(TENOR_SWAP_3M); private static final SwapDefinition SWAP_FIXED_3M_DEFINITION = USD6MLIBOR3M.generateInstrument(TRADE_DATE_3M, FIXED_RATE_3M, NOTIONAL, ATTRIBUTE_3M); public static final Swap<? extends Payment, ? extends Payment> SWAP_FIXED_3M = SWAP_FIXED_3M_DEFINITION.toDerivative(VALUATION_DATE); // Instrument description: Swap Fixed vs Libor1M private static final ZonedDateTime TRADE_DATE_1M = DateUtils.getUTCDate(2014, 9, 10); private static final Period TENOR_SWAP_1M = Period.ofYears(2); private static final double FIXED_RATE_1M = 0.0125; private static final GeneratorAttributeIR ATTRIBUTE_1M = new GeneratorAttributeIR(TENOR_SWAP_1M); private static final SwapDefinition SWAP_FIXED_1M_DEFINITION = USD6MLIBOR1M.generateInstrument(TRADE_DATE_1M, FIXED_RATE_1M, NOTIONAL, ATTRIBUTE_1M); public static final Swap<? extends Payment, ? extends Payment> SWAP_FIXED_1M = SWAP_FIXED_1M_DEFINITION.toDerivative(VALUATION_DATE); // Instrument description: Swap Fixed vs Libor3M Already started (with fixing) (X) private static final ZonedDateTime TRADE_DATE_3M_S = DateUtils.getUTCDate(2013, 9, 10); private static final Period TENOR_SWAP_3M_S = Period.ofYears(7); private static final double FIXED_RATE_3M_S = 0.0150; private static final GeneratorAttributeIR ATTRIBUTE_3M_S = new GeneratorAttributeIR(TENOR_SWAP_3M_S); private static final SwapFixedIborDefinition SWAP_FIXED_3M_S_DEFINITION = USD6MLIBOR3M.generateInstrument(TRADE_DATE_3M_S, FIXED_RATE_3M_S, NOTIONAL, ATTRIBUTE_3M_S); public static final Swap<? extends Payment, ? extends Payment> SWAP_FIXED_3M_S = SWAP_FIXED_3M_S_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M); // Instrument description: Swap Libor3M+S vs Libor6M (X) private static final ZonedDateTime TRADE_DATE_3M_6M_BS = DateUtils.getUTCDate(2014, 8, 27); private static final Period TENOR_SWAP_3M_6M_BS = Period.ofYears(10); private static final double SPREAD_3M_6M_BS = 0.0010; private static final GeneratorAttributeIR ATTRIBUTE_3M_6M_BS = new GeneratorAttributeIR(TENOR_SWAP_3M_6M_BS); private static final AnnuityDefinition<?> LEG_3M_S = LEG_USDLIBOR3M.generateInstrument(TRADE_DATE_3M_6M_BS, SPREAD_3M_6M_BS, NOTIONAL, ATTRIBUTE_3M_6M_BS); // Receiver private static final AnnuityDefinition<?> LEG_6M = LEG_USDLIBOR6M.generateInstrument(TRADE_DATE_3M_6M_BS, 0.0, -NOTIONAL, ATTRIBUTE_3M_6M_BS); // Payer private static final SwapDefinition BS_3M_S_6M_DEFINITION = new SwapDefinition(LEG_3M_S, LEG_6M); public static final Swap<? extends Payment, ? extends Payment> BS_3M_S_6M = BS_3M_S_6M_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_USDLIBOR6M); // Instrument description: Swap ON Comp+spread v ON AA - Such swap would not be traded, used only for testing private static final ZonedDateTime TRADE_DATE_ONCMP_AA = DateUtils.getUTCDate(2014, 8, 27); private static final Period TENOR_SWAP_ONCMP_AA = Period.ofYears(5); private static final double SPREAD_ONCMP_AA = 0.0010; private static final GeneratorAttributeIR ATTRIBUTE_ONCMP_AA = new GeneratorAttributeIR(TENOR_SWAP_ONCMP_AA); private static final AnnuityDefinition<?> LEG_ONCMP_S = LEG_USDFEDFUNDCMP1Y.generateInstrument(TRADE_DATE_ONCMP_AA, SPREAD_ONCMP_AA, -NOTIONAL, ATTRIBUTE_ONCMP_AA); // Payer private static final AnnuityDefinition<?> LEG_ONAA = LEG_USDFEDFUNDAA3M.generateInstrument(TRADE_DATE_ONCMP_AA, 0.0, NOTIONAL, ATTRIBUTE_ONCMP_AA); // Receiver private static final SwapDefinition BS_ONCMP_S_ONAA_DEFINITION = new SwapDefinition(LEG_ONCMP_S, LEG_ONAA); public static final Swap<? extends Payment, ? extends Payment> BS_ONCMP_S_ONAA = BS_ONCMP_S_ONAA_DEFINITION.toDerivative(VALUATION_DATE); // Instrument description: Swap LIBOR1M Compounding 3M + Spread v LIBOR3M private static final ZonedDateTime TRADE_DATE_1MCMP_S_3M_BS = DateUtils.getUTCDate(2014, 8, 27); private static final Period TENOR_SWAP_1MCMP_S_3M_BS = Period.ofYears(5); private static final double SPREAD_1MCMP_S_3M_BS = 0.0010; private static final GeneratorAttributeIR ATTRIBUTE_1MCMP_S_3M_BS = new GeneratorAttributeIR(TENOR_SWAP_1MCMP_S_3M_BS); private static final AnnuityDefinition<?> LEG_1MCMP_S = LEG_USDLIBOR1MCMP3M.generateInstrument(TRADE_DATE_1MCMP_S_3M_BS, SPREAD_1MCMP_S_3M_BS, NOTIONAL, ATTRIBUTE_1MCMP_S_3M_BS); // Receiver private static final AnnuityDefinition<?> LEG_3MCMP = LEG_USDLIBOR3M.generateInstrument(TRADE_DATE_1MCMP_S_3M_BS, 0.0, -NOTIONAL, ATTRIBUTE_1MCMP_S_3M_BS); // Payer private static final SwapDefinition BS_1MCMP_S_3M_DEFINITION = new SwapDefinition(LEG_1MCMP_S, LEG_3MCMP); public static final Swap<? extends Payment, ? extends Payment> BS_1MCMP_S_3M = BS_1MCMP_S_3M_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR1M_USDLIBOR3M); // Instrument description: Swap LIBOR1M Compounding 3M v LIBOR3M private static final ZonedDateTime TRADE_DATE_1MCMP_3M_BS = DateUtils.getUTCDate(2014, 8, 27); private static final Period TENOR_SWAP_1MCMP_3M_BS = Period.ofYears(5); private static final double SPREAD_1MCMP_3M_BS = 0.00; private static final GeneratorAttributeIR ATTRIBUTE_1MCMP_3M_BS = new GeneratorAttributeIR(TENOR_SWAP_1MCMP_3M_BS); private static final AnnuityDefinition<?> LEG_1MCMP = LEG_USDLIBOR1MCMP3M.generateInstrument(TRADE_DATE_1MCMP_3M_BS, SPREAD_1MCMP_3M_BS, NOTIONAL, ATTRIBUTE_1MCMP_3M_BS); // Receiver private static final AnnuityDefinition<?> LEG_3MCMP_2 = LEG_USDLIBOR3M.generateInstrument(TRADE_DATE_1MCMP_3M_BS, 0.0, -NOTIONAL, ATTRIBUTE_1MCMP_3M_BS); // Payer private static final SwapDefinition BS_1MCMP_3M_DEFINITION = new SwapDefinition(LEG_1MCMP, LEG_3MCMP_2); public static final Swap<? extends Payment, ? extends Payment> BS_1MCMP_3M = BS_1MCMP_3M_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR1M_USDLIBOR3M); // Instrument description: Swap Fixed vs Libor3M - Stub 3M private static final ZonedDateTime TRADE_DATE_3M_STUB1 = DateUtils.getUTCDate(2014, 9, 10); private static final Period TENOR_SWAP_3M_STUB1 = Period.ofMonths(21); private static final double FIXED_RATE_3M_STUB1 = 0.0100; private static final GeneratorAttributeIR ATTRIBUTE_3M_STUB1 = new GeneratorAttributeIR(TENOR_SWAP_3M_STUB1); private static final AnnuityDefinition<?> LEG_FIXED_GEN_FIXED_STUB1 = LEG_USDFixed1Y.generateInstrument(TRADE_DATE_3M_STUB1, FIXED_RATE_3M_STUB1, NOTIONAL, ATTRIBUTE_3M_STUB1); private static final AnnuityDefinition<? extends CouponDefinition> LEG_IBOR_STUB1 = (AnnuityDefinition<? extends CouponDefinition>) LEG_USDLIBOR3M.generateInstrument(TRADE_DATE_3M_STUB1, 0.0, -NOTIONAL, ATTRIBUTE_3M_STUB1); private static final SwapCouponFixedCouponDefinition IRS_STUB1_DEFINITION = new SwapCouponFixedCouponDefinition(new AnnuityCouponFixedDefinition( (CouponFixedDefinition[])LEG_FIXED_GEN_FIXED_STUB1.getPayments(), NYC), LEG_IBOR_STUB1); public static final Swap<? extends Payment, ? extends Payment> IRS_STUB1 = IRS_STUB1_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); // Instrument description: IRS Fixed vs Libor3M - Stub 1M: Accrual period is 1M / fixing rate is based on 3M private static final ZonedDateTime TRADE_DATE_3M_STUB2 = DateUtils.getUTCDate(2014, 9, 10); private static final Period TENOR_SWAP_3M_STUB2 = Period.ofMonths(22); private static final double FIXED_RATE_3M_STUB2 = 0.0100; private static final GeneratorAttributeIR ATTRIBUTE_3M_STUB2 = new GeneratorAttributeIR(TENOR_SWAP_3M_STUB2); private static final PaymentDefinition[] PAYMENT_FIXED_STUB2 = LEG_USDFixed1Y.generateInstrument(TRADE_DATE_3M_STUB2, FIXED_RATE_3M_STUB2, NOTIONAL, ATTRIBUTE_3M_STUB2).getPayments(); private static final CouponFixedDefinition[] CPN_FIXED_STUB2_DEFINITION = new CouponFixedDefinition[PAYMENT_FIXED_STUB2.length]; static { for (int loopcpn = 0; loopcpn < PAYMENT_FIXED_STUB2.length; loopcpn++) { CPN_FIXED_STUB2_DEFINITION[loopcpn] = (CouponFixedDefinition) PAYMENT_FIXED_STUB2[loopcpn]; } } private static final AnnuityCouponFixedDefinition LEG_FIXED_STUB2 = new AnnuityCouponFixedDefinition(CPN_FIXED_STUB2_DEFINITION, NYC); private static final AnnuityDefinition<? extends CouponDefinition> LEG_IBOR_STUB2 = (AnnuityDefinition<? extends CouponDefinition>) LEG_USDLIBOR3M.generateInstrument(TRADE_DATE_3M_STUB2, 0.0, -NOTIONAL, ATTRIBUTE_3M_STUB2); private static final SwapCouponFixedCouponDefinition IRS_STUB2_DEFINITION = new SwapCouponFixedCouponDefinition(LEG_FIXED_STUB2, LEG_IBOR_STUB2); public static final Swap<? extends Payment, ? extends Payment> IRS_STUB2 = IRS_STUB2_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); // Instrument description: IRS Fixed vs Libor6M - Stub 3M: Accrual period is 3M / fixing rate is based on 3M private static final ZonedDateTime TRADE_DATE_3M_STUB3 = DateUtils.getUTCDate(2014, 9, 10); private static final ZonedDateTime SPOT_DATE_STUB3 = ScheduleCalculator.getAdjustedDate(TRADE_DATE_3M_STUB3, OFFSET_SPOT, NYC); private static final Period TENOR_SWAP_3M_STUB3 = Period.ofMonths(21); private static final ZonedDateTime END_DATE_STUB3 = SPOT_DATE_STUB3.plus(TENOR_SWAP_3M_STUB3); private static final double FIXED_RATE_3M_STUB3 = 0.0100; private static final GeneratorAttributeIR ATTRIBUTE_3M_STUB3 = new GeneratorAttributeIR(TENOR_SWAP_3M_STUB3); private static final PaymentDefinition[] PAYMENT_FIXED_STUB3 = LEG_USDFixed1Y.generateInstrument(TRADE_DATE_3M_STUB3, FIXED_RATE_3M_STUB3, NOTIONAL, ATTRIBUTE_3M_STUB3).getPayments(); private static final CouponFixedDefinition[] CPN_FIXED_STUB3_DEFINITION = new CouponFixedDefinition[PAYMENT_FIXED_STUB3.length]; static { for (int loopcpn = 0; loopcpn < PAYMENT_FIXED_STUB3.length; loopcpn++) { CPN_FIXED_STUB3_DEFINITION[loopcpn] = (CouponFixedDefinition) PAYMENT_FIXED_STUB3[loopcpn]; } } private static final AnnuityCouponFixedDefinition LEG_FIXED_STUB3 = new AnnuityCouponFixedDefinition(CPN_FIXED_STUB3_DEFINITION, NYC); private static final CouponStub CPN_STUB3 = new CouponStub(STUB_SHORT_START, USDLIBOR3M, USDLIBOR6M); private static final AnnuityDefinition<? extends CouponDefinition> LEG_IBOR_STUB3 = (AnnuityDefinition<? extends CouponDefinition>) new FloatingAnnuityDefinitionBuilder().payer(true).notional(NOTIONAL_PROVIDER). startDate(SPOT_DATE_STUB3.toLocalDate()).endDate(END_DATE_STUB3.toLocalDate()).index(USDLIBOR6M). accrualPeriodFrequency(P6M).rollDateAdjuster(RollConvention.NONE.getRollDateAdjuster(0)). resetDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR).accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR). dayCount(USDLIBOR6M.getDayCount()).fixingDateAdjustmentParameters(OFFSET_FIXING_USDLIBOR). currency(USD).spread(0.0).startStub(CPN_STUB3).build(); private static final SwapCouponFixedCouponDefinition IRS_STUB3_DEFINITION = new SwapCouponFixedCouponDefinition(LEG_FIXED_STUB3, LEG_IBOR_STUB3); public static final Swap<? extends Payment, ? extends Payment> IRS_STUB3 = IRS_STUB3_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); // Instrument description: IRS Fixed vs Libor6M - Stub 4M: Accrual period is 4M / fixing rate average 3M and 6M private static final ZonedDateTime TRADE_DATE_3M_STUB4 = DateUtils.getUTCDate(2014, 9, 10); private static final ZonedDateTime SPOT_DATE_STUB4 = ScheduleCalculator.getAdjustedDate(TRADE_DATE_3M_STUB4, OFFSET_SPOT, NYC); private static final Period TENOR_SWAP_3M_STUB4 = Period.ofMonths(22); private static final ZonedDateTime END_DATE_STUB4 = SPOT_DATE_STUB4.plus(TENOR_SWAP_3M_STUB4); private static final double FIXED_RATE_3M_STUB4 = 0.0100; private static final GeneratorAttributeIR ATTRIBUTE_3M_STUB4 = new GeneratorAttributeIR(TENOR_SWAP_3M_STUB4); private static final PaymentDefinition[] PAYMENT_FIXED_STUB4 = LEG_USDFixed1Y.generateInstrument(TRADE_DATE_3M_STUB4, FIXED_RATE_3M_STUB4, NOTIONAL, ATTRIBUTE_3M_STUB4).getPayments(); private static final CouponFixedDefinition[] CPN_FIXED_STUB4_DEFINITION = new CouponFixedDefinition[PAYMENT_FIXED_STUB4.length]; static { for (int loopcpn = 0; loopcpn < PAYMENT_FIXED_STUB4.length; loopcpn++) { CPN_FIXED_STUB4_DEFINITION[loopcpn] = (CouponFixedDefinition) PAYMENT_FIXED_STUB4[loopcpn]; } } private static final AnnuityCouponFixedDefinition LEG_FIXED_STUB4 = new AnnuityCouponFixedDefinition(CPN_FIXED_STUB4_DEFINITION, NYC); private static final CouponStub CPN_STUB4 = new CouponStub(STUB_SHORT_START, USDLIBOR3M, USDLIBOR6M); private static final AnnuityDefinition<? extends CouponDefinition> LEG_IBOR_STUB4 = (AnnuityDefinition<? extends CouponDefinition>) new FloatingAnnuityDefinitionBuilder().payer(true).notional(NOTIONAL_PROVIDER). startDate(SPOT_DATE_STUB4.toLocalDate()).endDate(END_DATE_STUB4.toLocalDate()).index(USDLIBOR6M). accrualPeriodFrequency(P6M).rollDateAdjuster(RollConvention.NONE.getRollDateAdjuster(0)). resetDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR).accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR). dayCount(USDLIBOR6M.getDayCount()).fixingDateAdjustmentParameters(OFFSET_FIXING_USDLIBOR). currency(USD).spread(0.0).startStub(CPN_STUB4).build(); private static final SwapCouponFixedCouponDefinition IRS_STUB4_DEFINITION = new SwapCouponFixedCouponDefinition(LEG_FIXED_STUB4, LEG_IBOR_STUB4); public static final Swap<? extends Payment, ? extends Payment> IRS_STUB4 = IRS_STUB4_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); // Instrument description: IRS Fixed vs Libor3M - Stub Long Start 6M: Accrual period is 5M30D / fixing rate 6M private static final ZonedDateTime SPOT_DATE_STUB5 = DateUtils.getUTCDate(2014, 3, 12); private static final ZonedDateTime END_DATE_STUB5 = DateUtils.getUTCDate(2021, 9, 11); private static final double FIXED_RATE_3M_STUB5 = 0.0150; private static final CouponStub CPN_FIXED_STUB5 = new CouponStub(StubType.LONG_START); private static final PaymentDefinition[] PAYMENT_FIXED_STUB5 = new FixedAnnuityDefinitionBuilder(). payer(false).currency(USD6MLIBOR3M.getCurrency()).notional(NOTIONAL_PROVIDER).startDate(SPOT_DATE_STUB5.toLocalDate()). endDate(END_DATE_STUB5.toLocalDate()).dayCount(USD6MLIBOR3M.getFixedLegDayCount()). accrualPeriodFrequency(USD6MLIBOR3M.getFixedLegPeriod()).rate(FIXED_RATE_3M_STUB5). accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR).startStub(CPN_FIXED_STUB5). build().getPayments(); private static final CouponFixedDefinition[] CPN_FIXED_STUB5_DEFINITION = new CouponFixedDefinition[PAYMENT_FIXED_STUB5.length]; static { for (int loopcpn = 0; loopcpn < PAYMENT_FIXED_STUB5.length; loopcpn++) { CPN_FIXED_STUB5_DEFINITION[loopcpn] = (CouponFixedDefinition) PAYMENT_FIXED_STUB5[loopcpn]; } } private static final CouponStub CPN_IBOR_STUB5 = new CouponStub(StubType.LONG_START, USDLIBOR6M, USDLIBOR6M); private static final AnnuityCouponFixedDefinition LEG_FIXED_STUB5 = new AnnuityCouponFixedDefinition(CPN_FIXED_STUB5_DEFINITION, NYC); private static final AnnuityDefinition<? extends CouponDefinition> LEG_IBOR_STUB5 = (AnnuityDefinition<? extends CouponDefinition>) new FloatingAnnuityDefinitionBuilder().payer(true).notional(NOTIONAL_PROVIDER). startDate(SPOT_DATE_STUB5.toLocalDate()).endDate(END_DATE_STUB5.toLocalDate()).index(USDLIBOR3M). accrualPeriodFrequency(P3M).rollDateAdjuster(RollConvention.NONE.getRollDateAdjuster(0)). resetDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR).accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR). dayCount(USDLIBOR3M.getDayCount()).fixingDateAdjustmentParameters(OFFSET_FIXING_USDLIBOR). currency(USD).spread(0.0).startStub(CPN_IBOR_STUB5).build(); private static final SwapCouponFixedCouponDefinition IRS_STUB5_DEFINITION = new SwapCouponFixedCouponDefinition(LEG_FIXED_STUB5, LEG_IBOR_STUB5); public static final Swap<? extends Payment, ? extends Payment> IRS_STUB5 = IRS_STUB5_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); // Instrument description: IRS Fixed vs Libor3M - Short end Stub 2M: Accrual period is 2M / fixing rate average 1M and 3M private static final ZonedDateTime SPOT_DATE_STUB6 = DateUtils.getUTCDate(2014, 3, 12); private static final ZonedDateTime END_DATE_STUB6 = DateUtils.getUTCDate(2021, 11, 12); private static final double FIXED_RATE_3M_STUB6 = 0.0150; private static final CouponStub CPN_FIXED_STUB6 = new CouponStub(StubType.SHORT_END); private static final PaymentDefinition[] PAYMENT_FIXED_STUB6 = new FixedAnnuityDefinitionBuilder(). payer(false).currency(USD6MLIBOR3M.getCurrency()).notional(NOTIONAL_PROVIDER).startDate(SPOT_DATE_STUB6.toLocalDate()). endDate(END_DATE_STUB6.toLocalDate()).dayCount(USD6MLIBOR3M.getFixedLegDayCount()). accrualPeriodFrequency(USD6MLIBOR3M.getFixedLegPeriod()).rate(FIXED_RATE_3M_STUB6). accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR).endStub(CPN_FIXED_STUB6). build().getPayments(); private static final CouponFixedDefinition[] CPN_FIXED_STUB6_DEFINITION = new CouponFixedDefinition[PAYMENT_FIXED_STUB6.length]; static { for (int loopcpn = 0; loopcpn < PAYMENT_FIXED_STUB6.length; loopcpn++) { CPN_FIXED_STUB6_DEFINITION[loopcpn] = (CouponFixedDefinition) PAYMENT_FIXED_STUB6[loopcpn]; } } private static final CouponStub CPN_IBOR_STUB6 = new CouponStub(StubType.SHORT_END, USDLIBOR1M, USDLIBOR3M); private static final AnnuityCouponFixedDefinition LEG_FIXED_STUB6 = new AnnuityCouponFixedDefinition(CPN_FIXED_STUB6_DEFINITION, NYC); private static final AnnuityDefinition<? extends CouponDefinition> LEG_IBOR_STUB6 = (AnnuityDefinition<? extends CouponDefinition>) new FloatingAnnuityDefinitionBuilder().payer(true).notional(NOTIONAL_PROVIDER). startDate(SPOT_DATE_STUB6.toLocalDate()).endDate(END_DATE_STUB6.toLocalDate()).index(USDLIBOR6M). accrualPeriodFrequency(P6M).rollDateAdjuster(RollConvention.NONE.getRollDateAdjuster(0)). resetDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR).accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR). dayCount(USDLIBOR6M.getDayCount()).fixingDateAdjustmentParameters(OFFSET_FIXING_USDLIBOR). currency(USD).spread(0.0).endStub(CPN_IBOR_STUB6).build(); private static final SwapCouponFixedCouponDefinition IRS_STUB6_DEFINITION = new SwapCouponFixedCouponDefinition(LEG_FIXED_STUB6, LEG_IBOR_STUB6); public static final Swap<? extends Payment, ? extends Payment> IRS_STUB6 = IRS_STUB6_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); // Instrument description: Zero Coupon IRS Fixed vs Libor3M private static final LocalDate SPOT_DATE_ZC = LocalDate.of(2014, 9, 12); private static final LocalDate END_DATE_ZC = LocalDate.of(2021, 9, 12); private static final AdjustedDateParameters ADJUSTED_DATE_USDLIBOR_ZC = new AdjustedDateParameters(NYC, BDC_MODFOL); private static final OffsetAdjustedDateParameters OFFSET_FIXING_USDLIBOR_ZC = new OffsetAdjustedDateParameters(-OFFSET_SPOT, OffsetType.BUSINESS, NYC, BDC_MODFOL); private static final OffsetAdjustedDateParameters OFFSET_PAYMENT_USDLIBOR_ZC = new OffsetAdjustedDateParameters(0, OffsetType.BUSINESS, NYC, BDC_MODFOL); private static final Period ZERO_PERIOD = Period.ZERO; private static final double FIXED_RATE_ZC = 0.0150; private static final RollDateAdjuster ROLL_DATE_ADJUSTER_ZC = RollConvention.NONE.getRollDateAdjuster(0); private static final AnnuityDefinition<?> LEG_FIXED = new FixedAnnuityDefinitionBuilder(). payer(true).currency(USD).notional(NOTIONAL_PROVIDER).startDate(SPOT_DATE_ZC).endDate(END_DATE_ZC). endDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR_ZC).startDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR_ZC). dayCount(DC_30U_360).accrualPeriodFrequency(ZERO_PERIOD).accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR_ZC). paymentDateAdjustmentParameters(OFFSET_PAYMENT_USDLIBOR_ZC).rate(FIXED_RATE_ZC).build(); private static final AnnuityDefinition<?> LEG_IBOR_3M = new FloatingAnnuityDefinitionBuilder(). payer(false).currency(USD).notional(NOTIONAL_PROVIDER).startDate(SPOT_DATE_ZC).endDate(END_DATE_ZC). endDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR_ZC).startDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR_ZC). dayCount(USDLIBOR3M.getDayCount()).accrualPeriodFrequency(ZERO_PERIOD) .accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR_ZC).paymentDateAdjustmentParameters(OFFSET_PAYMENT_USDLIBOR_ZC). index(USDLIBOR3M).resetDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR_ZC). fixingDateAdjustmentParameters(OFFSET_FIXING_USDLIBOR_ZC).compoundingMethod(CompoundingMethod.STRAIGHT) .rollDateAdjuster(ROLL_DATE_ADJUSTER_ZC).build(); private static final SwapDefinition IRS_ZERO_CPN_DEFINITION = new SwapDefinition(LEG_FIXED, LEG_IBOR_3M); public static final Swap<? extends Payment, ? extends Payment> IRS_ZERO_CPN = IRS_ZERO_CPN_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); // Instrument description: Amortizing Swap, Fixed vs Libor3M private static final LocalDate SPOT_DATE_AM = LocalDate.of(2014, 9, 12); private static final LocalDate END_DATE_AM = LocalDate.of(2021, 9, 12); private static final double FIXED_RATE_AM = 0.0160; private static final NotionalProvider NOTIONAL_PROVIDER_AM_FLOATING; static { // ZonedDateTime startDate = SPOT_DATE_AM.atTime(LocalTime.MIN).atZone(ZoneOffset.UTC); // ZonedDateTime[] accrualEndDates = ScheduleCalculator.getAdjustedDateSchedule(startDate, // END_DATE_AM.atTime(LocalTime.MIN).atZone(ZoneOffset.UTC), P3M, StubType.NONE, // ADJUSTED_DATE_USDLIBOR.getBusinessDayConvention(), ADJUSTED_DATE_USDLIBOR.getCalendar(), null); // ZonedDateTime[] accrualStartDates = ScheduleCalculator.getStartDates(startDate, accrualEndDates); // int nDates = accrualStartDates.length; // LocalDate[] dates = new LocalDate[nDates]; // double[] notionals = new double[nDates]; // for (int i = 0; i < nDates; ++i) { // dates[i] = accrualStartDates[i].toLocalDate(); // notional is specified by accrual start date // notionals[i] = NOTIONAL * (1.0 - 0.03 * i); // } // NOTIONAL_PROVIDER_AM_FLOATING = new VariableNotionalProvider(dates, notionals); /* * If schedule is not known/computed, use new VariableNotionalProvider(notionals) */ int nDates = 28; double[] notionals = new double[nDates]; for (int i = 0; i < nDates; ++i) { notionals[i] = NOTIONAL * (1.0 - 0.03 * i); } NOTIONAL_PROVIDER_AM_FLOATING = new VariableNotionalProvider(notionals); } private static final AnnuityDefinition<?> LEG_LIBOR_3M_AM = new FloatingAnnuityDefinitionBuilder() .payer(true).startDate(SPOT_DATE_AM).endDate(END_DATE_AM).index(USDLIBOR3M).accrualPeriodFrequency(P3M) .rollDateAdjuster(RollConvention.NONE.getRollDateAdjuster(0)) .resetDateAdjustmentParameters(ADJUSTED_DATE_USDLIBOR).accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR). dayCount(USDLIBOR3M.getDayCount()).fixingDateAdjustmentParameters(OFFSET_FIXING_USDLIBOR).currency(USD) .spread(0.0).fixingDateAdjustmentParameters(OFFSET_FIXING_USDLIBOR).notional(NOTIONAL_PROVIDER_AM_FLOATING) .build(); private static final AnnuityDefinition<?> LEG_FIXED_AM = new FixedAnnuityDefinitionBuilder(). payer(false).currency(USD).startDate(SPOT_DATE_AM).endDate(END_DATE_AM). dayCount(DC_30U_360).accrualPeriodFrequency(P3M).rate(FIXED_RATE_AM) .accrualPeriodParameters(ADJUSTED_DATE_USDLIBOR).notional(NOTIONAL_PROVIDER_AM_FLOATING).build(); private static final SwapDefinition SWAP_AMORTIZING_DEFINITION = new SwapDefinition(LEG_FIXED_AM, LEG_LIBOR_3M_AM); public static final Swap<? extends Payment, ? extends Payment> SWAP_AMORTIZING = SWAP_AMORTIZING_DEFINITION.toDerivative(VALUATION_DATE, TS_ARRAY_USDLIBOR3M_2X); }