/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.volatility.smile.fitting; import java.util.BitSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.Test; import cern.jet.random.engine.MersenneTwister; import cern.jet.random.engine.RandomEngine; import com.opengamma.analytics.financial.model.volatility.smile.function.SVIFormulaData; import com.opengamma.analytics.financial.model.volatility.smile.function.SVIVolatilityFunction; import com.opengamma.analytics.financial.model.volatility.smile.function.VolatilityFunctionProvider; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class SVIModelFitterTest extends SmileModelFitterTest<SVIFormulaData> { private static Logger LOGGER = LoggerFactory.getLogger(SVIModelFitterTest.class); private static final double A = 0.1; private static final double B = 0.3; private static double RHO = -0.5; private static double NU = 0.3; private static double M = 0.2; private static RandomEngine RANDOM = new MersenneTwister(); public SVIModelFitterTest() { _chiSqEps = 1e-4; } @Override VolatilityFunctionProvider<SVIFormulaData> getModel() { return new SVIVolatilityFunction(); } @Override SVIFormulaData getModelData() { return new SVIFormulaData(A, B, RHO, NU, M); } @Override SmileModelFitter<SVIFormulaData> getFitter(double forward, double[] strikes, double timeToExpiry, double[] impliedVols, double[] error, VolatilityFunctionProvider<SVIFormulaData> model) { return new SVIModelFitter(forward, strikes, timeToExpiry, impliedVols, error, model); } @Override double[][] getStartValues() { return new double[][] { {0.1, 0.1, 0.01, 0.01, 0.0 }, {0.05, 0.05, 0, 0.3, 0.2 }, {0.2, 0.1, 0.6, 0.1, 0.3 } }; } @Override BitSet[] getFixedValues() { final BitSet[] fixed = new BitSet[3]; fixed[0] = new BitSet(); fixed[1] = new BitSet(); fixed[1].set(4); fixed[2] = new BitSet(); return fixed; } @Override Logger getlogger() { return LOGGER; } @Override double[] getRandomStartValues() { final double a = 0.5 * RANDOM.nextDouble(); final double b = 0.5 * RANDOM.nextDouble(); final double rho = 2 * RANDOM.nextDouble() - 1; final double nu = 0.5 * RANDOM.nextDouble(); final double m = 0.5 * RANDOM.nextDouble() - 0.25; return new double[] {a, b, rho, nu, m }; } }