Example #1
0
        public virtual void test_parameterSensitivity()
        {
            RepoCurveDiscountFactors       @base    = RepoCurveDiscountFactors.of(DSC_FACTORS, GROUP);
            RepoCurveZeroRateSensitivity   sensi    = @base.zeroRatePointSensitivity(DATE_AFTER, USD);
            CurrencyParameterSensitivities computed = @base.parameterSensitivity(sensi);
            CurrencyParameterSensitivities expected = DSC_FACTORS.parameterSensitivity(DSC_FACTORS.zeroRatePointSensitivity(DATE_AFTER, USD));

            assertEquals(computed, expected);
        }
        //-------------------------------------------------------------------------
        public CurrencyParameterSensitivities parameterSensitivity(FxForwardSensitivity pointSensitivity)
        {
            // use the specified base currency to determine the desired currency pair
            // then derive sensitivity from discount factors based off desired currency pair, not that of the index
            CurrencyPair currencyPair        = pointSensitivity.CurrencyPair;
            Currency     refBaseCurrency     = pointSensitivity.ReferenceCurrency;
            Currency     refCounterCurrency  = pointSensitivity.ReferenceCounterCurrency;
            Currency     sensitivityCurrency = pointSensitivity.Currency;
            LocalDate    referenceDate       = pointSensitivity.ReferenceDate;

            bool            inverse = refBaseCurrency.Equals(currencyPair.Counter);
            DiscountFactors discountFactorsRefBase    = (inverse ? counterCurrencyDiscountFactors : baseCurrencyDiscountFactors);
            DiscountFactors discountFactorsRefCounter = (inverse ? baseCurrencyDiscountFactors : counterCurrencyDiscountFactors);
            double          dfCcyBaseAtMaturity       = discountFactorsRefBase.discountFactor(referenceDate);
            double          dfCcyCounterAtMaturityInv = 1d / discountFactorsRefCounter.discountFactor(referenceDate);

            double fxRate = fxRateProvider.fxRate(refBaseCurrency, refCounterCurrency);
            ZeroRateSensitivity dfCcyBaseAtMaturitySensitivity = discountFactorsRefBase.zeroRatePointSensitivity(referenceDate, sensitivityCurrency).multipliedBy(fxRate * dfCcyCounterAtMaturityInv * pointSensitivity.Sensitivity);

            ZeroRateSensitivity dfCcyCounterAtMaturitySensitivity = discountFactorsRefCounter.zeroRatePointSensitivity(referenceDate, sensitivityCurrency).multipliedBy(-fxRate * dfCcyBaseAtMaturity * dfCcyCounterAtMaturityInv * dfCcyCounterAtMaturityInv * pointSensitivity.Sensitivity);

            return(discountFactorsRefBase.parameterSensitivity(dfCcyBaseAtMaturitySensitivity).combinedWith(discountFactorsRefCounter.parameterSensitivity(dfCcyCounterAtMaturitySensitivity)));
        }