@Override public RatePaymentPeriod adjustPaymentDate(TemporalAdjuster adjuster) { LocalDate adjusted = paymentDate.with(adjuster); return adjusted.equals(paymentDate) ? this : toBuilder().paymentDate(adjusted).build(); }
public void test_forecastValue_compoundSpreadExclusive() { SimpleRatesProvider prov = createProvider(VAL_DATE); RatePaymentPeriod period = PAYMENT_PERIOD_FULL_GS.toBuilder() .compoundingMethod(CompoundingMethod.SPREAD_EXCLUSIVE).build(); double invFactor1 = 1.0d + ACCRUAL_FACTOR_1 * (RATE_1 * GEARING); double invFactor2 = 1.0d + ACCRUAL_FACTOR_2 * (RATE_2 * GEARING); double invFactor3 = 1.0d + ACCRUAL_FACTOR_3 * (RATE_3 * GEARING); double fvExpected = NOTIONAL_100 * (invFactor1 * invFactor2 * invFactor3 - 1.0d + (ACCRUAL_FACTOR_1 + ACCRUAL_FACTOR_2 + ACCRUAL_FACTOR_3) * SPREAD); double fvComputed = DiscountingRatePaymentPeriodPricer.DEFAULT.forecastValue(period, prov); assertEquals(fvComputed, fvExpected, TOLERANCE_PV); }
public void test_forecastValue_compoundSpreadExclusive_fx() { SimpleRatesProvider prov = createProvider(VAL_DATE); RatePaymentPeriod period = PAYMENT_PERIOD_FULL_GS_FX_USD.toBuilder() .compoundingMethod(CompoundingMethod.SPREAD_EXCLUSIVE).build(); double invFactor1 = 1.0d + ACCRUAL_FACTOR_1 * (RATE_1 * GEARING); double invFactor2 = 1.0d + ACCRUAL_FACTOR_2 * (RATE_2 * GEARING); double invFactor3 = 1.0d + ACCRUAL_FACTOR_3 * (RATE_3 * GEARING); double fvExpected = NOTIONAL_100 * RATE_FX * (invFactor1 * invFactor2 * invFactor3 - 1.0d + (ACCRUAL_FACTOR_1 + ACCRUAL_FACTOR_2 + ACCRUAL_FACTOR_3) * SPREAD); double fvComputed = DiscountingRatePaymentPeriodPricer.DEFAULT.forecastValue(period, prov); assertEquals(fvComputed, fvExpected, TOLERANCE_PV); }
public void test_forecastValue_compoundStraight() { SimpleRatesProvider prov = createProvider(VAL_DATE); RatePaymentPeriod period = PAYMENT_PERIOD_FULL_GS.toBuilder() .compoundingMethod(CompoundingMethod.STRAIGHT).build(); double invFactor1 = 1.0d + ACCRUAL_FACTOR_1 * (RATE_1 * GEARING + SPREAD); double invFactor2 = 1.0d + ACCRUAL_FACTOR_2 * (RATE_2 * GEARING + SPREAD); double invFactor3 = 1.0d + ACCRUAL_FACTOR_3 * (RATE_3 * GEARING + SPREAD); double fvExpected = NOTIONAL_100 * (invFactor1 * invFactor2 * invFactor3 - 1.0d); double fvComputed = DiscountingRatePaymentPeriodPricer.DEFAULT.forecastValue(period, prov); assertEquals(fvComputed, fvExpected, TOLERANCE_PV); }
public void test_forecastValue_compoundFlat_notional() { SimpleRatesProvider prov = createProvider(VAL_DATE); RatePaymentPeriod periodNot = PAYMENT_PERIOD_FULL_GS.toBuilder() .compoundingMethod(CompoundingMethod.FLAT).build(); RatePaymentPeriod period1 = PAYMENT_PERIOD_FULL_GS.toBuilder() .compoundingMethod(CompoundingMethod.FLAT).notional(1.0d).build(); double fvComputedNot = DiscountingRatePaymentPeriodPricer.DEFAULT.forecastValue(periodNot, prov); double fvComputed1 = DiscountingRatePaymentPeriodPricer.DEFAULT.forecastValue(period1, prov); assertEquals(fvComputedNot, fvComputed1 * NOTIONAL_100, TOLERANCE_PV); }
public void test_forecastValue_compoundFlat() { SimpleRatesProvider prov = createProvider(VAL_DATE); RatePaymentPeriod period = PAYMENT_PERIOD_FULL_GS.toBuilder() .compoundingMethod(CompoundingMethod.FLAT).build(); double cpa1 = NOTIONAL_100 * ACCRUAL_FACTOR_1 * (RATE_1 * GEARING + SPREAD); double cpa2 = NOTIONAL_100 * ACCRUAL_FACTOR_2 * (RATE_2 * GEARING + SPREAD) + cpa1 * ACCRUAL_FACTOR_2 * (RATE_2 * GEARING); double cpa3 = NOTIONAL_100 * ACCRUAL_FACTOR_3 * (RATE_3 * GEARING + SPREAD) + (cpa1 + cpa2) * ACCRUAL_FACTOR_3 * (RATE_3 * GEARING); double fvExpected = cpa1 + cpa2 + cpa3; double fvComputed = DiscountingRatePaymentPeriodPricer.DEFAULT.forecastValue(period, prov); assertEquals(fvComputed, fvExpected, TOLERANCE_PV); }
@Override public double accruedInterest(RatePaymentPeriod period, RatesProvider provider) { LocalDate valDate = provider.getValuationDate(); if (valDate.compareTo(period.getStartDate()) <= 0 || valDate.compareTo(period.getEndDate()) > 0) { return 0d; } ImmutableList.Builder<RateAccrualPeriod> truncated = ImmutableList.builder(); for (RateAccrualPeriod rap : period.getAccrualPeriods()) { if (valDate.compareTo(rap.getEndDate()) > 0) { truncated.add(rap); } else { truncated.add(rap.toBuilder() .endDate(provider.getValuationDate()) .unadjustedEndDate(provider.getValuationDate()) .yearFraction(period.getDayCount().yearFraction(rap.getStartDate(), provider.getValuationDate())) .build()); break; } } RatePaymentPeriod adjustedPaymentPeriod = period.toBuilder().accrualPeriods(truncated.build()).build(); return forecastValue(adjustedPaymentPeriod, provider); }
public void test_pvbp_compounding_flat_fixed() { DiscountingSwapLegPricer test = DiscountingSwapLegPricer.DEFAULT; SwapPaymentPeriod p = FIXED_CMP_FLAT_SWAP_LEG_PAY_GBP.getPaymentPeriods().get(0); RatesProvider mockProv = mock(RatesProvider.class); when(mockProv.getValuationDate()).thenReturn(RatesProviderDataSets.VAL_DATE_2014_01_22); double df1 = 0.99d; when(mockProv.discountFactor(GBP, p.getPaymentDate())) .thenReturn(df1); double spread = 1.0E-6; RateAccrualPeriod ap1 = FIXED_RATE_ACCRUAL_PERIOD.toBuilder().spread(spread).build(); RateAccrualPeriod ap2 = FIXED_RATE_ACCRUAL_PERIOD_2.toBuilder().spread(spread).build(); RatePaymentPeriod pp = FIXED_RATE_PAYMENT_PERIOD_CMP_FLAT_REC_GBP.toBuilder().accrualPeriods(ap1, ap2).build(); ResolvedSwapLeg sl = FIXED_CMP_FLAT_SWAP_LEG_PAY_GBP.toBuilder().paymentPeriods(pp).build(); CurrencyAmount pv0 = PRICER_LEG.presentValue(FIXED_CMP_FLAT_SWAP_LEG_PAY_GBP, mockProv); CurrencyAmount pvP = PRICER_LEG.presentValue(sl, mockProv); double pvbpExpected = (pvP.getAmount() - pv0.getAmount()) / spread; double pvbpComputed = test.pvbp(FIXED_CMP_FLAT_SWAP_LEG_PAY_GBP, mockProv); assertEquals(pvbpComputed, pvbpExpected, TOLERANCE_PVBP_FD); }