/** * Calculates the present value sensitivity to the SABR model parameters. * <p> * The present value sensitivity of the leg is the sensitivity of the present value to * the SABR model parameters, alpha, beta, rho and nu. * * @param cmsLeg the CMS leg * @param ratesProvider the rates provider * @param swaptionVolatilities the swaption volatilities * @return the present value sensitivity */ public PointSensitivityBuilder presentValueSensitivityModelParamsSabr( ResolvedCmsLeg cmsLeg, RatesProvider ratesProvider, SabrSwaptionVolatilities swaptionVolatilities) { validate(ratesProvider, swaptionVolatilities); return cmsLeg.getCmsPeriods().stream() .map(cmsPeriod -> cmsPeriodPricer.presentValueSensitivityModelParamsSabr(cmsPeriod, ratesProvider, swaptionVolatilities)) .reduce(PointSensitivityBuilder.none(), PointSensitivityBuilder::combinedWith) .normalize(); }
public void test_normalize() { PointSensitivityBuilder base = PointSensitivityBuilder.none(); PointSensitivityBuilder test = base.normalize(); assertSame(test, base); }
private PointSensitivityBuilder compoundedFlatSensitivity( RatePaymentPeriod paymentPeriod, RatesProvider provider) { double cpaAccumulated = 0d; Currency ccy = paymentPeriod.getCurrency(); PointSensitivityBuilder sensiAccumulated = PointSensitivityBuilder.none(); for (RateAccrualPeriod accrualPeriod : paymentPeriod.getAccrualPeriods()) { double rate = rawRate(accrualPeriod, provider); double accrualZeroSpread = unitNotionalAccrualRaw(accrualPeriod, rate, 0); PointSensitivityBuilder sensiCp = sensiAccumulated.cloned(); sensiCp = sensiCp.multipliedBy(accrualZeroSpread); PointSensitivityBuilder sensi2 = unitNotionalSensitivityAccrual(accrualPeriod, ccy, provider).multipliedBy(1d + cpaAccumulated); cpaAccumulated += cpaAccumulated * accrualZeroSpread + unitNotionalAccrualRaw(accrualPeriod, rate, accrualPeriod.getSpread()); sensiCp = sensiCp.combinedWith(sensi2); sensiAccumulated = sensiAccumulated.combinedWith(sensiCp).normalize(); } return sensiAccumulated; }