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); }