Ejemplo n.º 1
0
        public virtual void hashEqualGetter()
        {
            assertEquals(PARAMETERS.AlphaSurface, ALPHA_SURFACE);
            assertEquals(PARAMETERS.BetaSurface, BETA_SURFACE);
            assertEquals(PARAMETERS.RhoSurface, RHO_SURFACE);
            assertEquals(PARAMETERS.NuSurface, NU_SURFACE);
            assertEquals(PARAMETERS.SabrVolatilityFormula, FORMULA);
            assertEquals(PARAMETERS.ShiftSurface.Name, SurfaceName.of("Zero shift"));
            double expiry = 2.0;
            double tenor  = 3.0;
            double alpha  = ALPHA_SURFACE.zValue(expiry, tenor);
            double beta   = BETA_SURFACE.zValue(expiry, tenor);
            double rho    = RHO_SURFACE.zValue(expiry, tenor);
            double nu     = NU_SURFACE.zValue(expiry, tenor);

            assertEquals(PARAMETERS.alpha(expiry, tenor), alpha);
            assertEquals(PARAMETERS.beta(expiry, tenor), beta);
            assertEquals(PARAMETERS.rho(expiry, tenor), rho);
            assertEquals(PARAMETERS.nu(expiry, tenor), nu);
            double strike  = 1.1;
            double forward = 1.05;

            assertEquals(PARAMETERS.volatility(expiry, tenor, strike, forward), FORMULA.volatility(forward, strike, expiry, alpha, beta, rho, nu));
            double[] adjCmp = PARAMETERS.volatilityAdjoint(expiry, tenor, strike, forward).Derivatives.toArray();
            double[] adjExp = FORMULA.volatilityAdjoint(forward, strike, expiry, alpha, beta, rho, nu).Derivatives.toArray();
            for (int i = 0; i < 6; ++i)
            {
                assertEquals(adjCmp[i], adjExp[i]);
            }
            SabrInterestRateParameters other = SabrInterestRateParameters.of(ALPHA_SURFACE, BETA_SURFACE, RHO_SURFACE, NU_SURFACE, FORMULA);

            assertEquals(PARAMETERS, other);
            assertEquals(PARAMETERS.GetHashCode(), other.GetHashCode());
        }
        public virtual void comparisonDupireVolTest()
        {
            double tol = 1.0e-2;
            ImpliedTrinomialTreeLocalVolatilityCalculator calc = new ImpliedTrinomialTreeLocalVolatilityCalculator(28, 1.45d, INTERP_LINEAR);

            System.Func <double, double> interestRate = (double?x) =>
            {
                return(0.03d);
            };
            System.Func <double, double> dividendRate = (double?x) =>
            {
                return(0.01d);
            };
            InterpolatedNodalSurface resTri = calc.localVolatilityFromImpliedVolatility(VOL_SURFACE, SPOT, interestRate, dividendRate);
            DeformedSurface          resDup = (new DupireLocalVolatilityCalculator()).localVolatilityFromImpliedVolatility(VOL_SURFACE, SPOT, interestRate, dividendRate);

            double[][] sampleStrikes = new double[][]
            {
                new double[] { 0.7 * SPOT, SPOT, 1.1 * SPOT, 1.4 * SPOT },
                new double[] { 0.5 * SPOT, 0.9 * SPOT, SPOT, 1.3 * SPOT, 1.9 * SPOT }
            };
            double[] sampleTimes = new double[] { 0.8, 1.1 };
            for (int i = 0; i < sampleTimes.Length; ++i)
            {
                double time = sampleTimes[i];
                foreach (double strike in sampleStrikes[i])
                {
                    double volTri = resTri.zValue(time, strike);
                    double volDup = resDup.zValue(time, strike);
                    assertEquals(volTri, volDup, tol);
                }
            }
        }
        public virtual void comparisonDupirePriceTest()
        {
            double tol = 7.0e-2;
            ImpliedTrinomialTreeLocalVolatilityCalculator calc = new ImpliedTrinomialTreeLocalVolatilityCalculator(22, 1.1d, INTERP_LINEAR);

            System.Func <double, double> interestRate = (double?x) =>
            {
                return(0.003d);
            };
            System.Func <double, double> dividendRate = (double?x) =>
            {
                return(0.01d);
            };
            InterpolatedNodalSurface resTri = calc.localVolatilityFromPrice(PRICE_SURFACE, SPOT, interestRate, dividendRate);
            DeformedSurface          resDup = (new DupireLocalVolatilityCalculator()).localVolatilityFromPrice(PRICE_SURFACE, SPOT, interestRate, dividendRate);

            // limited range due to interpolation/extrapolation of price surface -> negative call/put price reached
            double[][] sampleStrikes = new double[][]
            {
                new double[] { 0.95 * SPOT, 1.05 * SPOT },
                new double[] { 0.9 * SPOT, SPOT, 1.1 * SPOT }
            };
            double[] sampleTimes = new double[] { 0.7, 1.05 };
            for (int i = 0; i < sampleTimes.Length; ++i)
            {
                double time = sampleTimes[i];
                foreach (double strike in sampleStrikes[i])
                {
                    double volTri = resTri.zValue(time, strike);
                    double volDup = resDup.zValue(time, strike);
                    assertEquals(volTri, volDup, tol);
                }
            }
        }
 public virtual void test_volatility_rate()
 {
     for (int i = 0; i < NB_TEST; i++)
     {
         double timeToExpiry = VOL_SIMPLE_MONEY_RATE.relativeTime(TEST_EXPIRY[i]);
         double volExpected  = PARAMETERS_RATE.zValue(timeToExpiry, TEST_FUTURE_PRICE[i] - TEST_STRIKE_PRICE[i]);
         double volComputed  = VOL_SIMPLE_MONEY_RATE.volatility(TEST_EXPIRY[i], TEST_FIXING[i], TEST_STRIKE_PRICE[i], TEST_FUTURE_PRICE[i]);
         assertEquals(volComputed, volExpected, TOLERANCE_VOL);
     }
 }
        // ----------     price     ----------
        public virtual void price_from_future_price()
        {
            IborIndexRates      mockIbor = mock(typeof(IborIndexRates));
            SimpleRatesProvider prov     = new SimpleRatesProvider();

            prov.IborRates = mockIbor;
            when(mockIbor.rate(OPTION.UnderlyingFuture.IborRate.Observation)).thenReturn(RATE);

            double futurePrice                = 0.9875;
            double strike                     = OPTION.StrikePrice;
            double timeToExpiry               = ACT_365F.relativeYearFraction(VAL_DATE, OPTION.ExpiryDate);
            double priceSimpleMoneyness       = strike - futurePrice;
            double normalVol                  = PARAMETERS_PRICE.zValue(timeToExpiry, priceSimpleMoneyness);
            EuropeanVanillaOption option      = EuropeanVanillaOption.of(strike, timeToExpiry, OPTION.PutCall);
            NormalFunctionData    normalPoint = NormalFunctionData.of(futurePrice, 1.0, normalVol);
            double optionPriceExpected        = NORMAL_FUNCTION.getPriceFunction(option).apply(normalPoint);
            double optionPriceComputed        = OPTION_PRICER.price(OPTION, prov, VOL_SIMPLE_MONEY_PRICE, futurePrice);

            assertEquals(optionPriceComputed, optionPriceExpected, TOLERANCE_PRICE);
        }