//-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the present value sensitivity to piecewise constant volatility parameters of the Hull-White model.
        /// </summary>
        /// <param name="trade">  the trade to price </param>
        /// <param name="ratesProvider">  the rates provider </param>
        /// <param name="hwProvider">  the Hull-White model parameter provider </param>
        /// <returns> the present value parameter sensitivity of the trade </returns>
        public virtual DoubleArray presentValueSensitivityModelParamsHullWhite(ResolvedIborFutureTrade trade, RatesProvider ratesProvider, HullWhiteOneFactorPiecewiseConstantParametersProvider hwProvider)
        {
            ResolvedIborFuture product = trade.Product;
            DoubleArray        hwSensi = productPricer.priceSensitivityModelParamsHullWhite(product, ratesProvider, hwProvider);

            hwSensi = hwSensi.multipliedBy(product.Notional * product.AccrualFactor * trade.Quantity);
            return(hwSensi);
        }
Exemple #2
0
        public virtual void test_priceSensitivityHullWhiteParameter()
        {
            DoubleArray computed = PRICER.priceSensitivityModelParamsHullWhite(FUTURE, RATE_PROVIDER, HW_PROVIDER);
            DoubleArray vols     = HW_PROVIDER.Parameters.Volatility;
            int         size     = vols.size();

            double[] expected = new double[size];
            for (int i = 0; i < size; ++i)
            {
                double[] volsUp = vols.toArray();
                double[] volsDw = vols.toArray();
                volsUp[i] += TOL_FD;
                volsDw[i] -= TOL_FD;
                HullWhiteOneFactorPiecewiseConstantParameters         paramsUp = HullWhiteOneFactorPiecewiseConstantParameters.of(HW_PROVIDER.Parameters.MeanReversion, DoubleArray.copyOf(volsUp), HW_PROVIDER.Parameters.VolatilityTime.subArray(1, size));
                HullWhiteOneFactorPiecewiseConstantParameters         paramsDw = HullWhiteOneFactorPiecewiseConstantParameters.of(HW_PROVIDER.Parameters.MeanReversion, DoubleArray.copyOf(volsDw), HW_PROVIDER.Parameters.VolatilityTime.subArray(1, size));
                HullWhiteOneFactorPiecewiseConstantParametersProvider provUp   = HullWhiteOneFactorPiecewiseConstantParametersProvider.of(paramsUp, HW_PROVIDER.DayCount, HW_PROVIDER.ValuationDateTime);
                HullWhiteOneFactorPiecewiseConstantParametersProvider provDw   = HullWhiteOneFactorPiecewiseConstantParametersProvider.of(paramsDw, HW_PROVIDER.DayCount, HW_PROVIDER.ValuationDateTime);
                double priceUp = PRICER.price(FUTURE, RATE_PROVIDER, provUp);
                double priceDw = PRICER.price(FUTURE, RATE_PROVIDER, provDw);
                expected[i] = 0.5 * (priceUp - priceDw) / TOL_FD;
            }
            assertTrue(DoubleArrayMath.fuzzyEquals(computed.toArray(), expected, TOL_FD));
        }