/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.product.swap; import static com.opengamma.strata.basics.date.BusinessDayConventions.FOLLOWING; import static com.opengamma.strata.basics.date.DayCounts.ACT_360; import static com.opengamma.strata.basics.date.DayCounts.ACT_365F; import static com.opengamma.strata.basics.date.HolidayCalendarIds.GBLO; import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_1M; import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_1W; import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_3M; import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_6M; import static com.opengamma.strata.basics.schedule.Frequency.P1M; import static com.opengamma.strata.basics.schedule.Frequency.P3M; import static com.opengamma.strata.basics.schedule.RollConventions.DAY_5; import static com.opengamma.strata.collect.TestHelper.assertSerialization; import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg; import static com.opengamma.strata.collect.TestHelper.coverBeanEquals; import static com.opengamma.strata.collect.TestHelper.coverImmutableBean; import static com.opengamma.strata.collect.TestHelper.date; import static com.opengamma.strata.product.swap.FixingRelativeTo.PERIOD_END; import static com.opengamma.strata.product.swap.FixingRelativeTo.PERIOD_START; import static com.opengamma.strata.product.swap.IborRateResetMethod.UNWEIGHTED; import static com.opengamma.strata.product.swap.IborRateResetMethod.WEIGHTED; import static com.opengamma.strata.product.swap.NegativeRateMethod.ALLOW_NEGATIVE; import static com.opengamma.strata.product.swap.NegativeRateMethod.NOT_NEGATIVE; import static org.testng.Assert.assertEquals; import java.time.LocalDate; import java.util.Optional; import java.util.OptionalDouble; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.basics.date.BusinessDayAdjustment; import com.opengamma.strata.basics.date.DaysAdjustment; import com.opengamma.strata.basics.index.IborIndexObservation; import com.opengamma.strata.basics.index.Index; import com.opengamma.strata.basics.schedule.Schedule; import com.opengamma.strata.basics.schedule.SchedulePeriod; import com.opengamma.strata.basics.value.ValueAdjustment; import com.opengamma.strata.basics.value.ValueSchedule; import com.opengamma.strata.basics.value.ValueStep; import com.opengamma.strata.product.rate.FixedRateComputation; import com.opengamma.strata.product.rate.IborAveragedFixing; import com.opengamma.strata.product.rate.IborAveragedRateComputation; import com.opengamma.strata.product.rate.IborInterpolatedRateComputation; import com.opengamma.strata.product.rate.IborRateComputation; /** * Test. */ @Test public class IborRateCalculationTest { private static final ReferenceData REF_DATA = ReferenceData.standard(); private static final LocalDate DATE_01_02 = date(2014, 1, 2); private static final LocalDate DATE_01_03 = date(2014, 1, 3); private static final LocalDate DATE_01_05 = date(2014, 1, 5); private static final LocalDate DATE_01_06 = date(2014, 1, 6); private static final LocalDate DATE_01_07 = date(2014, 1, 7); private static final LocalDate DATE_01_08 = date(2014, 1, 8); private static final LocalDate DATE_01_31 = date(2014, 1, 31); private static final LocalDate DATE_02_03 = date(2014, 2, 3); private static final LocalDate DATE_02_05 = date(2014, 2, 5); private static final LocalDate DATE_02_28 = date(2014, 2, 28); private static final LocalDate DATE_03_03 = date(2014, 3, 3); private static final LocalDate DATE_03_05 = date(2014, 3, 5); private static final LocalDate DATE_04_02 = date(2014, 4, 2); private static final LocalDate DATE_04_03 = date(2014, 4, 3); private static final LocalDate DATE_04_04 = date(2014, 4, 4); private static final LocalDate DATE_04_05 = date(2014, 4, 5); private static final LocalDate DATE_04_07 = date(2014, 4, 7); private static final LocalDate DATE_05_01 = date(2014, 5, 1); private static final LocalDate DATE_05_06 = date(2014, 5, 6); private static final LocalDate DATE_06_03 = date(2014, 6, 3); private static final LocalDate DATE_06_05 = date(2014, 6, 5); private static final LocalDate DATE_07_05 = date(2014, 7, 5); private static final LocalDate DATE_07_07 = date(2014, 7, 7); private static final DaysAdjustment MINUS_ONE_DAY = DaysAdjustment.ofBusinessDays(-1, GBLO); private static final DaysAdjustment MINUS_TWO_DAYS = DaysAdjustment.ofBusinessDays(-2, GBLO); private static final DaysAdjustment MINUS_THREE_DAYS = DaysAdjustment.ofBusinessDays(-3, GBLO); private static final SchedulePeriod ACCRUAL1STUB = SchedulePeriod.of(DATE_01_08, DATE_02_05, DATE_01_08, DATE_02_05); private static final SchedulePeriod ACCRUAL1 = SchedulePeriod.of(DATE_01_06, DATE_02_05, DATE_01_05, DATE_02_05); private static final SchedulePeriod ACCRUAL2 = SchedulePeriod.of(DATE_02_05, DATE_03_05, DATE_02_05, DATE_03_05); private static final SchedulePeriod ACCRUAL3 = SchedulePeriod.of(DATE_03_05, DATE_04_07, DATE_03_05, DATE_04_05); private static final SchedulePeriod ACCRUAL3STUB = SchedulePeriod.of(DATE_03_05, DATE_04_04, DATE_03_05, DATE_04_04); private static final Schedule ACCRUAL_SCHEDULE = Schedule.builder() .periods(ACCRUAL1, ACCRUAL2, ACCRUAL3) .frequency(P1M) .rollConvention(DAY_5) .build(); private static final Schedule ACCRUAL_SCHEDULE_STUBS = Schedule.builder() .periods(ACCRUAL1STUB, ACCRUAL2, ACCRUAL3STUB) .frequency(P1M) .rollConvention(DAY_5) .build(); private static final Schedule ACCRUAL_SCHEDULE_INITIAL_STUB = Schedule.builder() .periods(ACCRUAL1STUB, ACCRUAL2, ACCRUAL3) .frequency(P1M) .rollConvention(DAY_5) .build(); private static final Schedule ACCRUAL_SCHEDULE_FINAL_STUB = Schedule.builder() .periods(ACCRUAL1, ACCRUAL2, ACCRUAL3STUB) .frequency(P1M) .rollConvention(DAY_5) .build(); //------------------------------------------------------------------------- public void test_of() { IborRateCalculation test = IborRateCalculation.of(GBP_LIBOR_3M); assertEquals(test.getType(), SwapLegType.IBOR); assertEquals(test.getDayCount(), ACT_365F); assertEquals(test.getIndex(), GBP_LIBOR_3M); assertEquals(test.getResetPeriods(), Optional.empty()); assertEquals(test.getFixingRelativeTo(), PERIOD_START); assertEquals(test.getFixingDateOffset(), GBP_LIBOR_3M.getFixingDateOffset()); assertEquals(test.getNegativeRateMethod(), ALLOW_NEGATIVE); assertEquals(test.getFirstRegularRate(), OptionalDouble.empty()); assertEquals(test.getInitialStub(), Optional.empty()); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getGearing(), Optional.empty()); assertEquals(test.getSpread(), Optional.empty()); } public void test_builder_ensureDefaults() { IborRateCalculation test = IborRateCalculation.builder() .index(GBP_LIBOR_3M) .build(); assertEquals(test.getDayCount(), ACT_365F); assertEquals(test.getIndex(), GBP_LIBOR_3M); assertEquals(test.getResetPeriods(), Optional.empty()); assertEquals(test.getFixingRelativeTo(), PERIOD_START); assertEquals(test.getFixingDateOffset(), GBP_LIBOR_3M.getFixingDateOffset()); assertEquals(test.getNegativeRateMethod(), ALLOW_NEGATIVE); assertEquals(test.getFirstRegularRate(), OptionalDouble.empty()); assertEquals(test.getInitialStub(), Optional.empty()); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getGearing(), Optional.empty()); assertEquals(test.getSpread(), Optional.empty()); } public void test_builder_ensureOptionalDouble() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .firstRegularRate(0.028d) .build(); assertEquals(test.getDayCount(), ACT_365F); assertEquals(test.getIndex(), GBP_LIBOR_3M); assertEquals(test.getResetPeriods(), Optional.empty()); assertEquals(test.getFixingRelativeTo(), PERIOD_START); assertEquals(test.getFixingDateOffset(), MINUS_TWO_DAYS); assertEquals(test.getNegativeRateMethod(), ALLOW_NEGATIVE); assertEquals(test.getFirstRegularRate(), OptionalDouble.of(0.028d)); assertEquals(test.getInitialStub(), Optional.empty()); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getGearing(), Optional.empty()); assertEquals(test.getSpread(), Optional.empty()); } public void test_builder_noIndex() { assertThrowsIllegalArg(() -> IborRateCalculation.builder().build()); } //------------------------------------------------------------------------- public void test_collectIndices_simple() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .build(); ImmutableSet.Builder<Index> builder = ImmutableSet.builder(); test.collectIndices(builder); assertEquals(builder.build(), ImmutableSet.of(GBP_LIBOR_1M)); } public void test_collectIndices_stubCalcsTwoStubs() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .initialStub(IborRateStubCalculation.ofIborRate(GBP_LIBOR_1W)) .finalStub(IborRateStubCalculation.ofIborRate(GBP_LIBOR_3M)) .build(); ImmutableSet.Builder<Index> builder = ImmutableSet.builder(); test.collectIndices(builder); assertEquals(builder.build(), ImmutableSet.of(GBP_LIBOR_1M, GBP_LIBOR_1W, GBP_LIBOR_3M)); } public void test_collectIndices_stubCalcsTwoStubs_interpolated() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .initialStub(IborRateStubCalculation.ofIborInterpolatedRate(GBP_LIBOR_1W, GBP_LIBOR_1M)) .finalStub(IborRateStubCalculation.ofIborInterpolatedRate(GBP_LIBOR_3M, GBP_LIBOR_1M)) .build(); ImmutableSet.Builder<Index> builder = ImmutableSet.builder(); test.collectIndices(builder); assertEquals(builder.build(), ImmutableSet.of(GBP_LIBOR_1M, GBP_LIBOR_1W, GBP_LIBOR_3M)); } //------------------------------------------------------------------------- public void test_expand_simple() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1) .yearFraction(ACCRUAL1.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_02, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE, ACCRUAL_SCHEDULE, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_simpleFinalStub() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1) .yearFraction(ACCRUAL1.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_FINAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_02, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_FINAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3STUB) .yearFraction(ACCRUAL3STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_FINAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_FINAL_STUB, ACCRUAL_SCHEDULE_FINAL_STUB, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_simpleInitialStub() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_06, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_INITIAL_STUB, ACCRUAL_SCHEDULE_INITIAL_STUB, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_simpleTwoStubs() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_06, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3STUB) .yearFraction(ACCRUAL3STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_STUBS, ACCRUAL_SCHEDULE_STUBS, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } //------------------------------------------------------------------------- public void test_expand_stubCalcsTwoStubs() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .initialStub(IborRateStubCalculation.ofIborRate(GBP_LIBOR_1W)) .finalStub(IborRateStubCalculation.ofIborRate(GBP_LIBOR_3M)) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1W, DATE_01_06, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3STUB) .yearFraction(ACCRUAL3STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_3M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_STUBS, ACCRUAL_SCHEDULE_STUBS, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_stubCalcsTwoStubs_interpolated() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .initialStub(IborRateStubCalculation.ofIborInterpolatedRate(GBP_LIBOR_1W, GBP_LIBOR_1M)) .finalStub(IborRateStubCalculation.ofIborInterpolatedRate(GBP_LIBOR_3M, GBP_LIBOR_1M)) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborInterpolatedRateComputation.of(GBP_LIBOR_1W, GBP_LIBOR_1M, DATE_01_06, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3STUB) .yearFraction(ACCRUAL3STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborInterpolatedRateComputation.of(GBP_LIBOR_1M, GBP_LIBOR_3M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_STUBS, ACCRUAL_SCHEDULE_STUBS, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } //------------------------------------------------------------------------- public void test_expand_firstFixingDateOffsetNoStub() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .firstFixingDateOffset(MINUS_ONE_DAY) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1) .yearFraction(ACCRUAL1.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_03, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE, ACCRUAL_SCHEDULE, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_firstFixingDateOffsetInitialStub() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .firstFixingDateOffset(MINUS_ONE_DAY) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_07, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_INITIAL_STUB, ACCRUAL_SCHEDULE_INITIAL_STUB, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } //------------------------------------------------------------------------- public void test_expand_firstRegularRateFixed() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .firstRegularRate(0.028d) .firstRate(0.024d) // ignored .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1) .yearFraction(ACCRUAL1.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(FixedRateComputation.of(0.028d)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE, ACCRUAL_SCHEDULE, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_firstRegularRateFixedInitialStub() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .firstRegularRate(0.028d) .firstRate(0.024d) // ignored .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_06, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(FixedRateComputation.of(0.028d)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_INITIAL_STUB, ACCRUAL_SCHEDULE_INITIAL_STUB, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_firstRegularRateFixedTwoStubs() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .firstRegularRate(0.028d) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_01_06, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(FixedRateComputation.of(0.028d)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3STUB) .yearFraction(ACCRUAL3STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_STUBS)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_STUBS, ACCRUAL_SCHEDULE_STUBS, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } //------------------------------------------------------------------------- public void test_expand_firstRateFixed() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .firstRate(0.024d) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1) .yearFraction(ACCRUAL1.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(FixedRateComputation.of(0.024d)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE, ACCRUAL_SCHEDULE, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_firstRateFixedInitialStubNotSpecified() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .firstRate(0.024d) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(FixedRateComputation.of(0.024d)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_INITIAL_STUB, ACCRUAL_SCHEDULE_INITIAL_STUB, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_firstRateFixedInitialStubSpecifiedNone() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .initialStub(IborRateStubCalculation.NONE) .firstRate(0.024d) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(FixedRateComputation.of(0.024d)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_INITIAL_STUB, ACCRUAL_SCHEDULE_INITIAL_STUB, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } public void test_expand_firstRateFixedInitialStubSpecified() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_1M) .fixingDateOffset(MINUS_TWO_DAYS) .initialStub(IborRateStubCalculation.ofIborRate(GBP_LIBOR_1W)) .firstRate(0.024d) // ignored .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1STUB) .yearFraction(ACCRUAL1STUB.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1W, DATE_01_06, REF_DATA)) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_02_03, REF_DATA)) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_365F, ACCRUAL_SCHEDULE_INITIAL_STUB)) .rateComputation(IborRateComputation.of(GBP_LIBOR_1M, DATE_03_03, REF_DATA)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE_INITIAL_STUB, ACCRUAL_SCHEDULE_INITIAL_STUB, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } //------------------------------------------------------------------------- public void test_expand_resetPeriods_weighted() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .resetPeriods(ResetSchedule.builder() .resetFrequency(P1M) .businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO)) .resetMethod(WEIGHTED) .build()) .build(); SchedulePeriod accrual1 = SchedulePeriod.of(DATE_01_06, DATE_04_07, DATE_01_05, DATE_04_05); SchedulePeriod accrual2 = SchedulePeriod.of(DATE_04_07, DATE_07_07, DATE_04_05, DATE_07_05); Schedule schedule = Schedule.builder() .periods(accrual1, accrual2) .frequency(P3M) .rollConvention(DAY_5) .build(); IborIndexObservation obs1 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_01_02, REF_DATA); IborIndexObservation obs2 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_02_03, REF_DATA); IborIndexObservation obs3 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_03_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings1 = ImmutableList.of( IborAveragedFixing.ofDaysInResetPeriod(obs1, DATE_01_06, DATE_02_05), IborAveragedFixing.ofDaysInResetPeriod(obs2, DATE_02_05, DATE_03_05), IborAveragedFixing.ofDaysInResetPeriod(obs3, DATE_03_05, DATE_04_07)); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(accrual1) .yearFraction(accrual1.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings1)) .build(); IborIndexObservation obs4 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_04_03, REF_DATA); IborIndexObservation obs5 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_05_01, REF_DATA); IborIndexObservation obs6 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_06_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings2 = ImmutableList.of( IborAveragedFixing.ofDaysInResetPeriod(obs4, DATE_04_07, DATE_05_06), IborAveragedFixing.ofDaysInResetPeriod(obs5, DATE_05_06, DATE_06_05), IborAveragedFixing.ofDaysInResetPeriod(obs6, DATE_06_05, DATE_07_07)); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(accrual2) .yearFraction(accrual2.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings2)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(schedule, schedule, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2)); } public void test_expand_resetPeriods_weighted_firstFixed() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .resetPeriods(ResetSchedule.builder() .resetFrequency(P1M) .businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO)) .resetMethod(WEIGHTED) .build()) .firstRegularRate(0.028d) .build(); SchedulePeriod accrual1 = SchedulePeriod.of(DATE_01_06, DATE_04_07, DATE_01_05, DATE_04_05); SchedulePeriod accrual2 = SchedulePeriod.of(DATE_04_07, DATE_07_07, DATE_04_05, DATE_07_05); Schedule schedule = Schedule.builder() .periods(accrual1, accrual2) .frequency(P3M) .rollConvention(DAY_5) .build(); IborIndexObservation obs1 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_01_02, REF_DATA); IborIndexObservation obs2 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_02_03, REF_DATA); IborIndexObservation obs3 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_03_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings1 = ImmutableList.of( IborAveragedFixing.ofDaysInResetPeriod(obs1, DATE_01_06, DATE_02_05, 0.028d), IborAveragedFixing.ofDaysInResetPeriod(obs2, DATE_02_05, DATE_03_05), IborAveragedFixing.ofDaysInResetPeriod(obs3, DATE_03_05, DATE_04_07)); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(accrual1) .yearFraction(accrual1.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings1)) .build(); IborIndexObservation obs4 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_04_03, REF_DATA); IborIndexObservation obs5 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_05_01, REF_DATA); IborIndexObservation obs6 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_06_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings2 = ImmutableList.of( IborAveragedFixing.ofDaysInResetPeriod(obs4, DATE_04_07, DATE_05_06), IborAveragedFixing.ofDaysInResetPeriod(obs5, DATE_05_06, DATE_06_05), IborAveragedFixing.ofDaysInResetPeriod(obs6, DATE_06_05, DATE_07_07)); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(accrual2) .yearFraction(accrual2.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings2)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(schedule, schedule, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2)); } public void test_expand_resetPeriods_weighted_firstFixingDateOffset() { // only the fixing date of the first reset period is changed, everything else stays the same IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .resetPeriods(ResetSchedule.builder() .resetFrequency(P1M) .businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO)) .resetMethod(WEIGHTED) .build()) .firstFixingDateOffset(MINUS_ONE_DAY) .build(); SchedulePeriod accrual1 = SchedulePeriod.of(DATE_01_06, DATE_04_07, DATE_01_05, DATE_04_05); SchedulePeriod accrual2 = SchedulePeriod.of(DATE_04_07, DATE_07_07, DATE_04_05, DATE_07_05); Schedule schedule = Schedule.builder() .periods(accrual1, accrual2) .frequency(P3M) .rollConvention(DAY_5) .build(); IborIndexObservation obs1 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_01_03, REF_DATA); IborIndexObservation obs2 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_02_03, REF_DATA); IborIndexObservation obs3 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_03_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings1 = ImmutableList.of( IborAveragedFixing.ofDaysInResetPeriod(obs1, DATE_01_06, DATE_02_05), IborAveragedFixing.ofDaysInResetPeriod(obs2, DATE_02_05, DATE_03_05), IborAveragedFixing.ofDaysInResetPeriod(obs3, DATE_03_05, DATE_04_07)); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(accrual1) .yearFraction(accrual1.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings1)) .build(); IborIndexObservation obs4 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_04_03, REF_DATA); IborIndexObservation obs5 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_05_01, REF_DATA); IborIndexObservation obs6 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_06_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings2 = ImmutableList.of( IborAveragedFixing.ofDaysInResetPeriod(obs4, DATE_04_07, DATE_05_06), IborAveragedFixing.ofDaysInResetPeriod(obs5, DATE_05_06, DATE_06_05), IborAveragedFixing.ofDaysInResetPeriod(obs6, DATE_06_05, DATE_07_07)); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(accrual2) .yearFraction(accrual2.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings2)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(schedule, schedule, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2)); } public void test_expand_resetPeriods_unweighted() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .resetPeriods(ResetSchedule.builder() .resetFrequency(P1M) .businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO)) .resetMethod(UNWEIGHTED) .build()) .build(); SchedulePeriod accrual1 = SchedulePeriod.of(DATE_01_06, DATE_04_07, DATE_01_05, DATE_04_05); SchedulePeriod accrual2 = SchedulePeriod.of(DATE_04_07, DATE_07_07, DATE_04_05, DATE_07_05); Schedule schedule = Schedule.builder() .periods(accrual1, accrual2) .frequency(P3M) .rollConvention(DAY_5) .build(); IborIndexObservation obs1 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_01_02, REF_DATA); IborIndexObservation obs2 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_02_03, REF_DATA); IborIndexObservation obs3 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_03_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings1 = ImmutableList.of( IborAveragedFixing.of(obs1), IborAveragedFixing.of(obs2), IborAveragedFixing.of(obs3)); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(accrual1) .yearFraction(accrual1.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings1)) .build(); IborIndexObservation obs4 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_04_03, REF_DATA); IborIndexObservation obs5 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_05_01, REF_DATA); IborIndexObservation obs6 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_06_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings2 = ImmutableList.of( IborAveragedFixing.of(obs4), IborAveragedFixing.of(obs5), IborAveragedFixing.of(obs6)); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(accrual2) .yearFraction(accrual2.yearFraction(ACT_365F, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings2)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(schedule, schedule, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2)); } public void test_expand_initialStubAndResetPeriods_weighted_firstFixed() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_360) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .resetPeriods(ResetSchedule.builder() .resetFrequency(P1M) .businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO)) .resetMethod(WEIGHTED) .build()) .firstRegularRate(0.028d) .initialStub(IborRateStubCalculation.ofFixedRate(0.030d)) .build(); SchedulePeriod accrual1 = SchedulePeriod.of(DATE_02_05, DATE_04_07, DATE_02_05, DATE_04_05); SchedulePeriod accrual2 = SchedulePeriod.of(DATE_04_07, DATE_07_07, DATE_04_05, DATE_07_05); Schedule schedule = Schedule.builder() .periods(accrual1, accrual2) .frequency(P3M) .rollConvention(DAY_5) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(accrual1) .yearFraction(accrual1.yearFraction(ACT_360, schedule)) .rateComputation(FixedRateComputation.of(0.030d)) .build(); IborIndexObservation obs4 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_04_03, REF_DATA); IborIndexObservation obs5 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_05_01, REF_DATA); IborIndexObservation obs6 = IborIndexObservation.of(GBP_LIBOR_3M, DATE_06_03, REF_DATA); ImmutableList<IborAveragedFixing> fixings2 = ImmutableList.of( IborAveragedFixing.ofDaysInResetPeriod(obs4, DATE_04_07, DATE_05_06, 0.028d), IborAveragedFixing.ofDaysInResetPeriod(obs5, DATE_05_06, DATE_06_05), IborAveragedFixing.ofDaysInResetPeriod(obs6, DATE_06_05, DATE_07_07)); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(accrual2) .yearFraction(accrual2.yearFraction(ACT_360, schedule)) .rateComputation(IborAveragedRateComputation.of(fixings2)) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(schedule, schedule, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2)); } //------------------------------------------------------------------------- public void test_expand_gearingSpreadEverythingElse() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_360) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_THREE_DAYS) .fixingRelativeTo(PERIOD_END) .negativeRateMethod(NOT_NEGATIVE) .gearing(ValueSchedule.of(1d, ValueStep.of(2, ValueAdjustment.ofReplace(2d)))) .spread(ValueSchedule.of(0d, ValueStep.of(1, ValueAdjustment.ofReplace(-0.025d)))) .build(); RateAccrualPeriod rap1 = RateAccrualPeriod.builder(ACCRUAL1) .yearFraction(ACCRUAL1.yearFraction(ACT_360, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_3M, DATE_01_31, REF_DATA)) .negativeRateMethod(NOT_NEGATIVE) .build(); RateAccrualPeriod rap2 = RateAccrualPeriod.builder(ACCRUAL2) .yearFraction(ACCRUAL2.yearFraction(ACT_360, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_3M, DATE_02_28, REF_DATA)) .negativeRateMethod(NOT_NEGATIVE) .spread(-0.025d) .build(); RateAccrualPeriod rap3 = RateAccrualPeriod.builder(ACCRUAL3) .yearFraction(ACCRUAL3.yearFraction(ACT_360, ACCRUAL_SCHEDULE)) .rateComputation(IborRateComputation.of(GBP_LIBOR_3M, DATE_04_02, REF_DATA)) .negativeRateMethod(NOT_NEGATIVE) .gearing(2d) .spread(-0.025d) .build(); ImmutableList<RateAccrualPeriod> periods = test.createAccrualPeriods(ACCRUAL_SCHEDULE, ACCRUAL_SCHEDULE, REF_DATA); assertEquals(periods, ImmutableList.of(rap1, rap2, rap3)); } //------------------------------------------------------------------------- public void coverage() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .build(); coverImmutableBean(test); IborRateCalculation test2 = IborRateCalculation.builder() .dayCount(ACT_360) .index(GBP_LIBOR_6M) .resetPeriods(ResetSchedule.builder() .resetFrequency(P3M) .resetMethod(IborRateResetMethod.UNWEIGHTED) .businessDayAdjustment(BusinessDayAdjustment.NONE) .build()) .fixingDateOffset(MINUS_THREE_DAYS) .fixingRelativeTo(PERIOD_END) .negativeRateMethod(NOT_NEGATIVE) .firstRegularRate(0.028d) .initialStub(IborRateStubCalculation.NONE) .finalStub(IborRateStubCalculation.NONE) .gearing(ValueSchedule.of(2d)) .spread(ValueSchedule.of(-0.025d)) .build(); coverBeanEquals(test, test2); } public void test_serialization() { IborRateCalculation test = IborRateCalculation.builder() .dayCount(ACT_365F) .index(GBP_LIBOR_3M) .fixingDateOffset(MINUS_TWO_DAYS) .build(); assertSerialization(test); } }