/**
* 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 static org.testng.AssertJUnit.assertEquals;
import java.util.Arrays;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.model.volatility.smile.fitting.sabr.PiecewiseSABRFitterRootFinder;
import com.opengamma.analytics.financial.model.volatility.smile.function.SABRFormulaData;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class PiecewiseSABRFitterRootFinderTest {
private static final double FORWARD = 1172.011012;
private static final double EXPIRY = 1.5;
private static final double[] STRIKES = new double[] {782.9777301, 982.3904005, 1242.99164, 1547.184937, 1854.305534 };
private static final double[] VOLS = new double[] {0.311, 0.288, 0.267, 0.271, 0.276 };
private static final PiecewiseSABRFitterRootFinder FITTER = new PiecewiseSABRFitterRootFinder();
@Test
(enabled = false)
public void test() {
final Function1D<Double, Double> smile = FITTER.getVolatilityFunction(FORWARD, STRIKES, EXPIRY, VOLS);
//double vol = fitter.getVol(1550);
for (int i = 0; i < 200; i++) {
final double k = 700 + 1300 * i / 199.;
final double vol = smile.evaluate(k);
System.out.println(k + "\t" + vol);
}
}
@Test
(enabled = false)
public void bumpTest() {
final double bump = 5e-3;
final int index = 1;
final double[] vols = Arrays.copyOf(VOLS, VOLS.length);
vols[index] += bump;
final SABRFormulaData[] parms = FITTER.getFittedfModelParameters(FORWARD, STRIKES, EXPIRY, vols);
for (final SABRFormulaData parm : parms) {
System.out.println(parm.toString());
}
final Function1D<Double, Double> smile = FITTER.getVolatilityFunction(FORWARD, STRIKES, EXPIRY, vols);
//double vol = fitter.getVol(1550);
for (int i = 0; i < 200; i++) {
final double k = 700 + 1300 * i / 199.;
final double vol = smile.evaluate(k);
System.out.println(k + "\t" + vol);
}
}
@Test
(enabled = false)
public void flatTest() {
final int n = STRIKES.length;
final double[] vols = new double[n];
Arrays.fill(vols, 0.2);
final Function1D<Double, Double> smile = FITTER.getVolatilityFunction(FORWARD, STRIKES, EXPIRY, vols);
//double vol = fitter.getVol(1550);
for (int i = 0; i < 200; i++) {
final double k = 700 + 1300 * i / 199.;
final double vol = smile.evaluate(k);
assertEquals(0.2, vol, 1e-9);
}
}
}