// 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); }
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)); }