Пример #1
0
        public virtual void test_presentValueSensitivityRatesStickyModel()
        {
            PointSensitivityBuilder computed1 = PRICER.presentValueSensitivityRatesStickyModel(CAP_ONE_LEG, RATES, VOLS);
            PointSensitivityBuilder computed2 = PRICER.presentValueSensitivityRatesStickyModel(CAP_TWO_LEGS, RATES, VOLS);
            PointSensitivityBuilder cap       = PRICER_CAP_LEG.presentValueSensitivityRatesStickyModel(CAP_LEG, RATES, VOLS);
            PointSensitivityBuilder pay       = PRICER_PAY_LEG.presentValueSensitivity(PAY_LEG, RATES);

            assertEquals(computed1, cap);
            assertEquals(computed2, cap.combinedWith(pay));
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the present value rates sensitivity of the Ibor cap/floor product.
        /// <para>
        /// The present value sensitivity is computed in a "sticky model parameter" style, i.e. the sensitivity to the
        /// curve nodes with the SABR model parameters unchanged. This sensitivity does not include a potential
        /// re-calibration of the model parameters to the raw market data.
        ///
        /// </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 presentValueSensitivityRatesStickyModel(ResolvedIborCapFloor capFloor, RatesProvider ratesProvider, SabrIborCapletFloorletVolatilities volatilities)
        {
            PointSensitivityBuilder pvSensiCapFloorLeg = capFloorLegPricer.presentValueSensitivityRatesStickyModel(capFloor.CapFloorLeg, ratesProvider, volatilities);

            if (!capFloor.PayLeg.Present)
            {
                return(pvSensiCapFloorLeg);
            }
            PointSensitivityBuilder pvSensiPayLeg = PayLegPricer.presentValueSensitivity(capFloor.PayLeg.get(), ratesProvider);

            return(pvSensiCapFloorLeg.combinedWith(pvSensiPayLeg));
        }
        //-------------------------------------------------------------------------
        public virtual void test_presentValueSensitivityRatesStickyModel()
        {
            PointSensitivityBuilder capComputed   = PRICER.presentValueSensitivityRatesStickyModel(CAP, RATES, VOLS);
            PointSensitivityBuilder floorComputed = PRICER.presentValueSensitivityRatesStickyModel(FLOOR, RATES, VOLS);
            PointSensitivityBuilder capExpected   = PointSensitivityBuilder.none();
            PointSensitivityBuilder floorExpected = PointSensitivityBuilder.none();
            int nPeriods = CAP.CapletFloorletPeriods.size();

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

            assertTrue(capSensiComputed.equalWithTolerance(capSensiExpected, NOTIONAL_VALUE * TOL));
            assertTrue(floorSensiComputed.equalWithTolerance(floorSensiExpected, NOTIONAL_VALUE * TOL));
        }