//------------------------------------------------------------------------- // 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); }
/// <summary> /// Creates an instance. /// </summary> /// <param name="periodPricer"> the pricer for <seealso cref="IborCapletFloorletPeriod"/>. </param> public VolatilityIborCapFloorLegPricer(VolatilityIborCapletFloorletPeriodPricer periodPricer) { this.periodPricer = ArgChecker.notNull(periodPricer, "periodPricer"); }
// sum of caplet prices which are already fixed private double priceFixed(ResolvedIborCapFloorLeg cap, RatesProvider ratesProvider, IborCapletFloorletVolatilities vols, ZonedDateTime prevExpiry) { VolatilityIborCapletFloorletPeriodPricer periodPricer = LegPricer.PeriodPricer; return(cap.CapletFloorletPeriods.Where(p => !p.FixingDateTime.isAfter(prevExpiry)).Select(p => periodPricer.presentValue(p, ratesProvider, vols).Amount).Sum()); }