// ------------------------------------------------------------------------- private double forecastValueFwdSensitivity(Fra fra, double forwardRate, double eps) { RateObservationFn<RateObservation> obsFuncNew = mock(RateObservationFn.class); RatesProvider provNew = mock(RatesProvider.class); when(provNew.getValuationDate()).thenReturn(VAL_DATE); ExpandedFra fraExp = fra.expand(); when(obsFuncNew.rate(fraExp.getFloatingRate(), fra.getStartDate(), fra.getEndDate(), provNew)) .thenReturn(forwardRate + eps); CurrencyAmount upValue = new DiscountingFraProductPricer(obsFuncNew).forecastValue(fraExp, provNew); when(obsFuncNew.rate(fraExp.getFloatingRate(), fra.getStartDate(), fra.getEndDate(), provNew)) .thenReturn(forwardRate - eps); CurrencyAmount downValue = new DiscountingFraProductPricer(obsFuncNew).forecastValue(fraExp, provNew); return upValue.minus(downValue).multipliedBy(0.5 / eps).getAmount(); }
/** Test present value sensitivity for ISDA */ public void test_presentValueSensitivity_ISDA() { RateObservationFn<RateObservation> mockObs = mock(RateObservationFn.class); DiscountFactors mockDf = mock(DiscountFactors.class); SimpleRatesProvider simpleProv = new SimpleRatesProvider(VAL_DATE, mockDf); ExpandedFra fraExp = FRA.expand(); double forwardRate = 0.05; double discountRate = 0.015; double paymentTime = 0.3; double discountFactor = Math.exp(-discountRate * paymentTime); LocalDate fixingDate = FRA.getStartDate(); PointSensitivityBuilder sens = IborRateSensitivity.of(FRA.getIndex(), fixingDate, 1d); when(mockDf.discountFactor(fraExp.getPaymentDate())).thenReturn(discountFactor); when(mockDf.zeroRatePointSensitivity(fraExp.getPaymentDate())) .thenReturn( ZeroRateSensitivity.of( fraExp.getCurrency(), fraExp.getPaymentDate(), -discountFactor * paymentTime)); when(mockObs.rateSensitivity( fraExp.getFloatingRate(), fraExp.getStartDate(), fraExp.getEndDate(), simpleProv)) .thenReturn(sens); when(mockObs.rate(fraExp.getFloatingRate(), FRA.getStartDate(), FRA.getEndDate(), simpleProv)) .thenReturn(forwardRate); DiscountingFraProductPricer test = new DiscountingFraProductPricer(mockObs); PointSensitivities sensitivity = test.presentValueSensitivity(fraExp, simpleProv); double eps = 1.e-7; double fdDscSense = dscSensitivity(FRA, forwardRate, discountFactor, paymentTime, eps); double fdSense = presentValueFwdSensitivity(FRA, forwardRate, discountFactor, eps); ImmutableList<PointSensitivity> sensitivities = sensitivity.getSensitivities(); assertEquals(sensitivities.size(), 2); IborRateSensitivity sensitivity0 = (IborRateSensitivity) sensitivities.get(0); assertEquals(sensitivity0.getIndex(), FRA.getIndex()); assertEquals(sensitivity0.getFixingDate(), fixingDate); assertEquals(sensitivity0.getSensitivity(), fdSense, FRA.getNotional() * eps); ZeroRateSensitivity sensitivity1 = (ZeroRateSensitivity) sensitivities.get(1); assertEquals(sensitivity1.getCurrency(), FRA.getCurrency()); assertEquals(sensitivity1.getDate(), fraExp.getPaymentDate()); assertEquals(sensitivity1.getSensitivity(), fdDscSense, FRA.getNotional() * eps); // test via FraTrade DiscountingFraTradePricer testTrade = new DiscountingFraTradePricer(test); assertEquals( testTrade.presentValueSensitivity(FRA_TRADE, simpleProv), test.presentValueSensitivity(fraExp, simpleProv)); }
private double dscSensitivity( Fra fra, double forwardRate, double discountFactor, double paymentTime, double eps) { RatesProvider provNew = mock(RatesProvider.class); when(provNew.getValuationDate()).thenReturn(VAL_DATE); RateObservationFn<RateObservation> obsFuncNew = mock(RateObservationFn.class); ExpandedFra fraExp = fra.expand(); when(obsFuncNew.rate(fraExp.getFloatingRate(), fra.getStartDate(), fra.getEndDate(), provNew)) .thenReturn(forwardRate); when(provNew.discountFactor(fra.getCurrency(), fraExp.getPaymentDate())) .thenReturn(discountFactor * Math.exp(-eps * paymentTime)); CurrencyAmount upDscValue = new DiscountingFraProductPricer(obsFuncNew).presentValue(fraExp, provNew); when(provNew.discountFactor(fra.getCurrency(), fraExp.getPaymentDate())) .thenReturn(discountFactor * Math.exp(eps * paymentTime)); CurrencyAmount downDscValue = new DiscountingFraProductPricer(obsFuncNew).presentValue(fraExp, provNew); return upDscValue.minus(downDscValue).multipliedBy(0.5 / eps).getAmount(); }