/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.option.pricing.fourier;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.BlackFunctionData;
import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.EuropeanVanillaOption;
import com.opengamma.analytics.financial.model.volatility.BlackImpliedVolatilityFormula;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class AccuracyTest {
private static final double FORWARD = 0.04;
private static final double DF = 0.96;
private static final double SIGMA = 0.2;
private static final int N_STRIKES = 21;
private static final double ALPHA = -0.5;
private static final double EPS = 1e-6;
private static final BlackImpliedVolatilityFormula BLACK_IMPLIED_VOL = new BlackImpliedVolatilityFormula();
@Test
public void testVeryShortTime() {
assertAccuracy(1 / 52.0, 0.001 * EPS, 0.0001 * EPS);
}
@Test
public void testShortTime() {
assertAccuracy(1 / 12.0, 0.01 * EPS, 0.001 * EPS);
}
@Test
public void testOneYear() {
assertAccuracy(1.0, 0.1 * EPS, 0.01 * EPS);
}
@Test
public void testLongTime() {
assertAccuracy(5.0, 0.1 * EPS, 0.01 * EPS);
}
@Test
public void testVeryLongTime() {
assertAccuracy(30.0, 1.0 * EPS, 0.1 * EPS);
}
private void assertAccuracy(final double t, final double integralTol, final double fftTol) {
final MartingaleCharacteristicExponent ce = new GaussianMartingaleCharacteristicExponent(SIGMA);
final double maxLogMoneyness = 6.0 / N_STRIKES * SIGMA * Math.sqrt(t);
final FourierPricer integralPricer = new FourierPricer();
final FFTPricer fftPricer = new FFTPricer();
final double[][] fftStrikeNprice = fftPricer.price(FORWARD, DF, t, true, ce, N_STRIKES, maxLogMoneyness, SIGMA, ALPHA, fftTol);
final BlackFunctionData data = new BlackFunctionData(FORWARD, DF, 0);
for (int i = 0; i < N_STRIKES; i++) {
final double k = fftStrikeNprice[i][0];
final double fftPrice = fftStrikeNprice[i][1];
final EuropeanVanillaOption o = new EuropeanVanillaOption(k, t, true);
final double integralPrice = integralPricer.price(data, o, ce, ALPHA, 0.1 * integralTol, false);
final double fftVol = BLACK_IMPLIED_VOL.getImpliedVolatility(data, o, fftPrice);
final double integral_vol = BLACK_IMPLIED_VOL.getImpliedVolatility(data, o, integralPrice);
assertEquals(SIGMA, integral_vol, EPS);
assertEquals(SIGMA, fftVol, EPS);
}
}
}