/** * 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.analytics.math.function.Function1D; import com.opengamma.util.monitor.OperationTimer; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class CGMYFourierPricerTest { private static final Logger s_logger = LoggerFactory.getLogger(CGMYFourierPricerTest.class); private static final int WARMUP_CYCLES = 0; private static final int BENCHMARK_CYCLES = 1; private static final boolean TEST_TIMING = false; private static final double FORWARD = 1; private static final double T = 2.0; private static final double DF = 0.93; private static final double C = 0.03; private static final double G = 0.001; private static final double M = 1.001; private static final double Y = 1.5; private static final MartingaleCharacteristicExponent CGMY_CE = new CGMYMartingaleCharacteristicExponent(C, G, M, Y); private static final BlackImpliedVolatilityFormula BLACK_IMPLIED_VOL = new BlackImpliedVolatilityFormula(); @Test public void testCGMY() { final FourierPricer pricer = new FourierPricer(); final BlackFunctionData data = new BlackFunctionData(FORWARD, DF, 0); for (int i = 0; i < 21; i++) { final double k = 0.01 + 0.14 * i / 20.0; final EuropeanVanillaOption option = new EuropeanVanillaOption(k, T, true); final double price = pricer.price(data, option, CGMY_CE, -0.5, 1e-6); @SuppressWarnings("unused") final double impVol = BLACK_IMPLIED_VOL.getImpliedVolatility(data, option, price); //System.out.println(k + "\t" + impVol); } } //TODO nothing is being tested in here @Test public void testIntegrandCGMY() { final EuropeanPriceIntegrand integrand = new EuropeanPriceIntegrand(CGMY_CE, -0.5, true); final EuropeanVanillaOption option = new EuropeanVanillaOption(0.25 * FORWARD, T, true); final BlackFunctionData data = new BlackFunctionData(FORWARD, DF, 0.5); final Function1D<Double, Double> function = integrand.getFunction(data, option); if (TEST_TIMING) { double res = 0; for (int count = 0; count < WARMUP_CYCLES; count++) { for (int i = 0; i < 100; i++) { final double x = -15. + i * 30. / 200.0; res += function.evaluate(x); } } res *= 2; if (BENCHMARK_CYCLES > 0) { final OperationTimer timer = new OperationTimer(s_logger, "processing {} cycles on integral", BENCHMARK_CYCLES); for (int count = 0; count < BENCHMARK_CYCLES; count++) { for (int i = 0; i < 100; i++) { final double x = -15. + i * 30. / 200.0; res += function.evaluate(x); } } timer.finished(); } res *= 2; } } }