//------------------------------------------------------------------------- public virtual void test_presentValueGamma() { CurrencyAmount capComputed = PRICER.presentValueGamma(CAP, RATES, VOLS); CurrencyAmount floorComputed = PRICER.presentValueGamma(FLOOR, RATES, VOLS); double capExpected = 0d; double floorExpected = 0d; int nPeriods = CAP.CapletFloorletPeriods.size(); for (int i = 0; i < nPeriods; ++i) { capExpected += PRICER_PERIOD.presentValueGamma(CAP.CapletFloorletPeriods.get(i), RATES, VOLS).Amount; floorExpected += PRICER_PERIOD.presentValueGamma(FLOOR.CapletFloorletPeriods.get(i), RATES, VOLS).Amount; } assertEquals(capComputed.Currency, EUR); assertEquals(capComputed.Amount, capExpected, TOL * NOTIONAL_VALUE); assertEquals(floorComputed.Currency, EUR); assertEquals(floorComputed.Amount, floorExpected, TOL * NOTIONAL_VALUE); }
//------------------------------------------------------------------------- public virtual void test_presentValueGamma_formula() { CurrencyAmount computedCaplet = PRICER.presentValueGamma(CAPLET_LONG, RATES, VOLS); CurrencyAmount computedFloorlet = PRICER.presentValueGamma(FLOORLET_SHORT, RATES, VOLS); double forward = RATES.iborIndexRates(EUR_EURIBOR_3M).rate(RATE_COMP.Observation); double expiry = VOLS.relativeTime(CAPLET_LONG.FixingDateTime); double volatility = VOLS.volatility(expiry, STRIKE, forward); double df = RATES.discountFactor(EUR, CAPLET_LONG.PaymentDate); double expectedCaplet = NOTIONAL * df * CAPLET_LONG.YearFraction * NormalFormulaRepository.gamma(forward, STRIKE, expiry, volatility, CALL); double expectedFloorlet = -NOTIONAL *df *CAPLET_LONG.YearFraction *NormalFormulaRepository.gamma(forward, STRIKE, expiry, volatility, PUT); assertEquals(computedCaplet.Currency, EUR); assertEquals(computedCaplet.Amount, expectedCaplet, NOTIONAL * TOL); assertEquals(computedFloorlet.Currency, EUR); assertEquals(computedFloorlet.Amount, expectedFloorlet, NOTIONAL * TOL); }