Ejemplo n.º 1
0
        public virtual void test_trinomialTree_down()
        {
            int nSteps = 133;
            LatticeSpecification lattice = new CoxRossRubinsteinLatticeSpecification();
            DoubleArray          rebate  = DoubleArray.of(nSteps + 1, i => REBATE_AMOUNT);
            double barrierLevel          = 76d;
            double tol = 1.0e-2;

            foreach (bool isCall in new bool[] { true, false })
            {
                foreach (double strike in STRIKES)
                {
                    foreach (double interest in INTERESTS)
                    {
                        foreach (double vol in VOLS)
                        {
                            foreach (double dividend in DIVIDENDS)
                            {
                                OptionFunction function = ConstantContinuousSingleBarrierKnockoutFunction.of(strike, TIME, PutCall.ofPut(!isCall), nSteps, BarrierType.DOWN, barrierLevel, rebate);
                                SimpleConstantContinuousBarrier barrier = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_OUT, barrierLevel);
                                double exact    = REBATE_AMOUNT * REBATE_PRICER.price(SPOT, TIME, interest - dividend, interest, vol, barrier.inverseKnockType()) + BARRIER_PRICER.price(SPOT, strike, TIME, interest - dividend, interest, vol, isCall, barrier);
                                double computed = TRINOMIAL_TREE.optionPrice(function, lattice, SPOT, vol, interest, dividend);
                                assertEquals(computed, exact, Math.Max(exact, 1d) * tol);
                            }
                        }
                    }
                }
            }
        }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void test_black()
        public virtual void test_black()
        {
            double tol = 1.0e-2;

            for (int i = 0; i < 11; ++i)
            {
                // up barrier
                double lowerBarrier = 1.1 + 0.025 * i;
                SimpleConstantContinuousBarrier dko       = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_OUT, lowerBarrier);
                ResolvedFxSingleBarrierOption   optionDko = ResolvedFxSingleBarrierOption.of(CALL, dko);
                double priceDkoBlack = BLACK_PRICER.price(optionDko, RATE_PROVIDER_FLAT, VOLS_FLAT);
                double priceDko      = PRICER_70.price(optionDko, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEqualsRelative(priceDko, priceDkoBlack, tol);
                SimpleConstantContinuousBarrier dki       = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_IN, lowerBarrier);
                ResolvedFxSingleBarrierOption   optionDki = ResolvedFxSingleBarrierOption.of(CALL, dki);
                double priceDkiBlack = BLACK_PRICER.price(optionDki, RATE_PROVIDER_FLAT, VOLS_FLAT);
                double priceDki      = PRICER_70.price(optionDki, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEqualsRelative(priceDki, priceDkiBlack, tol);
                // down barrier
                double higherBarrier = 1.45 + 0.025 * i;
                SimpleConstantContinuousBarrier uko       = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_OUT, higherBarrier);
                ResolvedFxSingleBarrierOption   optionUko = ResolvedFxSingleBarrierOption.of(CALL, uko);
                double priceUkoBlack = BLACK_PRICER.price(optionUko, RATE_PROVIDER_FLAT, VOLS_FLAT);
                double priceUko      = PRICER_70.price(optionUko, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEqualsRelative(priceUko, priceUkoBlack, tol);
                SimpleConstantContinuousBarrier uki       = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_IN, higherBarrier);
                ResolvedFxSingleBarrierOption   optionUki = ResolvedFxSingleBarrierOption.of(CALL, uki);
                double priceUkiBlack = BLACK_PRICER.price(optionUki, RATE_PROVIDER_FLAT, VOLS_FLAT);
                double priceUki      = PRICER_70.price(optionUki, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEqualsRelative(priceUki, priceUkiBlack, tol);
            }
        }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void test_monotonicity()
        public virtual void test_monotonicity()
        {
            double priceDkoPrev = 100d;
            double priceDkiPrev = 0d;
            double priceUkoPrev = 0d;
            double priceUkiPrev = 100d;

            for (int i = 0; i < 50; ++i)
            {
                // up barrier
                double lowerBarrier = 1.1 + 0.006 * i;
                SimpleConstantContinuousBarrier dko       = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_OUT, lowerBarrier);
                ResolvedFxSingleBarrierOption   optionDko = ResolvedFxSingleBarrierOption.of(CALL, dko);
                double priceDko = PRICER_39.price(optionDko, RATE_PROVIDER, VOLS, DATA_39);
                SimpleConstantContinuousBarrier dki       = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_IN, lowerBarrier);
                ResolvedFxSingleBarrierOption   optionDki = ResolvedFxSingleBarrierOption.of(CALL, dki);
                double priceDki = PRICER_39.price(optionDki, RATE_PROVIDER, VOLS, DATA_39);
                // down barrier
                double higherBarrier = 1.4 + 0.006 * (i + 1);
                SimpleConstantContinuousBarrier uko       = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_OUT, higherBarrier);
                ResolvedFxSingleBarrierOption   optionUko = ResolvedFxSingleBarrierOption.of(CALL, uko);
                double priceUko = PRICER_39.price(optionUko, RATE_PROVIDER, VOLS, DATA_39);
                SimpleConstantContinuousBarrier uki       = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_IN, higherBarrier);
                ResolvedFxSingleBarrierOption   optionUki = ResolvedFxSingleBarrierOption.of(CALL, uki);
                double priceUki = PRICER_39.price(optionUki, RATE_PROVIDER, VOLS, DATA_39);
                assertTrue(priceDkoPrev > priceDko);
                assertTrue(priceDkiPrev < priceDki);
                assertTrue(priceUkoPrev < priceUko);
                assertTrue(priceUkiPrev > priceUki);
                priceDkoPrev = priceDko;
                priceDkiPrev = priceDki;
                priceUkoPrev = priceUko;
                priceUkiPrev = priceUki;
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Lower barrier level is very small.
        /// </summary>
        public virtual void smallBarrierTest()
        {
            SimpleConstantContinuousBarrier @in  = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_IN, 0.1d);
            SimpleConstantContinuousBarrier @out = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_OUT, 0.1d);
            double dwIn  = PRICER.price(SPOT, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, @in);
            double dwOut = PRICER.price(SPOT, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, @out);

            assertRelative(dwIn, 0d);
            assertRelative(dwOut, DF_DOM);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Upper barrier level is very high.
        /// </summary>
        public virtual void largeBarrierTest()
        {
            SimpleConstantContinuousBarrier @in  = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_IN, 1.0e4);
            SimpleConstantContinuousBarrier @out = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_OUT, 1.0e4);
            double upIn  = PRICER.price(SPOT, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, @in);
            double upOut = PRICER.price(SPOT, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, @out);

            assertRelative(upIn, 0d);
            assertRelative(upOut, DF_DOM);
        }
        public virtual void test_tradePricer()
        {
            for (int i = 0; i < 11; ++i)
            {
                // up barrier
                double lowerBarrier = 1.1 + 0.025 * i;
                SimpleConstantContinuousBarrier    dko       = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_OUT, lowerBarrier);
                ResolvedFxSingleBarrierOption      callDko   = ResolvedFxSingleBarrierOption.of(CALL, dko);
                ResolvedFxSingleBarrierOptionTrade callTrade = ResolvedFxSingleBarrierOptionTrade.builder().product(callDko).premium(Payment.of(EUR, 0, VAL_DATE)).build();

                CurrencyAmount      pvProduct = PRICER_39.presentValue(callDko, RATE_PROVIDER, VOLS);
                MultiCurrencyAmount pvTrade   = TRADE_PRICER_39.presentValue(callTrade, RATE_PROVIDER, VOLS);
                assertEquals(pvTrade.getAmount(USD), pvProduct);
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Upper barrier level is very high: knock-in is close to 0, knock-out is close to vanilla.
        /// </summary>
        public virtual void largeBarrierTest()
        {
            SimpleConstantContinuousBarrier upIn  = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_IN, 1.0e4);
            SimpleConstantContinuousBarrier upOut = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_OUT, 1.0e4);

            foreach (double strike in STRIKES)
            {
                // call
                double callVanilla = BlackFormulaRepository.price(FWD_FX, strike, EXPIRY_TIME, VOLATILITY, true) * DF_DOM;
                double callUpIn    = BARRIER_PRICER.price(SPOT, strike, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, true, upIn);
                double callUpOut   = BARRIER_PRICER.price(SPOT, strike, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, true, upOut);
                assertRelative(callUpIn, 0d);
                assertRelative(callUpOut, callVanilla);
                // put
                double putVanilla = BlackFormulaRepository.price(FWD_FX, strike, EXPIRY_TIME, VOLATILITY, false) * DF_DOM;
                double putUpIn    = BARRIER_PRICER.price(SPOT, strike, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, false, upIn);
                double putUpOut   = BARRIER_PRICER.price(SPOT, strike, EXPIRY_TIME, COST_OF_CARRY, RATE_DOM, VOLATILITY, false, upOut);
                assertRelative(putUpIn, 0d);
                assertRelative(putUpOut, putVanilla);
            }
        }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void test_inOutParity()
        public virtual void test_inOutParity()
        {
            double tol       = 1.0e-2;
            double callPrice = VANILLA_PRICER.price(CALL, RATE_PROVIDER, VOLS);
            double putPrice  = VANILLA_PRICER.price(PUT, RATE_PROVIDER, VOLS);

            for (int i = 0; i < 11; ++i)
            {
                // up barrier
                double lowerBarrier = 1.1 + 0.025 * i;
                SimpleConstantContinuousBarrier dko     = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_OUT, lowerBarrier);
                ResolvedFxSingleBarrierOption   callDko = ResolvedFxSingleBarrierOption.of(CALL, dko);
                double priceCallDko = PRICER_39.price(callDko, RATE_PROVIDER, VOLS, DATA_39);
                ResolvedFxSingleBarrierOption putDko = ResolvedFxSingleBarrierOption.of(PUT, dko);
                double pricePutDko = PRICER_39.price(putDko, RATE_PROVIDER, VOLS, DATA_39);
                SimpleConstantContinuousBarrier dki     = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_IN, lowerBarrier);
                ResolvedFxSingleBarrierOption   callDki = ResolvedFxSingleBarrierOption.of(CALL, dki);
                double priceCallDki = PRICER_39.price(callDki, RATE_PROVIDER, VOLS, DATA_39);
                ResolvedFxSingleBarrierOption putDki = ResolvedFxSingleBarrierOption.of(PUT, dki);
                double pricePutDki = PRICER_39.price(putDki, RATE_PROVIDER, VOLS, DATA_39);
                assertEqualsRelative(priceCallDko + priceCallDki, callPrice, tol);
                assertEqualsRelative(pricePutDko + pricePutDki, putPrice, tol);
                // down barrier
                double higherBarrier = 1.45 + 0.025 * i;
                SimpleConstantContinuousBarrier uko     = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_OUT, higherBarrier);
                ResolvedFxSingleBarrierOption   callUko = ResolvedFxSingleBarrierOption.of(CALL, uko);
                double priceCallUko = PRICER_39.price(callUko, RATE_PROVIDER, VOLS, DATA_39);
                ResolvedFxSingleBarrierOption putUko = ResolvedFxSingleBarrierOption.of(PUT, uko);
                double pricePutUko = PRICER_39.price(putUko, RATE_PROVIDER, VOLS, DATA_39);
                SimpleConstantContinuousBarrier uki     = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_IN, higherBarrier);
                ResolvedFxSingleBarrierOption   callUki = ResolvedFxSingleBarrierOption.of(CALL, uki);
                double priceCallUki = PRICER_39.price(callUki, RATE_PROVIDER, VOLS, DATA_39);
                ResolvedFxSingleBarrierOption putUki = ResolvedFxSingleBarrierOption.of(PUT, uki);
                double pricePutUki = PRICER_39.price(putUki, RATE_PROVIDER, VOLS, DATA_39);
                assertEqualsRelative(priceCallUko + priceCallUki, callPrice, tol);
                assertEqualsRelative(pricePutUko + pricePutUki, putPrice, tol);
            }
        }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void test_black_currencyExposure()
        public virtual void test_black_currencyExposure()
        {
            double tol = 7.0e-2;     // large tol due to approximated delta

            for (int i = 0; i < 8; ++i)
            {
                // up barrier
                double lowerBarrier = 1.1 + 0.025 * i;
                SimpleConstantContinuousBarrier dko        = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_OUT, lowerBarrier);
                ResolvedFxSingleBarrierOption   optionDko  = ResolvedFxSingleBarrierOption.of(CALL, dko, REBATE_BASE);
                MultiCurrencyAmount             ceDkoBlack = BLACK_PRICER.currencyExposure(optionDko, RATE_PROVIDER_FLAT, VOLS_FLAT);
                MultiCurrencyAmount             ceDko      = PRICER_70.currencyExposure(optionDko, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEquals(ceDko.getAmount(EUR).Amount, ceDkoBlack.getAmount(EUR).Amount, NOTIONAL * tol);
                assertEquals(ceDko.getAmount(USD).Amount, ceDkoBlack.getAmount(USD).Amount, NOTIONAL * tol);
                SimpleConstantContinuousBarrier dki        = SimpleConstantContinuousBarrier.of(BarrierType.DOWN, KnockType.KNOCK_IN, lowerBarrier);
                ResolvedFxSingleBarrierOption   optionDki  = ResolvedFxSingleBarrierOption.of(CALL, dki, REBATE);
                MultiCurrencyAmount             ceDkiBlack = BLACK_PRICER.currencyExposure(optionDki, RATE_PROVIDER_FLAT, VOLS_FLAT);
                MultiCurrencyAmount             ceDki      = PRICER_70.currencyExposure(optionDki, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEquals(ceDki.getAmount(EUR).Amount, ceDkiBlack.getAmount(EUR).Amount, NOTIONAL * tol);
                assertEquals(ceDki.getAmount(USD).Amount, ceDkiBlack.getAmount(USD).Amount, NOTIONAL * tol);
                // down barrier
                double higherBarrier = 1.45 + 0.025 * i;
                SimpleConstantContinuousBarrier uko        = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_OUT, higherBarrier);
                ResolvedFxSingleBarrierOption   optionUko  = ResolvedFxSingleBarrierOption.of(CALL, uko, REBATE);
                MultiCurrencyAmount             ceUkoBlack = BLACK_PRICER.currencyExposure(optionUko, RATE_PROVIDER_FLAT, VOLS_FLAT);
                MultiCurrencyAmount             ceUko      = PRICER_70.currencyExposure(optionUko, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEquals(ceUko.getAmount(EUR).Amount, ceUkoBlack.getAmount(EUR).Amount, NOTIONAL * tol);
                assertEquals(ceUko.getAmount(USD).Amount, ceUkoBlack.getAmount(USD).Amount, NOTIONAL * tol);
                SimpleConstantContinuousBarrier uki        = SimpleConstantContinuousBarrier.of(BarrierType.UP, KnockType.KNOCK_IN, higherBarrier);
                ResolvedFxSingleBarrierOption   optionUki  = ResolvedFxSingleBarrierOption.of(CALL, uki, REBATE_BASE);
                MultiCurrencyAmount             ceUkiBlack = BLACK_PRICER.currencyExposure(optionUki, RATE_PROVIDER_FLAT, VOLS_FLAT);
                MultiCurrencyAmount             ceUki      = PRICER_70.currencyExposure(optionUki, RATE_PROVIDER_FLAT, VOLS_FLAT, DATA_70_FLAT);
                assertEquals(ceUki.getAmount(EUR).Amount, ceUkiBlack.getAmount(EUR).Amount, NOTIONAL * tol);
                assertEquals(ceUki.getAmount(USD).Amount, ceUkiBlack.getAmount(USD).Amount, NOTIONAL * tol);
            }
        }