private double compoundingNone(RatePaymentPeriod paymentPeriod, double notional, RatesProvider provider) { return paymentPeriod.getAccrualPeriods().stream() .mapToDouble(accrualPeriod -> unitNotionalAccrual(accrualPeriod, accrualPeriod.getSpread(), provider) * notional) .sum(); }
private double compoundedStraight(RatePaymentPeriod paymentPeriod, double notional, RatesProvider provider) { double notionalAccrued = notional; for (RateAccrualPeriod accrualPeriod : paymentPeriod.getAccrualPeriods()) { double investFactor = 1 + unitNotionalAccrual(accrualPeriod, accrualPeriod.getSpread(), provider); notionalAccrued *= investFactor; } return (notionalAccrued - notional); }
private double accrualWithNotional(RatePaymentPeriod period, double notional, RatesProvider provider) { // handle simple case and more complex compounding for whole payment period if (period.getAccrualPeriods().size() == 1) { RateAccrualPeriod accrualPeriod = period.getAccrualPeriods().get(0); return unitNotionalAccrual(accrualPeriod, accrualPeriod.getSpread(), provider) * notional; } return accrueCompounded(period, notional, provider); }
private double compoundedSpreadExclusive(RatePaymentPeriod paymentPeriod, double notional, RatesProvider provider) { double notionalAccrued = notional; double spreadAccrued = 0; for (RateAccrualPeriod accrualPeriod : paymentPeriod.getAccrualPeriods()) { double investFactor = 1 + unitNotionalAccrual(accrualPeriod, 0, provider); notionalAccrued *= investFactor; spreadAccrued += notional * accrualPeriod.getSpread() * accrualPeriod.getYearFraction(); } return (notionalAccrued - notional + spreadAccrued); }
private double compoundedFlat(RatePaymentPeriod paymentPeriod, double notional, RatesProvider provider) { double cpaAccumulated = 0d; for (RateAccrualPeriod accrualPeriod : paymentPeriod.getAccrualPeriods()) { double rate = rawRate(accrualPeriod, provider); cpaAccumulated += cpaAccumulated * unitNotionalAccrualRaw(accrualPeriod, rate, 0) + unitNotionalAccrualRaw(accrualPeriod, rate, accrualPeriod.getSpread()); } return cpaAccumulated * notional; }
if (accrualPeriods.get(i).getSpread() != 0) { return Triple.of(false, 0, 0.0d); // Should have no spread
@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case -2129778896: // startDate return ((RateAccrualPeriod) bean).getStartDate(); case -1607727319: // endDate return ((RateAccrualPeriod) bean).getEndDate(); case 1457691881: // unadjustedStartDate return ((RateAccrualPeriod) bean).getUnadjustedStartDate(); case 31758114: // unadjustedEndDate return ((RateAccrualPeriod) bean).getUnadjustedEndDate(); case -1731780257: // yearFraction return ((RateAccrualPeriod) bean).getYearFraction(); case 625350855: // rateComputation return ((RateAccrualPeriod) bean).getRateComputation(); case -91774989: // gearing return ((RateAccrualPeriod) bean).getGearing(); case -895684237: // spread return ((RateAccrualPeriod) bean).getSpread(); case 1969081334: // negativeRateMethod return ((RateAccrualPeriod) bean).getNegativeRateMethod(); } return super.propertyGet(bean, propertyName, quiet); }
public void test_builder_schedulePeriod() { SchedulePeriod schedulePeriod = SchedulePeriod.of(DATE_2014_03_31, DATE_2014_07_01, DATE_2014_03_30, DATE_2014_06_30); RateAccrualPeriod test = RateAccrualPeriod.builder(schedulePeriod) .yearFraction(0.25d) .rateComputation(GBP_LIBOR_3M_2014_03_28) .build(); assertEquals(test.getStartDate(), DATE_2014_03_31); assertEquals(test.getEndDate(), DATE_2014_07_01); assertEquals(test.getUnadjustedStartDate(), DATE_2014_03_30); assertEquals(test.getUnadjustedEndDate(), DATE_2014_06_30); assertEquals(test.getYearFraction(), 0.25d, 0d); assertEquals(test.getRateComputation(), GBP_LIBOR_3M_2014_03_28); assertEquals(test.getGearing(), 1d, 0d); assertEquals(test.getSpread(), 0d, 0d); assertEquals(test.getNegativeRateMethod(), ALLOW_NEGATIVE); }
/** * Restricted copy constructor. * @param beanToCopy the bean to copy from, not null */ private Builder(RateAccrualPeriod beanToCopy) { this.startDate = beanToCopy.getStartDate(); this.endDate = beanToCopy.getEndDate(); this.unadjustedStartDate = beanToCopy.getUnadjustedStartDate(); this.unadjustedEndDate = beanToCopy.getUnadjustedEndDate(); this.yearFraction = beanToCopy.getYearFraction(); this.rateComputation = beanToCopy.getRateComputation(); this.gearing = beanToCopy.getGearing(); this.spread = beanToCopy.getSpread(); this.negativeRateMethod = beanToCopy.getNegativeRateMethod(); }
private PointSensitivityBuilder compoundedStraightSensitivity( RatePaymentPeriod paymentPeriod, RatesProvider provider) { double notionalAccrued = 1d; Currency ccy = paymentPeriod.getCurrency(); PointSensitivityBuilder sensi = PointSensitivityBuilder.none(); for (RateAccrualPeriod accrualPeriod : paymentPeriod.getAccrualPeriods()) { double investFactor = 1d + unitNotionalAccrual(accrualPeriod, accrualPeriod.getSpread(), provider); notionalAccrued *= investFactor; PointSensitivityBuilder investFactorSensi = unitNotionalSensitivityAccrual(accrualPeriod, ccy, provider).multipliedBy(1d / investFactor); sensi = sensi.combinedWith(investFactorSensi); } return sensi.multipliedBy(notionalAccrued); }
public void test_builder_defaultDates() { RateAccrualPeriod test = RateAccrualPeriod.builder() .startDate(DATE_2014_03_31) .endDate(DATE_2014_07_01) .yearFraction(0.25d) .rateComputation(GBP_LIBOR_3M_2014_03_28) .build(); assertEquals(test.getStartDate(), DATE_2014_03_31); assertEquals(test.getEndDate(), DATE_2014_07_01); assertEquals(test.getUnadjustedStartDate(), DATE_2014_03_31); assertEquals(test.getUnadjustedEndDate(), DATE_2014_07_01); assertEquals(test.getYearFraction(), 0.25d, 0d); assertEquals(test.getRateComputation(), GBP_LIBOR_3M_2014_03_28); assertEquals(test.getGearing(), 1d, 0d); assertEquals(test.getSpread(), 0d, 0d); assertEquals(test.getNegativeRateMethod(), ALLOW_NEGATIVE); }
assertEquals(explainAccrual.get(ExplainKey.ACCRUAL_DAYS).get(), (Integer) daysBetween); assertEquals(explainAccrual.get(ExplainKey.GEARING).get(), ap.getGearing(), TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.SPREAD).get(), ap.getSpread(), TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.FIXED_RATE).get(), RATE_1, TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.PAY_OFF_RATE).get(), RATE_1, TOLERANCE_PV);
public void test_builder() { RateAccrualPeriod test = RateAccrualPeriod.builder() .startDate(DATE_2014_03_31) .endDate(DATE_2014_07_01) .unadjustedStartDate(DATE_2014_03_30) .unadjustedEndDate(DATE_2014_06_30) .yearFraction(0.25d) .rateComputation(GBP_LIBOR_3M_2014_03_28) .build(); assertEquals(test.getStartDate(), DATE_2014_03_31); assertEquals(test.getEndDate(), DATE_2014_07_01); assertEquals(test.getUnadjustedStartDate(), DATE_2014_03_30); assertEquals(test.getUnadjustedEndDate(), DATE_2014_06_30); assertEquals(test.getYearFraction(), 0.25d, 0d); assertEquals(test.getRateComputation(), GBP_LIBOR_3M_2014_03_28); assertEquals(test.getGearing(), 1d, 0d); assertEquals(test.getSpread(), 0d, 0d); assertEquals(test.getNegativeRateMethod(), ALLOW_NEGATIVE); }
assertEquals(explainAccrual.get(ExplainKey.ACCRUAL_DAYS).get(), (Integer) daysBetween); assertEquals(explainAccrual.get(ExplainKey.GEARING).get(), ap.getGearing(), TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.SPREAD).get(), ap.getSpread(), TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.FIXED_RATE).get(), RATE_1, TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.PAY_OFF_RATE).get(), payOffRate, TOLERANCE_PV);
assertEquals(explainAccrual.get(ExplainKey.ACCRUAL_DAYS).get(), (Integer) daysBetween); assertEquals(explainAccrual.get(ExplainKey.GEARING).get(), ap.getGearing(), TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.SPREAD).get(), ap.getSpread(), TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.FIXED_RATE).get(), RATE_1, TOLERANCE_PV); assertEquals(explainAccrual.get(ExplainKey.PAY_OFF_RATE).get(), RATE_1, TOLERANCE_PV);
private void explainPresentValue( RateAccrualPeriod accrualPeriod, DayCount dayCount, Currency currency, double notional, RatesProvider provider, ExplainMapBuilder builder) { double rawRate = rateComputationFn.explainRate( accrualPeriod.getRateComputation(), accrualPeriod.getStartDate(), accrualPeriod.getEndDate(), provider, builder); double payOffRate = rawRate * accrualPeriod.getGearing() + accrualPeriod.getSpread(); double ua = unitNotionalAccrual(accrualPeriod, accrualPeriod.getSpread(), provider); // Note that the forecast value is not published since this is potentially misleading when // compounding is being applied, and when it isn't then it's the same as the forecast // value of the payment period. builder.put(ExplainKey.ENTRY_TYPE, "AccrualPeriod"); builder.put(ExplainKey.START_DATE, accrualPeriod.getStartDate()); builder.put(ExplainKey.UNADJUSTED_START_DATE, accrualPeriod.getUnadjustedStartDate()); builder.put(ExplainKey.END_DATE, accrualPeriod.getEndDate()); builder.put(ExplainKey.UNADJUSTED_END_DATE, accrualPeriod.getUnadjustedEndDate()); builder.put(ExplainKey.ACCRUAL_YEAR_FRACTION, accrualPeriod.getYearFraction()); builder.put(ExplainKey.ACCRUAL_DAYS, dayCount.days(accrualPeriod.getStartDate(), accrualPeriod.getEndDate())); builder.put(ExplainKey.DAYS, (int) DAYS.between(accrualPeriod.getStartDate(), accrualPeriod.getEndDate())); builder.put(ExplainKey.GEARING, accrualPeriod.getGearing()); builder.put(ExplainKey.SPREAD, accrualPeriod.getSpread()); builder.put(ExplainKey.PAY_OFF_RATE, accrualPeriod.getNegativeRateMethod().adjust(payOffRate)); builder.put(ExplainKey.UNIT_AMOUNT, ua); }
private PointSensitivityBuilder compoundedFlatSensitivity( RatePaymentPeriod paymentPeriod, RatesProvider provider) { double cpaAccumulated = 0d; Currency ccy = paymentPeriod.getCurrency(); PointSensitivityBuilder sensiAccumulated = PointSensitivityBuilder.none(); for (RateAccrualPeriod accrualPeriod : paymentPeriod.getAccrualPeriods()) { double rate = rawRate(accrualPeriod, provider); double accrualZeroSpread = unitNotionalAccrualRaw(accrualPeriod, rate, 0); PointSensitivityBuilder sensiCp = sensiAccumulated.cloned(); sensiCp = sensiCp.multipliedBy(accrualZeroSpread); PointSensitivityBuilder sensi2 = unitNotionalSensitivityAccrual(accrualPeriod, ccy, provider).multipliedBy(1d + cpaAccumulated); cpaAccumulated += cpaAccumulated * accrualZeroSpread + unitNotionalAccrualRaw(accrualPeriod, rate, accrualPeriod.getSpread()); sensiCp = sensiCp.combinedWith(sensi2); sensiAccumulated = sensiAccumulated.combinedWith(sensiCp).normalize(); } return sensiAccumulated; }