/** * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.volatility; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.EuropeanVanillaOption; import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.NormalFunctionData; import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.NormalPriceFunction; import com.opengamma.util.test.TestGroup; /** * Tests {@link NormalFromBlackImpliedVolatilityFormula}. */ @Test(groups = TestGroup.UNIT) public class NormalFromBlackImpliedVolatilityFormulaTest { private static final double FORWARD = 100.0; private static final double DF = 0.87; private static final double T = 4.5; private static final int N = 10; private static final double[] STRIKES = new double[N]; private static final double[] STRIKES_ATM = new double[N]; private static final EuropeanVanillaOption[] OPTIONS = new EuropeanVanillaOption[N]; private static final double[] SIGMA_BLACK = new double[N]; private static final NormalPriceFunction FUNCTION_PRICE_NORMAL = new NormalPriceFunction(); static { for (int i = 0; i < N; i++) { STRIKES[i] = FORWARD + (-0.5d * N + i) * 10.0d; STRIKES_ATM[i] = FORWARD + (-0.5d * N + i) / 100.0d; SIGMA_BLACK[i] = 0.20 + i / 100.0d; OPTIONS[i] = new EuropeanVanillaOption(STRIKES[i], T, true); } } private static final double TOLERANCE_PRICE = 1.0E-4; @Test(expectedExceptions = IllegalArgumentException.class) public void wrong_strike() { NormalImpliedVolatilityFormula.impliedVolatilityFromBlackApproximated(FORWARD, -1.0d, T, 0.20d); } @Test(expectedExceptions = IllegalArgumentException.class) public void wrong_forward() { NormalImpliedVolatilityFormula.impliedVolatilityFromBlackApproximated(-1.0d, FORWARD, T, 0.20d); } @Test public void price_comparison() { priceCheck(STRIKES); priceCheck(STRIKES_ATM); } private void priceCheck(double[] strikes) { for (int i = 0; i < N; i++) { double ivNormalComputed = NormalImpliedVolatilityFormula .impliedVolatilityFromBlackApproximated(FORWARD, strikes[i], T, SIGMA_BLACK[i]); EuropeanVanillaOption o = new EuropeanVanillaOption(strikes[i], T, true); NormalFunctionData d = new NormalFunctionData(FORWARD, DF, ivNormalComputed); double priceNormalComputed = FUNCTION_PRICE_NORMAL.getPriceFunction(o).evaluate(d); double priceBlack = BlackFormulaRepository.price(FORWARD, strikes[i], T, SIGMA_BLACK[i], true) * DF; assertEquals(priceBlack, priceNormalComputed, TOLERANCE_PRICE); } } }