public void adjust_notNegative() { assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(1d), 1d, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(0d), 0d, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(-0d), 0d, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(-1d), 0d, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(Double.MAX_VALUE), Double.MAX_VALUE, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(Double.MIN_VALUE), Double.MIN_VALUE, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(Double.POSITIVE_INFINITY), Double.POSITIVE_INFINITY, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(Double.NEGATIVE_INFINITY), 0d, 0d); assertEquals(NegativeRateMethod.NOT_NEGATIVE.adjust(Double.NaN), Double.NaN); // force to Double for comparison }
public void adjust_allowNegative() { assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(1d), 1d, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(0d), 0d, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(-0d), -0d, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(-1d), -1d, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(Double.MAX_VALUE), Double.MAX_VALUE, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(Double.MIN_VALUE), Double.MIN_VALUE, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(Double.POSITIVE_INFINITY), Double.POSITIVE_INFINITY, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(Double.NEGATIVE_INFINITY), Double.NEGATIVE_INFINITY, 0d); assertEquals(NegativeRateMethod.ALLOW_NEGATIVE.adjust(Double.NaN), Double.NaN); // force to Double for comparison }
private double unitNotionalAccrualRaw(RateAccrualPeriod accrualPeriod, double rawRate, double spread) { double treatedRate = rawRate * accrualPeriod.getGearing() + spread; return accrualPeriod.getNegativeRateMethod().adjust(treatedRate * accrualPeriod.getYearFraction()); }
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); }