Пример #1
0
        // node sensitivity function
        private System.Func <DoubleArray, DoubleMatrix> createJacobianFunction(SabrIborCapletFloorletVolatilityCalibrationDefinition sabrDefinition, RatesProvider ratesProvider, SabrParametersIborCapletFloorletVolatilities volatilities, IList <ResolvedIborCapFloorLeg> capList, IList <double> priceList, Currency currency)
        {
            int            nCaps      = capList.Count;
            SabrParameters sabrParams = volatilities.Parameters;
            CurveName      alphaName  = sabrParams.AlphaCurve.Name;
            CurveName      betaName   = sabrParams.BetaCurve.Name;
            CurveName      rhoName    = sabrParams.RhoCurve.Name;
            CurveName      nuName     = sabrParams.NuCurve.Name;

            System.Func <DoubleArray, DoubleMatrix> jacobianFunction = (DoubleArray x) =>
            {
                SabrParametersIborCapletFloorletVolatilities volsNew = updateParameters(sabrDefinition, volatilities, x);
                double[][] jacobian = new double[nCaps][];
                for (int i = 0; i < nCaps; ++i)
                {
                    PointSensitivities             point = sabrPricer.presentValueSensitivityModelParamsSabr(capList[i], ratesProvider, volsNew).build();
                    CurrencyParameterSensitivities sensi = volsNew.parameterSensitivity(point);
                    double      targetPriceInv           = 1d / priceList[i];
                    DoubleArray sensitivities            = sensi.getSensitivity(alphaName, currency).Sensitivity;
                    if (sabrDefinition.BetaCurve.Present)
                    { // beta fixed
                        sensitivities = sensitivities.concat(sensi.getSensitivity(rhoName, currency).Sensitivity);
                    }
                    else
                    { // rho fixed
                        sensitivities = sensitivities.concat(sensi.getSensitivity(betaName, currency).Sensitivity);
                    }
                    jacobian[i] = sensitivities.concat(sensi.getSensitivity(nuName, currency).Sensitivity).multipliedBy(targetPriceInv).toArray();
                }
                return(DoubleMatrix.ofUnsafe(jacobian));
            };
            return(jacobianFunction);
        }
Пример #2
0
        public virtual void test_presentValueSensitivityModelParamsSabr()
        {
            PointSensitivityBuilder computed1 = PRICER.presentValueSensitivityModelParamsSabr(CAP_ONE_LEG, RATES, VOLS);
            PointSensitivityBuilder computed2 = PRICER.presentValueSensitivityModelParamsSabr(CAP_TWO_LEGS, RATES, VOLS);
            PointSensitivityBuilder cap       = PRICER_CAP_LEG.presentValueSensitivityModelParamsSabr(CAP_LEG, RATES, VOLS);

            assertEquals(computed1, cap);
            assertEquals(computed2, cap);
        }
        //-------------------------------------------------------------------------
        public virtual void test_presentValueSensitivityModelParamsSabr()
        {
            PointSensitivityBuilder        capComputed   = PRICER.presentValueSensitivityModelParamsSabr(CAP, RATES, VOLS);
            PointSensitivityBuilder        floorComputed = PRICER.presentValueSensitivityModelParamsSabr(FLOOR, RATES, VOLS);
            CurrencyParameterSensitivities capExpected   = CurrencyParameterSensitivities.empty();
            CurrencyParameterSensitivities floorExpected = CurrencyParameterSensitivities.empty();
            int nPeriods = CAP.CapletFloorletPeriods.size();

            for (int i = 0; i < nPeriods; ++i)
            {
                capExpected   = capExpected.combinedWith(VOLS.parameterSensitivity(PRICER_PERIOD.presentValueSensitivityModelParamsSabr(CAP.CapletFloorletPeriods.get(i), RATES, VOLS).build()));
                floorExpected = floorExpected.combinedWith(VOLS.parameterSensitivity(PRICER_PERIOD.presentValueSensitivityModelParamsSabr(FLOOR.CapletFloorletPeriods.get(i), RATES, VOLS).build()));
            }
            CurrencyParameterSensitivities capSensiComputed   = VOLS.parameterSensitivity(capComputed.build());
            CurrencyParameterSensitivities floorSensiComputed = VOLS.parameterSensitivity(floorComputed.build());

            assertTrue(capSensiComputed.equalWithTolerance(capExpected, TOL * NOTIONAL_VALUE));
            assertTrue(floorSensiComputed.equalWithTolerance(floorExpected, TOL * NOTIONAL_VALUE));
        }
 //-------------------------------------------------------------------------
 /// <summary>
 /// Calculates the present value volatility sensitivity of the Ibor cap/floor product.
 /// <para>
 /// The sensitivity of the present value to the SABR model parameters, alpha, beta, rho and nu.
 ///
 /// </para>
 /// </summary>
 /// <param name="capFloor">  the Ibor cap/floor product </param>
 /// <param name="ratesProvider">  the rates provider </param>
 /// <param name="volatilities">  the volatilities </param>
 /// <returns> the present value sensitivity </returns>
 public virtual PointSensitivityBuilder presentValueSensitivityModelParamsSabr(ResolvedIborCapFloor capFloor, RatesProvider ratesProvider, SabrIborCapletFloorletVolatilities volatilities)
 {
     return(capFloorLegPricer.presentValueSensitivityModelParamsSabr(capFloor.CapFloorLeg, ratesProvider, volatilities));
 }