//-------------------------------------------------------------------------
 public virtual void test_volatility()
 {
     for (int i = 0; i < NB_EXPIRY; i++)
     {
         double expiryTime = VOLS.relativeTime(TEST_EXPIRY[i]);
         for (int j = 0; j < NB_STRIKE; ++j)
         {
             double volExpected = SURFACE.zValue(expiryTime, TEST_STRIKE[j]);
             double volComputed = VOLS.volatility(CURRENCY_PAIR, TEST_EXPIRY[i], TEST_STRIKE[j], FORWARD[i]);
             assertEquals(volComputed, volExpected, TOLERANCE);
         }
     }
 }
 public virtual void test_volatility()
 {
     for (int i = 0; i < NB_TEST; i++)
     {
         double expiryTime  = VOLS.relativeTime(TEST_OPTION_EXPIRY[i]);
         double volExpected = SURFACE.zValue(expiryTime, TEST_STRIKE[i]);
         double volComputed = VOLS.volatility(TEST_OPTION_EXPIRY[i], TEST_TENOR, TEST_STRIKE[i], TEST_FORWARD);
         assertEquals(volComputed, volExpected, TOLERANCE_VOL);
     }
 }
        //-------------------------------------------------------------------------
        public virtual void test_presentValueSensitivity()
        {
            PointSensitivities             point    = OPTION_TRADE_PRICER.presentValueSensitivityRates(OPTION_TRADE, RATE_PROVIDER, VOLS);
            CurrencyParameterSensitivities computed = RATE_PROVIDER.parameterSensitivity(point);
            double futurePrice    = FUTURE_PRICER.price(OPTION_PRODUCT.UnderlyingFuture, RATE_PROVIDER);
            double strike         = OPTION_PRODUCT.StrikePrice;
            double expiryTime     = ACT_365F.relativeYearFraction(VAL_DATE, OPTION_PRODUCT.ExpiryDate);
            double logMoneyness   = Math.Log(strike / futurePrice);
            double logMoneynessUp = Math.Log(strike / (futurePrice + EPS));
            double logMoneynessDw = Math.Log(strike / (futurePrice - EPS));
            double vol            = SURFACE.zValue(expiryTime, logMoneyness);
            double volUp          = SURFACE.zValue(expiryTime, logMoneynessUp);
            double volDw          = SURFACE.zValue(expiryTime, logMoneynessDw);
            double volSensi       = 0.5 * (volUp - volDw) / EPS;
            double vega           = BlackFormulaRepository.vega(futurePrice, strike, expiryTime, vol);
            CurrencyParameterSensitivities sensiVol = RATE_PROVIDER.parameterSensitivity(FUTURE_PRICER.priceSensitivity(OPTION_PRODUCT.UnderlyingFuture, RATE_PROVIDER)).multipliedBy(-vega * volSensi * NOTIONAL * QUANTITY);
            CurrencyParameterSensitivities expected = FD_CAL.sensitivity(RATE_PROVIDER, (p) => OPTION_TRADE_PRICER.presentValue(OPTION_TRADE, (p), VOLS, REFERENCE_PRICE));

            assertTrue(computed.equalWithTolerance(expected.combinedWith(sensiVol), 30d * EPS * NOTIONAL * QUANTITY));
        }
示例#4
0
        public virtual void test_price()
        {
            double computed     = OPTION_PRICER.price(FUTURE_OPTION_PRODUCT, RATE_PROVIDER, VOLS);
            double futurePrice  = FUTURE_PRICER.price(FUTURE_OPTION_PRODUCT.UnderlyingFuture, RATE_PROVIDER);
            double strike       = FUTURE_OPTION_PRODUCT.StrikePrice;
            double expiryTime   = ACT_365F.relativeYearFraction(VAL_DATE, FUTURE_OPTION_PRODUCT.ExpiryDate);
            double logMoneyness = Math.Log(strike / futurePrice);
            double vol          = SURFACE.zValue(expiryTime, logMoneyness);
            double expected     = BlackFormulaRepository.price(futurePrice, strike, expiryTime, vol, true);

            assertEquals(computed, expected, TOL);
        }
示例#5
0
        private Triple <DoubleArray, DoubleArray, DoubleArray> createCapletNodes(InterpolatedNodalSurface capVolSurface, DoubleArray capletExpiries, DoubleArray strikes, Curve shiftCurve)
        {
            IList <double> timeCapletList   = new List <double>();
            IList <double> strikeCapletList = new List <double>();
            IList <double> volCapletList    = new List <double>();
            int            nTimes           = capletExpiries.size();
            int            nStrikes         = strikes.size();

            for (int i = 0; i < nTimes; ++i)
            {
                double expiry = capletExpiries.get(i);
                double shift  = shiftCurve.yValue(expiry);
                ((IList <double>)timeCapletList).AddRange(DoubleArray.filled(nStrikes, expiry).toList());
                ((IList <double>)strikeCapletList).AddRange(strikes.plus(shift).toList());
                ((IList <double>)volCapletList).AddRange(DoubleArray.of(nStrikes, n => capVolSurface.zValue(expiry, strikes.get(n) + shift)).toList());  // initial guess
            }
            return(Triple.of(DoubleArray.copyOf(timeCapletList), DoubleArray.copyOf(strikeCapletList), DoubleArray.copyOf(volCapletList)));
        }