//------------------------------------------------------------------------- /// <summary> /// Calculates the present value volatility sensitivity of the Ibor cap/floor leg. /// <para> /// The present value volatility sensitivity of the leg is the sensitivity /// of the present value to the volatility values. /// /// </para> /// </summary> /// <param name="capFloorLeg"> the Ibor cap/floor leg </param> /// <param name="ratesProvider"> the rates provider </param> /// <param name="volatilities"> the volatilities </param> /// <returns> the present value volatility sensitivity </returns> public virtual PointSensitivityBuilder presentValueSensitivityModelParamsVolatility(ResolvedIborCapFloorLeg capFloorLeg, RatesProvider ratesProvider, IborCapletFloorletVolatilities volatilities) { validate(ratesProvider, volatilities); return(capFloorLeg.CapletFloorletPeriods.Select(period => periodPricer.presentValueSensitivityModelParamsVolatility(period, ratesProvider, volatilities)).Aggregate((c1, c2) => c1.combinedWith(c2)).get()); }
//------------------------------------------------------------------------- // price and vega function private System.Func <double, double[]> getValueVegaFunction(ResolvedIborCapFloorLeg cap, RatesProvider ratesProvider, IborCapletFloorletVolatilities vols, ZonedDateTime prevExpiry, int nodeIndex) { VolatilityIborCapletFloorletPeriodPricer periodPricer = LegPricer.PeriodPricer; System.Func <double, double[]> priceAndVegaFunction = (double?x) => { IborCapletFloorletVolatilities newVols = vols.withParameter(nodeIndex, x.Value); double price = cap.CapletFloorletPeriods.Where(p => p.FixingDateTime.isAfter(prevExpiry)).Select(p => periodPricer.presentValue(p, ratesProvider, newVols).Amount).Sum(); PointSensitivities point = cap.CapletFloorletPeriods.Where(p => p.FixingDateTime.isAfter(prevExpiry)).Select(p => periodPricer.presentValueSensitivityModelParamsVolatility(p, ratesProvider, newVols)).Aggregate((c1, c2) => c1.combinedWith(c2)).get().build(); CurrencyParameterSensitivities sensi = newVols.parameterSensitivity(point); double vega = sensi.Sensitivities.get(0).Sensitivity.get(nodeIndex); return(new double[] { price, vega }); }; return(priceAndVegaFunction); }