/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.volatility.smile.function; 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.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public abstract class SABRVolatilityFunctionTestCase { private static final double K = 105; private static final double T = 1.5; protected static final double FORWARD = 103; protected static final EuropeanVanillaOption OPTION = new EuropeanVanillaOption(K, T, true); protected static final SABRFormulaData LOG_NORMAL_EQUIVALENT = new SABRFormulaData(0.8, 1, 0.5, 0); protected static final SABRFormulaData APPROACHING_LOG_NORMAL_EQUIVALENT1 = new SABRFormulaData(0.8, 1, 0.5, 1e-6); protected static final SABRFormulaData APPROACHING_LOG_NORMAL_EQUIVALENT2 = new SABRFormulaData(0.8, 1 + 1e-6, 0.5, 0); protected static final SABRFormulaData APPROACHING_LOG_NORMAL_EQUIVALENT3 = new SABRFormulaData(0.8, 1 - 1e-6, 0.5, 0); protected abstract VolatilityFunctionProvider<SABRFormulaData> getFunction(); @Test(expectedExceptions = IllegalArgumentException.class) public void testNullOption() { getFunction().getVolatilityFunction(null, FORWARD); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullData() { getFunction().getVolatilityFunction(OPTION, FORWARD).evaluate((SABRFormulaData) null); } @Test public void testLogNormalEquivalent() { assertEquals(getFunction().getVolatilityFunction(OPTION, FORWARD).evaluate(LOG_NORMAL_EQUIVALENT), LOG_NORMAL_EQUIVALENT.getAlpha(), 0); } @Test public void testApproachingLogNormalEquivalent1() { assertEquals(getFunction().getVolatilityFunction(OPTION, FORWARD).evaluate(APPROACHING_LOG_NORMAL_EQUIVALENT1), LOG_NORMAL_EQUIVALENT.getAlpha(), 1e-5); } @Test public void testApproachingLogNormalEquivalent2() { assertEquals(getFunction().getVolatilityFunction(OPTION, FORWARD).evaluate(APPROACHING_LOG_NORMAL_EQUIVALENT2), LOG_NORMAL_EQUIVALENT.getAlpha(), 1e-5); } @Test public void testApproachingLogNormalEquivalent3() { assertEquals(getFunction().getVolatilityFunction(OPTION, FORWARD).evaluate(APPROACHING_LOG_NORMAL_EQUIVALENT3), LOG_NORMAL_EQUIVALENT.getAlpha(), 1e-5); } //TODO need to fill in tests //TODO beta = 1 nu = 0 => Black equivalent volatility //TODO beta = 0 nu = 0 => Bachelier //TODO beta != 0 nu = 0 => CEV }