/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.impl.volatility.smile; import static com.opengamma.strata.product.common.PutCall.CALL; import static org.testng.Assert.assertEquals; import org.testng.annotations.Test; import com.opengamma.strata.pricer.impl.option.EuropeanVanillaOption; /** * Test case for SABR volatility function providers. */ @Test public abstract class SabrVolatilityFunctionProviderTestCase { private static final double K = 105; private static final double T = 1.5; protected static final double FORWARD = 103; protected static final EuropeanVanillaOption OPTION = EuropeanVanillaOption.of(K, T, CALL); protected static final SabrFormulaData LOG_NORMAL_EQUIVALENT = SabrFormulaData.of(0.8, 1, 0.5, 0); protected static final SabrFormulaData APPROACHING_LOG_NORMAL_EQUIVALENT1 = SabrFormulaData.of(0.8, 1, 0.5, 1e-6); protected static final SabrFormulaData APPROACHING_LOG_NORMAL_EQUIVALENT2 = SabrFormulaData.of(0.8, 1 + 1e-6, 0.5, 0); protected static final SabrFormulaData APPROACHING_LOG_NORMAL_EQUIVALENT3 = SabrFormulaData.of(0.8, 1 - 1e-6, 0.5, 0); protected abstract VolatilityFunctionProvider<SabrFormulaData> getFunction(); @Test(expectedExceptions = IllegalArgumentException.class) public void testNullData() { getFunction().volatility(FORWARD, K, T, null); } @Test public void testLogNormalEquivalent() { assertEquals(getFunction().volatility(FORWARD, K, T, LOG_NORMAL_EQUIVALENT), LOG_NORMAL_EQUIVALENT.getAlpha(), 0); } @Test public void testApproachingLogNormalEquivalent1() { assertEquals(getFunction().volatility(FORWARD, K, T, APPROACHING_LOG_NORMAL_EQUIVALENT1), LOG_NORMAL_EQUIVALENT.getAlpha(), 1e-5); } @Test public void testApproachingLogNormalEquivalent2() { assertEquals(getFunction().volatility(FORWARD, K, T, APPROACHING_LOG_NORMAL_EQUIVALENT2), LOG_NORMAL_EQUIVALENT.getAlpha(), 1e-5); } @Test public void testApproachingLogNormalEquivalent3() { assertEquals(getFunction().volatility(FORWARD, K, T, 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 }