Ejemplo n.º 1
0
        private System.Func <DoubleArray, DoubleMatrix> getJacobianFunction(IList <ResolvedIborCapFloorLeg> capList, RatesProvider ratesProvider, System.Func <Surface, IborCapletFloorletVolatilities> volatilitiesFunction, InterpolatedNodalSurface baseSurface)
        {
            int nCaps  = capList.Count;
            int nNodes = baseSurface.ParameterCount;

            System.Func <DoubleArray, DoubleMatrix> jacobianFunction = (DoubleArray capletVols) =>
            {
                IborCapletFloorletVolatilities newVols = volatilitiesFunction(baseSurface.withZValues(capletVols));
                return(DoubleMatrix.ofArrayObjects(nCaps, nNodes, n => newVols.parameterSensitivity(LegPricer.presentValueSensitivityModelParamsVolatility(capList[n], ratesProvider, newVols).build()).Sensitivities.get(0).Sensitivity));
            };
            return(jacobianFunction);
        }
        //-------------------------------------------------------------------------
        // 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);
        }