/**
* 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.fitting;
import java.util.Arrays;
import java.util.BitSet;
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.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public abstract class LeastSquareSmileFitterTestCase {
// static final double VARIANCE = 0.3;
static final double T = 1.3;
static final double SIGMA = 0.3;// Math.sqrt(VARIANCE / T);
static final double ERROR = 0.00001; //0.1 bps error
static final EuropeanVanillaOption[] OPTIONS;
static final double FORWARD = 100;
static final double DF = 1;
static final BlackFunctionData[] FLAT_DATA;
static final double[] ERRORS;
static final BitSet FIXED = new BitSet();
static final double EPS = 1e-3;
static {
final int n = 10;
final double kStart = 50;
final double delta = 100 / (n - 1);
OPTIONS = new EuropeanVanillaOption[n];
FLAT_DATA = new BlackFunctionData[n];
ERRORS = new double[n];
for (int i = 0; i < n; i++) {
OPTIONS[i] = new EuropeanVanillaOption(kStart + i * delta, T, true);
FLAT_DATA[i] = new BlackFunctionData(FORWARD, DF, SIGMA);
ERRORS[i] = ERROR;
}
}
protected abstract LeastSquareSmileFitter getFitter();
protected abstract double[] getInitialValues();
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullOptions() {
getFitter().getFitResult(null, FLAT_DATA, ERRORS, getInitialValues(), FIXED);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyOptions() {
getFitter().getFitResult(new EuropeanVanillaOption[0], FLAT_DATA, ERRORS, getInitialValues(), FIXED);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullData() {
getFitter().getFitResult(OPTIONS, null, ERRORS, getInitialValues(), FIXED);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongLengthData() {
getFitter().getFitResult(OPTIONS, new BlackFunctionData[] {new BlackFunctionData(FORWARD, DF, SIGMA) }, ERRORS, getInitialValues(), FIXED);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongLengthErrors() {
getFitter().getFitResult(OPTIONS, FLAT_DATA, new double[] {1, 1, 1, 1 }, getInitialValues(), FIXED);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullInitialValues() {
getFitter().getFitResult(OPTIONS, FLAT_DATA, ERRORS, null, FIXED);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongLengthInitialValues() {
getFitter().getFitResult(OPTIONS, FLAT_DATA, ERRORS, new double[] {1, 1, 1, 1, 1, 1, 1 }, FIXED);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullFixed() {
getFitter().getFitResult(OPTIONS, FLAT_DATA, ERRORS, getInitialValues(), null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongMaturity() {
final EuropeanVanillaOption[] options = Arrays.copyOf(OPTIONS, OPTIONS.length);
options[5] = new EuropeanVanillaOption(OPTIONS[5].getStrike(), OPTIONS[5].getTimeToExpiry() + 0.05, OPTIONS[5].isCall());
getFitter().getFitResult(options, FLAT_DATA, ERRORS, getInitialValues(), FIXED);
}
}