@Override public ImmutableList<RateAccrualPeriod> createAccrualPeriods( Schedule accrualSchedule, Schedule paymentSchedule, ReferenceData refData) { // resolve data by schedule DoubleArray resolvedGearings = firstNonNull(gearing, ALWAYS_1).resolveValues(accrualSchedule); // build accrual periods ImmutableList.Builder<RateAccrualPeriod> accrualPeriods = ImmutableList.builder(); for (int i = 0; i < accrualSchedule.size(); i++) { SchedulePeriod period = accrualSchedule.getPeriod(i); // inflation does not use a day count, so year fraction is 1d accrualPeriods.add(new RateAccrualPeriod( period, 1d, createRateComputation(period, i), resolvedGearings.get(i), 0d, NegativeRateMethod.ALLOW_NEGATIVE)); } return accrualPeriods.build(); }
public void test_ofTerm() { Schedule test = Schedule.ofTerm(P1_STUB); assertEquals(test.size(), 1); assertEquals(test.isTerm(), true); assertEquals(test.isSinglePeriod(), true); assertEquals(test.getFrequency(), TERM); assertEquals(test.getRollConvention(), RollConventions.NONE); assertEquals(test.isEndOfMonthConvention(), false); assertEquals(test.getPeriods(), ImmutableList.of(P1_STUB)); assertEquals(test.getPeriod(0), P1_STUB); assertEquals(test.getStartDate(), P1_STUB.getStartDate()); assertEquals(test.getEndDate(), P1_STUB.getEndDate()); assertEquals(test.getUnadjustedStartDate(), P1_STUB.getUnadjustedStartDate()); assertEquals(test.getUnadjustedEndDate(), P1_STUB.getUnadjustedEndDate()); assertEquals(test.getFirstPeriod(), P1_STUB); assertEquals(test.getLastPeriod(), P1_STUB); assertEquals(test.getInitialStub(), Optional.empty()); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getRegularPeriods(), ImmutableList.of(P1_STUB)); assertThrows(() -> test.getPeriod(1), IndexOutOfBoundsException.class); assertEquals(test.getUnadjustedDates(), ImmutableList.of(JUL_04, JUL_17)); }
public void test_of_size4_bothStubs() { Schedule test = Schedule.builder() .periods(ImmutableList.of(P1_STUB, P2_NORMAL, P3_NORMAL, P4_STUB)) .frequency(P1M) .rollConvention(DAY_17) .build(); assertEquals(test.size(), 4); assertEquals(test.isTerm(), false); assertEquals(test.isSinglePeriod(), false); assertEquals(test.getFrequency(), P1M); assertEquals(test.getRollConvention(), DAY_17); assertEquals(test.isEndOfMonthConvention(), false); assertEquals(test.getPeriods(), ImmutableList.of(P1_STUB, P2_NORMAL, P3_NORMAL, P4_STUB)); assertEquals(test.getPeriod(0), P1_STUB); assertEquals(test.getPeriod(1), P2_NORMAL); assertEquals(test.getPeriod(2), P3_NORMAL); assertEquals(test.getPeriod(3), P4_STUB); assertEquals(test.getStartDate(), P1_STUB.getStartDate()); assertEquals(test.getEndDate(), P4_STUB.getEndDate()); assertEquals(test.getUnadjustedStartDate(), P1_STUB.getUnadjustedStartDate()); assertEquals(test.getUnadjustedEndDate(), P4_STUB.getUnadjustedEndDate()); assertEquals(test.getFirstPeriod(), P1_STUB); assertEquals(test.getLastPeriod(), P4_STUB); assertEquals(test.getInitialStub(), Optional.of(P1_STUB)); assertEquals(test.getFinalStub(), Optional.of(P4_STUB)); assertEquals(test.getRegularPeriods(), ImmutableList.of(P2_NORMAL, P3_NORMAL)); assertThrows(() -> test.getPeriod(4), IndexOutOfBoundsException.class); assertEquals(test.getUnadjustedDates(), ImmutableList.of(JUL_04, JUL_17, AUG_17, SEP_17, SEP_30)); }
@Override public ImmutableList<RateAccrualPeriod> createAccrualPeriods( Schedule accrualSchedule, Schedule paymentSchedule, ReferenceData refData) { // resolve data by schedule DoubleArray resolvedGearings = firstNonNull(gearing, ALWAYS_1).resolveValues(accrualSchedule); DoubleArray resolvedSpreads = firstNonNull(spread, ALWAYS_0).resolveValues(accrualSchedule); // build accrual periods ImmutableList.Builder<RateAccrualPeriod> accrualPeriods = ImmutableList.builder(); for (int i = 0; i < accrualSchedule.size(); i++) { SchedulePeriod period = accrualSchedule.getPeriod(i); double yearFraction = period.yearFraction(dayCount, accrualSchedule); RateComputation rateComputation = createRateComputation(period, paymentSchedule, refData); accrualPeriods.add(new RateAccrualPeriod( period, yearFraction, rateComputation, resolvedGearings.get(i), resolvedSpreads.get(i), negativeRateMethod)); } return accrualPeriods.build(); }
public void test_of_size2_initialStub() { Schedule test = Schedule.builder() .periods(ImmutableList.of(P1_STUB, P2_NORMAL)) .frequency(P1M) .rollConvention(DAY_17) .build(); assertEquals(test.size(), 2); assertEquals(test.isTerm(), false); assertEquals(test.isSinglePeriod(), false); assertEquals(test.getFrequency(), P1M); assertEquals(test.getRollConvention(), DAY_17); assertEquals(test.isEndOfMonthConvention(), false); assertEquals(test.getPeriods(), ImmutableList.of(P1_STUB, P2_NORMAL)); assertEquals(test.getPeriod(0), P1_STUB); assertEquals(test.getPeriod(1), P2_NORMAL); assertEquals(test.getStartDate(), P1_STUB.getStartDate()); assertEquals(test.getEndDate(), P2_NORMAL.getEndDate()); assertEquals(test.getUnadjustedStartDate(), P1_STUB.getUnadjustedStartDate()); assertEquals(test.getUnadjustedEndDate(), P2_NORMAL.getUnadjustedEndDate()); assertEquals(test.getFirstPeriod(), P1_STUB); assertEquals(test.getLastPeriod(), P2_NORMAL); assertEquals(test.getInitialStub(), Optional.of(P1_STUB)); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getRegularPeriods(), ImmutableList.of(P2_NORMAL)); assertThrows(() -> test.getPeriod(2), IndexOutOfBoundsException.class); assertEquals(test.getUnadjustedDates(), ImmutableList.of(JUL_04, JUL_17, AUG_17)); }
public void test_subSchedule_1monthIn3Month() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P1M, RollConventions.DAY_17, StubConvention.NONE, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 3); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, JUL_17)); assertEquals(schedule.getPeriod(1), SchedulePeriod.of(JUL_17, AUG_17)); assertEquals(schedule.getPeriod(2), SchedulePeriod.of(AUG_17, SEP_17)); assertEquals(schedule.getFrequency(), P1M); assertEquals(schedule.getRollConvention(), RollConventions.DAY_17); }
public void test_of_size2_noStub() { Schedule test = Schedule.builder() .periods(ImmutableList.of(P2_NORMAL, P3_NORMAL)) .frequency(P1M) .rollConvention(DAY_17) .build(); assertEquals(test.size(), 2); assertEquals(test.isTerm(), false); assertEquals(test.isSinglePeriod(), false); assertEquals(test.getFrequency(), P1M); assertEquals(test.getRollConvention(), DAY_17); assertEquals(test.isEndOfMonthConvention(), false); assertEquals(test.getPeriods(), ImmutableList.of(P2_NORMAL, P3_NORMAL)); assertEquals(test.getPeriod(0), P2_NORMAL); assertEquals(test.getPeriod(1), P3_NORMAL); assertEquals(test.getStartDate(), P2_NORMAL.getStartDate()); assertEquals(test.getEndDate(), P3_NORMAL.getEndDate()); assertEquals(test.getUnadjustedStartDate(), P2_NORMAL.getUnadjustedStartDate()); assertEquals(test.getUnadjustedEndDate(), P3_NORMAL.getUnadjustedEndDate()); assertEquals(test.getFirstPeriod(), P2_NORMAL); assertEquals(test.getLastPeriod(), P3_NORMAL); assertEquals(test.getInitialStub(), Optional.empty()); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getRegularPeriods(), ImmutableList.of(P2_NORMAL, P3_NORMAL)); assertThrows(() -> test.getPeriod(2), IndexOutOfBoundsException.class); assertEquals(test.getUnadjustedDates(), ImmutableList.of(JUL_17, AUG_17, SEP_17)); }
public void test_subSchedule_2monthIn3Month_shortFinal() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P2M, RollConventions.DAY_17, StubConvention.SHORT_FINAL, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 2); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, AUG_17)); assertEquals(schedule.getPeriod(1), SchedulePeriod.of(AUG_17, SEP_17)); assertEquals(schedule.getFrequency(), P2M); assertEquals(schedule.getRollConvention(), RollConventions.DAY_17); }
public void test_of_size2_finalStub() { Schedule test = Schedule.builder() .periods(ImmutableList.of(P3_NORMAL, P4_STUB)) .frequency(P1M) .rollConvention(DAY_17) .build(); assertEquals(test.size(), 2); assertEquals(test.isTerm(), false); assertEquals(test.isSinglePeriod(), false); assertEquals(test.getFrequency(), P1M); assertEquals(test.getRollConvention(), DAY_17); assertEquals(test.isEndOfMonthConvention(), false); assertEquals(test.getPeriods(), ImmutableList.of(P3_NORMAL, P4_STUB)); assertEquals(test.getPeriod(0), P3_NORMAL); assertEquals(test.getPeriod(1), P4_STUB); assertEquals(test.getStartDate(), P3_NORMAL.getStartDate()); assertEquals(test.getEndDate(), P4_STUB.getEndDate()); assertEquals(test.getUnadjustedStartDate(), P3_NORMAL.getUnadjustedStartDate()); assertEquals(test.getUnadjustedEndDate(), P4_STUB.getUnadjustedEndDate()); assertEquals(test.getFirstPeriod(), P3_NORMAL); assertEquals(test.getLastPeriod(), P4_STUB); assertEquals(test.getInitialStub(), Optional.empty()); assertEquals(test.getFinalStub(), Optional.of(P4_STUB)); assertEquals(test.getRegularPeriods(), ImmutableList.of(P3_NORMAL)); assertThrows(() -> test.getPeriod(2), IndexOutOfBoundsException.class); assertEquals(test.getUnadjustedDates(), ImmutableList.of(AUG_17, SEP_17, SEP_30)); }
public void test_subSchedule_2monthIn3Month_shortInitial() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P2M, RollConventions.DAY_17, StubConvention.SHORT_INITIAL, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 2); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, JUL_17)); assertEquals(schedule.getPeriod(1), SchedulePeriod.of(JUL_17, SEP_17)); assertEquals(schedule.getFrequency(), P2M); assertEquals(schedule.getRollConvention(), RollConventions.DAY_17); }
public void test_size1_stub() { Schedule test = Schedule.builder() .periods(ImmutableList.of(P1_STUB)) .frequency(P1M) .rollConvention(DAY_17) .build(); assertEquals(test.size(), 1); assertEquals(test.isTerm(), false); assertEquals(test.isSinglePeriod(), true); assertEquals(test.getFrequency(), P1M); assertEquals(test.getRollConvention(), DAY_17); assertEquals(test.isEndOfMonthConvention(), false); assertEquals(test.getPeriods(), ImmutableList.of(P1_STUB)); assertEquals(test.getPeriod(0), P1_STUB); assertEquals(test.getStartDate(), P1_STUB.getStartDate()); assertEquals(test.getEndDate(), P1_STUB.getEndDate()); assertEquals(test.getUnadjustedStartDate(), P1_STUB.getUnadjustedStartDate()); assertEquals(test.getUnadjustedEndDate(), P1_STUB.getUnadjustedEndDate()); assertEquals(test.getFirstPeriod(), P1_STUB); assertEquals(test.getLastPeriod(), P1_STUB); assertEquals(test.getInitialStub(), Optional.of(P1_STUB)); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getRegularPeriods(), ImmutableList.of()); assertThrows(() -> test.getPeriod(1), IndexOutOfBoundsException.class); assertEquals(test.getUnadjustedDates(), ImmutableList.of(JUL_04, JUL_17)); }
@Override public ImmutableList<RateAccrualPeriod> createAccrualPeriods( Schedule accrualSchedule, Schedule paymentSchedule, ReferenceData refData) { // resolve data by schedule DoubleArray resolvedGearings = firstNonNull(gearing, ALWAYS_1).resolveValues(accrualSchedule); DoubleArray resolvedSpreads = firstNonNull(spread, ALWAYS_0).resolveValues(accrualSchedule); // resolve against reference data once DateAdjuster fixingDateAdjuster = fixingDateOffset.resolve(refData); Function<SchedulePeriod, Schedule> resetScheduleFn = getResetPeriods().map(rp -> rp.createSchedule(accrualSchedule.getRollConvention(), refData)).orElse(null); Function<LocalDate, IborIndexObservation> iborObservationFn = index.resolve(refData); // build accrual periods Optional<SchedulePeriod> scheduleInitialStub = accrualSchedule.getInitialStub(); Optional<SchedulePeriod> scheduleFinalStub = accrualSchedule.getFinalStub(); ImmutableList.Builder<RateAccrualPeriod> accrualPeriods = ImmutableList.builder(); for (int i = 0; i < accrualSchedule.size(); i++) { SchedulePeriod period = accrualSchedule.getPeriod(i); RateComputation rateComputation = createRateComputation( period, fixingDateAdjuster, resetScheduleFn, iborObservationFn, i, scheduleInitialStub, scheduleFinalStub, refData); double yearFraction = period.yearFraction(dayCount, accrualSchedule); accrualPeriods.add(new RateAccrualPeriod( period, yearFraction, rateComputation, resolvedGearings.get(i), resolvedSpreads.get(i), negativeRateMethod)); } return accrualPeriods.build(); }
public void test_size1_noStub() { Schedule test = Schedule.builder() .periods(ImmutableList.of(P2_NORMAL)) .frequency(P1M) .rollConvention(DAY_17) .build(); assertEquals(test.size(), 1); assertEquals(test.isTerm(), false); assertEquals(test.isSinglePeriod(), true); assertEquals(test.getFrequency(), P1M); assertEquals(test.getRollConvention(), DAY_17); assertEquals(test.isEndOfMonthConvention(), false); assertEquals(test.getPeriods(), ImmutableList.of(P2_NORMAL)); assertEquals(test.getPeriod(0), P2_NORMAL); assertEquals(test.getStartDate(), P2_NORMAL.getStartDate()); assertEquals(test.getEndDate(), P2_NORMAL.getEndDate()); assertEquals(test.getUnadjustedStartDate(), P2_NORMAL.getUnadjustedStartDate()); assertEquals(test.getUnadjustedEndDate(), P2_NORMAL.getUnadjustedEndDate()); assertEquals(test.getFirstPeriod(), P2_NORMAL); assertEquals(test.getLastPeriod(), P2_NORMAL); assertEquals(test.getInitialStub(), Optional.empty()); assertEquals(test.getFinalStub(), Optional.empty()); assertEquals(test.getRegularPeriods(), ImmutableList.of(P2_NORMAL)); assertThrows(() -> test.getPeriod(1), IndexOutOfBoundsException.class); assertEquals(test.getUnadjustedDates(), ImmutableList.of(JUL_17, AUG_17)); }
private List<SwapPaymentPeriod> createPaymentPeriods(Schedule resolvedPayments, ReferenceData refData) { // resolve amount schedule against payment schedule DoubleArray amounts = amount.resolveValues(resolvedPayments); // resolve against reference data once DateAdjuster paymentDateAdjuster = paymentSchedule.getPaymentDateOffset().resolve(refData); // build up payment periods using schedule ImmutableList.Builder<SwapPaymentPeriod> paymentPeriods = ImmutableList.builder(); for (int index = 0; index < resolvedPayments.size(); index++) { SchedulePeriod paymentPeriod = resolvedPayments.getPeriod(index); LocalDate baseDate = paymentSchedule.getPaymentRelativeTo().selectBaseDate(paymentPeriod); LocalDate paymentDate = paymentDateAdjuster.adjust(baseDate); double amount = payReceive.normalize(amounts.get(index)); Payment payment = Payment.of(CurrencyAmount.of(currency, amount), paymentDate); paymentPeriods.add(KnownAmountSwapPaymentPeriod.of(payment, paymentPeriod)); } return paymentPeriods.build(); }
public void test_subSchedule_3monthIn3Month() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P3M, RollConventions.DAY_17, StubConvention.NONE, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 1); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, SEP_17)); }
private RateComputation createRateComputationWithResetPeriods( Schedule resetSchedule, DateAdjuster fixingDateAdjuster, Function<LocalDate, IborIndexObservation> iborObservationFn, int scheduleIndex, Double overrideFirstRate, ReferenceData refData) { List<IborAveragedFixing> fixings = new ArrayList<>(); for (int i = 0; i < resetSchedule.size(); i++) { SchedulePeriod resetPeriod = resetSchedule.getPeriod(i); LocalDate fixingDate = fixingDateAdjuster.adjust(fixingRelativeTo.selectBaseDate(resetPeriod)); if (scheduleIndex == 0 && i == 0 && firstFixingDateOffset != null) { fixingDate = firstFixingDateOffset.resolve(refData).adjust(fixingRelativeTo.selectBaseDate(resetPeriod)); } fixings.add(IborAveragedFixing.builder() .observation(iborObservationFn.apply(fixingDate)) .fixedRate(overrideFirstRate != null && i == 0 ? overrideFirstRate : null) .weight(resetPeriods.getResetMethod() == UNWEIGHTED ? 1 : resetPeriod.lengthInDays()) .build()); } return IborAveragedRateComputation.of(fixings); }
public void test_override_fallbackWhenStartDateMismatch() { PeriodicSchedule defn = PeriodicSchedule.builder() .startDate(JUL_04) .endDate(SEP_17) .overrideStartDate(AdjustableDate.of(JUN_17, BusinessDayAdjustment.of(FOLLOWING, SAT_SUN))) .frequency(P1M) .businessDayAdjustment(BDA) .rollConvention(DAY_17) .build(); Schedule test = defn.createSchedule(REF_DATA); assertEquals(test.size(), 3); SchedulePeriod period0 = test.getPeriod(0); assertEquals(period0.getUnadjustedStartDate(), JUN_17); assertEquals(period0.getUnadjustedEndDate(), JUL_17); assertEquals(period0.getStartDate(), JUN_17); assertEquals(period0.getEndDate(), JUL_17); SchedulePeriod period1 = test.getPeriod(1); assertEquals(period1.getUnadjustedStartDate(), JUL_17); assertEquals(period1.getUnadjustedEndDate(), AUG_17); assertEquals(period1.getStartDate(), JUL_17); assertEquals(period1.getEndDate(), AUG_18); SchedulePeriod period2 = test.getPeriod(2); assertEquals(period2.getUnadjustedStartDate(), AUG_17); assertEquals(period2.getUnadjustedEndDate(), SEP_17); assertEquals(period2.getStartDate(), AUG_18); assertEquals(period2.getEndDate(), SEP_17); }
public void test_override_fallbackWhenStartDateMismatchEndStub() { PeriodicSchedule defn = PeriodicSchedule.builder() .startDate(JUL_04) .endDate(SEP_04) .overrideStartDate(AdjustableDate.of(JUN_17, BusinessDayAdjustment.of(FOLLOWING, SAT_SUN))) .frequency(P1M) .businessDayAdjustment(BDA) .rollConvention(DAY_17) .lastRegularEndDate(AUG_17) .build(); Schedule test = defn.createSchedule(REF_DATA); assertEquals(test.size(), 3); SchedulePeriod period0 = test.getPeriod(0); assertEquals(period0.getUnadjustedStartDate(), JUN_17); assertEquals(period0.getUnadjustedEndDate(), JUL_17); assertEquals(period0.getStartDate(), JUN_17); assertEquals(period0.getEndDate(), JUL_17); SchedulePeriod period1 = test.getPeriod(1); assertEquals(period1.getUnadjustedStartDate(), JUL_17); assertEquals(period1.getUnadjustedEndDate(), AUG_17); assertEquals(period1.getStartDate(), JUL_17); assertEquals(period1.getEndDate(), AUG_18); SchedulePeriod period2 = test.getPeriod(2); assertEquals(period2.getUnadjustedStartDate(), AUG_17); assertEquals(period2.getUnadjustedEndDate(), SEP_04); assertEquals(period2.getStartDate(), AUG_18); assertEquals(period2.getEndDate(), SEP_04); }
public void test_resolve() { FixedCouponBond base = sut(); ResolvedFixedCouponBond resolved = base.resolve(REF_DATA); assertEquals(resolved.getLegalEntityId(), LEGAL_ENTITY); assertEquals(resolved.getSettlementDateOffset(), DATE_OFFSET); assertEquals(resolved.getYieldConvention(), YIELD_CONVENTION); ImmutableList<FixedCouponBondPaymentPeriod> periodicPayments = resolved.getPeriodicPayments(); int expNum = 20; assertEquals(periodicPayments.size(), expNum); LocalDate unadjustedEnd = END_DATE; Schedule unadjusted = PERIOD_SCHEDULE.createSchedule(REF_DATA).toUnadjusted(); for (int i = 0; i < expNum; ++i) { FixedCouponBondPaymentPeriod payment = periodicPayments.get(expNum - 1 - i); assertEquals(payment.getCurrency(), EUR); assertEquals(payment.getNotional(), NOTIONAL); assertEquals(payment.getFixedRate(), FIXED_RATE); assertEquals(payment.getUnadjustedEndDate(), unadjustedEnd); assertEquals(payment.getEndDate(), BUSINESS_ADJUST.adjust(unadjustedEnd, REF_DATA)); assertEquals(payment.getPaymentDate(), payment.getEndDate()); LocalDate unadjustedStart = unadjustedEnd.minusMonths(6); assertEquals(payment.getUnadjustedStartDate(), unadjustedStart); assertEquals(payment.getStartDate(), BUSINESS_ADJUST.adjust(unadjustedStart, REF_DATA)); assertEquals(payment.getYearFraction(), unadjusted.getPeriod(expNum - 1 - i).yearFraction(DAY_COUNT, unadjusted)); assertEquals(payment.getDetachmentDate(), EX_COUPON.adjust(payment.getPaymentDate(), REF_DATA)); unadjustedEnd = unadjustedStart; } Payment expectedPayment = Payment.of(CurrencyAmount.of(EUR, NOTIONAL), BUSINESS_ADJUST.adjust(END_DATE, REF_DATA)); assertEquals(resolved.getNominalPayment(), expectedPayment); }
SchedulePeriod expectedPeriod = SchedulePeriod.of(expectedStart, expectedEnd); SchedulePeriod actualPeriod = schedule.getPeriod(i); assertEquals(expectedPeriod, actualPeriod);