//------------------------------------------------------------------------- public virtual void test_presentValueSensitivityNormalVolatility() { SwaptionSensitivity computedRec = PRICER_SWAPTION.presentValueSensitivityModelParamsVolatility(SWAPTION_REC_LONG, RATE_PROVIDER, VOLS); CurrencyAmount pvRecUp = PRICER_SWAPTION.presentValue(SWAPTION_REC_LONG, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(FD_EPS)); CurrencyAmount pvRecDw = PRICER_SWAPTION.presentValue(SWAPTION_REC_LONG, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(-FD_EPS)); double expectedRec = 0.5 * (pvRecUp.Amount - pvRecDw.Amount) / FD_EPS; assertEquals(computedRec.Currency, USD); assertEquals(computedRec.Sensitivity, expectedRec, FD_EPS * NOTIONAL); assertEquals(computedRec.VolatilitiesName, VOLS.Name); assertEquals(computedRec.Expiry, VOLS.relativeTime(SWAPTION_REC_LONG.Expiry)); assertEquals(computedRec.Tenor, SWAP_TENOR_YEAR, TOL); assertEquals(computedRec.Strike, STRIKE, TOL); assertEquals(computedRec.Forward, PRICER_SWAP.parRate(RSWAP_REC, RATE_PROVIDER), TOL); SwaptionSensitivity computedPay = PRICER_SWAPTION.presentValueSensitivityModelParamsVolatility(SWAPTION_PAY_SHORT, RATE_PROVIDER, VOLS); CurrencyAmount pvUpPay = PRICER_SWAPTION.presentValue(SWAPTION_PAY_SHORT, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(FD_EPS)); CurrencyAmount pvDwPay = PRICER_SWAPTION.presentValue(SWAPTION_PAY_SHORT, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(-FD_EPS)); double expectedPay = 0.5 * (pvUpPay.Amount - pvDwPay.Amount) / FD_EPS; assertEquals(computedPay.Currency, USD); assertEquals(computedPay.Sensitivity, expectedPay, FD_EPS * NOTIONAL); assertEquals(computedPay.VolatilitiesName, VOLS.Name); assertEquals(computedPay.Expiry, VOLS.relativeTime(SWAPTION_PAY_SHORT.Expiry)); assertEquals(computedPay.Tenor, SWAP_TENOR_YEAR, TOL); assertEquals(computedPay.Strike, STRIKE, TOL); assertEquals(computedPay.Forward, PRICER_SWAP.parRate(RSWAP_PAY, RATE_PROVIDER), TOL); }
//------------------------------------------------------------------------- public virtual void present_value_sensitivityNormalVolatility_FD() { double shiftVol = 1.0E-4; CurrencyAmount pvP = PRICER_SWAPTION_NORMAL.presentValue(SWAPTION_LONG_PAY, MULTI_USD, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(shiftVol)); CurrencyAmount pvM = PRICER_SWAPTION_NORMAL.presentValue(SWAPTION_LONG_PAY, MULTI_USD, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(-shiftVol)); double pvnvsFd = (pvP.Amount - pvM.Amount) / (2 * shiftVol); SwaptionSensitivity pvnvsAd = PRICER_SWAPTION_NORMAL.presentValueSensitivityModelParamsVolatility(SWAPTION_LONG_PAY, MULTI_USD, NORMAL_VOLS_USD_STD); assertEquals(pvnvsAd.Currency, USD); assertEquals(pvnvsAd.Sensitivity, pvnvsFd, TOLERANCE_PV_VEGA); assertEquals(pvnvsAd.VolatilitiesName, NORMAL_VOLS_USD_STD.Name); assertEquals(pvnvsAd.Expiry, NORMAL_VOLS_USD_STD.relativeTime(SWAPTION_LONG_PAY.Expiry)); assertEquals(pvnvsAd.Tenor, SWAP_TENOR_YEAR, TOLERANCE_RATE); assertEquals(pvnvsAd.Strike, STRIKE, TOLERANCE_RATE); double forward = PRICER_SWAP.parRate(RSWAP_REC, MULTI_USD); assertEquals(pvnvsAd.Forward, forward, TOLERANCE_RATE); }