/** Test par spread for AFMA FRA Discounting method. */ public void test_parSpread_AFMA() { ExpandedFra fraExp = FRA_AFMA.expand(); SimpleRatesProvider prov = createProvider(fraExp); DiscountingFraProductPricer test = DiscountingFraProductPricer.DEFAULT; double parSpread = test.parSpread(fraExp, prov); Fra fra = createNewFra(FRA_AFMA, FRA_AFMA.getFixedRate() + parSpread); CurrencyAmount pv = test.presentValue(fra, prov); assertEquals(pv.getAmount(), 0.0, TOLERANCE); }
/** Test forecast value for AFMA FRA Discounting method. */ public void test_forecastValue_AFMA() { ExpandedFra fraExp = FRA_AFMA.expand(); SimpleRatesProvider prov = createProvider(fraExp); double fixedRate = FRA_AFMA.getFixedRate(); double yearFraction = fraExp.getYearFraction(); double notional = fraExp.getNotional(); double expected = -notional * (1.0 / (1.0 + yearFraction * FORWARD_RATE) - 1.0 / (1.0 + yearFraction * fixedRate)); DiscountingFraProductPricer test = DiscountingFraProductPricer.DEFAULT; CurrencyAmount computed = test.forecastValue(fraExp, prov); assertEquals(computed.getAmount(), expected, TOLERANCE); }
/** Test forecast value sensitivity for AFMA FRA discounting method. */ public void test_forecastValueSensitivity_AFMA() { ExpandedFra fraExp = FRA_AFMA.expand(); SimpleRatesProvider prov = createProvider(fraExp); DiscountingFraProductPricer test = DiscountingFraProductPricer.DEFAULT; PointSensitivities sensitivity = test.forecastValueSensitivity(fraExp, prov); double eps = 1.e-7; double fdSense = forecastValueFwdSensitivity(FRA_AFMA, FORWARD_RATE, eps); ImmutableList<PointSensitivity> sensitivities = sensitivity.getSensitivities(); assertEquals(sensitivities.size(), 1); IborRateSensitivity sensitivity0 = (IborRateSensitivity) sensitivities.get(0); assertEquals(sensitivity0.getIndex(), FRA_AFMA.getIndex()); assertEquals(sensitivity0.getFixingDate(), FRA_AFMA.getStartDate()); assertEquals(sensitivity0.getSensitivity(), fdSense, FRA_AFMA.getNotional() * eps); }
/** Test present value for ISDA FRA Discounting method. */ public void test_presentValue_AFMA() { ExpandedFra fraExp = FRA_AFMA.expand(); SimpleRatesProvider prov = createProvider(fraExp); DiscountingFraProductPricer test = DiscountingFraProductPricer.DEFAULT; CurrencyAmount pvComputed = test.presentValue(fraExp, prov); CurrencyAmount pvExpected = test.forecastValue(fraExp, prov).multipliedBy(DISCOUNT_FACTOR); assertEquals(pvComputed.getAmount(), pvExpected.getAmount(), TOLERANCE); }
/** Test par spread sensitivity for AFMA FRA Discounting method. */ public void test_parSpreadSensitivity_AFMA() { PointSensitivities sensi = DEFAULT_PRICER.parSpreadSensitivity(FRA_AFMA, IMM_PROV); CurveCurrencyParameterSensitivities sensiComputed = IMM_PROV.curveParameterSensitivity(sensi); CurveCurrencyParameterSensitivities sensiExpected = CAL_FD.sensitivity( IMM_PROV, (p) -> CurrencyAmount.of(FRA_AFMA.getCurrency(), DEFAULT_PRICER.parSpread(FRA_AFMA, (p)))); assertTrue(sensiComputed.equalWithTolerance(sensiExpected, EPS_FD)); }
/** Test present value sensitivity for AFMA FRA discounting method. */ public void test_presentValueSensitivity_AFMA() { RateObservationFn<RateObservation> mockObs = mock(RateObservationFn.class); DiscountFactors mockDf = mock(DiscountFactors.class); SimpleRatesProvider simpleProv = new SimpleRatesProvider(VAL_DATE, mockDf); ExpandedFra fraExp = FRA_AFMA.expand(); double forwardRate = 0.05; double discountRate = 0.025; double paymentTime = 0.3; double discountFactor = Math.exp(-discountRate * paymentTime); LocalDate fixingDate = FRA_AFMA.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_AFMA.getStartDate(), FRA_AFMA.getEndDate(), simpleProv)) .thenReturn(forwardRate); DiscountingFraProductPricer test = new DiscountingFraProductPricer(mockObs); PointSensitivities sensitivity = test.presentValueSensitivity(fraExp, simpleProv); double eps = 1.e-7; double fdDscSense = dscSensitivity(FRA_AFMA, forwardRate, discountFactor, paymentTime, eps); double fdSense = presentValueFwdSensitivity(FRA_AFMA, forwardRate, discountFactor, eps); ImmutableList<PointSensitivity> sensitivities = sensitivity.getSensitivities(); assertEquals(sensitivities.size(), 2); IborRateSensitivity sensitivity0 = (IborRateSensitivity) sensitivities.get(0); assertEquals(sensitivity0.getIndex(), FRA_AFMA.getIndex()); assertEquals(sensitivity0.getFixingDate(), fixingDate); assertEquals(sensitivity0.getSensitivity(), fdSense, FRA_AFMA.getNotional() * eps); ZeroRateSensitivity sensitivity1 = (ZeroRateSensitivity) sensitivities.get(1); assertEquals(sensitivity1.getCurrency(), FRA_AFMA.getCurrency()); assertEquals(sensitivity1.getDate(), fraExp.getPaymentDate()); assertEquals(sensitivity1.getSensitivity(), fdDscSense, FRA_AFMA.getNotional() * eps); }