Ejemplo n.º 1
0
 //-------------------------------------------------------------------------
 /// <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);
        }