Exemple #1
0
        public virtual void test_presentValue()
        {
            MultiCurrencyAmount pvSensiTrade   = PRICER_TRADE.presentValue(OPTION_TRADE, RATES_PROVIDER, VOLS);
            CurrencyAmount      pvSensiProduct = PRICER_PRODUCT.presentValue(OPTION_PRODUCT, RATES_PROVIDER, VOLS);
            CurrencyAmount      pvSensiPremium = PRICER_PAYMENT.presentValue(PREMIUM, RATES_PROVIDER);

            assertEquals(pvSensiTrade, MultiCurrencyAmount.of(pvSensiProduct, pvSensiPremium));
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the present value of the FX vanilla option trade.
        /// <para>
        /// The present value of the trade is the value on the valuation date.
        ///
        /// </para>
        /// </summary>
        /// <param name="trade">  the option trade </param>
        /// <param name="ratesProvider">  the rates provider </param>
        /// <param name="volatilities">  the Black volatility provider </param>
        /// <returns> the present value of the trade </returns>
        public virtual MultiCurrencyAmount presentValue(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, BlackFxOptionVolatilities volatilities)
        {
            ResolvedFxVanillaOption product   = trade.Product;
            CurrencyAmount          pvProduct = productPricer.presentValue(product, ratesProvider, volatilities);
            Payment        premium            = trade.Premium;
            CurrencyAmount pvPremium          = paymentPricer.presentValue(premium, ratesProvider);

            return(MultiCurrencyAmount.of(pvProduct).plus(pvPremium));
        }
        //-------------------------------------------------------------------------
        public virtual void test_price_presentValue()
        {
            double         priceCallOtm         = PRICER.price(CALL_OTM, RATES_PROVIDER, VOLS);
            CurrencyAmount pvCallOtm            = PRICER.presentValue(CALL_OTM, RATES_PROVIDER, VOLS);
            double         pricePutOtm          = PRICER.price(PUT_OTM, RATES_PROVIDER, VOLS);
            CurrencyAmount pvPutOtm             = PRICER.presentValue(PUT_OTM, RATES_PROVIDER, VOLS);
            double         timeToExpiry         = VOLS.relativeTime(EXPIRY);
            double         df                   = RATES_PROVIDER.discountFactor(USD, PAYMENT_DATE);
            double         forward              = PRICER.DiscountingFxSingleProductPricer.forwardFxRate(FX_PRODUCT_HIGH, RATES_PROVIDER).fxRate(CURRENCY_PAIR);
            double         volHigh              = SMILE_TERM.volatility(timeToExpiry, STRIKE_RATE_HIGH, forward);
            double         volLow               = SMILE_TERM.volatility(timeToExpiry, STRIKE_RATE_LOW, forward);
            double         expectedPriceCallOtm = df * BlackFormulaRepository.price(forward, STRIKE_RATE_HIGH, timeToExpiry, volHigh, true);
            double         expectedPricePutOtm  = df * BlackFormulaRepository.price(forward, STRIKE_RATE_LOW, timeToExpiry, volLow, false);
            double         expectedPvCallOtm    = -NOTIONAL *df *BlackFormulaRepository.price(forward, STRIKE_RATE_HIGH, timeToExpiry, volHigh, true);

            double expectedPvPutOtm = -NOTIONAL *df *BlackFormulaRepository.price(forward, STRIKE_RATE_LOW, timeToExpiry, volLow, false);

            assertEquals(priceCallOtm, expectedPriceCallOtm, TOL);
            assertEquals(pvCallOtm.Currency, USD);
            assertEquals(pvCallOtm.Amount, expectedPvCallOtm, NOTIONAL * TOL);
            assertEquals(pricePutOtm, expectedPricePutOtm, TOL);
            assertEquals(pvPutOtm.Currency, USD);
            assertEquals(pvPutOtm.Amount, expectedPvPutOtm, NOTIONAL * TOL);
        }