/**
* 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.BitSet;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.model.option.DistributionFromImpliedVolatility;
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.smile.function.SABRFormulaData;
import com.opengamma.analytics.financial.model.volatility.smile.function.SABRHaganVolatilityFunction;
import com.opengamma.analytics.financial.model.volatility.smile.function.SVIFormulaData;
import com.opengamma.analytics.financial.model.volatility.smile.function.SVIVolatilityFunction;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.statistics.distribution.ProbabilityDistribution;
import com.opengamma.analytics.math.statistics.leastsquare.LeastSquareResultsWithTransform;
import com.opengamma.util.test.TestGroup;
/**
* @deprecated This class tests deprecated functionality
*/
@Deprecated
@Test(groups = TestGroup.UNIT)
public class SVIPDFTest {
private static final double A = 0.1;
private static final double B = 0.3;
private static final double RHO = 0.4;
private static final double SIGMA = 0.4;
private static final double M = 0.04;
private static final double F = 0.04;
private static final double T = 2.5;
private static final SVIFormulaData DATA = new SVIFormulaData(A, B, RHO, SIGMA, M);
//private static final ProbabilityDistribution<Double> SVI_DIST;
private static final Function1D<Double, Double> SVI = new Function1D<Double, Double>() {
final SVIVolatilityFunction svi = new SVIVolatilityFunction();
@SuppressWarnings("synthetic-access")
@Override
public Double evaluate(final Double k) {
final EuropeanVanillaOption option = new EuropeanVanillaOption(k, T, true);
return svi.getVolatilityFunction(option, F).evaluate(DATA);
}
};
// static {
// SVI_DIST = new DistributionFromImpliedVolatility(F, T, SVI);
// }
@SuppressWarnings("unused")
@Test
public void testSABR() {
final double[] strikes = new double[] {0.02, 0.03, 0.035, 0.0375, 0.04, 0.0425, 0.045, 0.05, 0.06 };
final int n = strikes.length;
// final double[] vols = new double[n];
final double[] errors = new double[n];
final BlackFunctionData[] data = new BlackFunctionData[n];
final EuropeanVanillaOption[] options = new EuropeanVanillaOption[n];
for (int i = 0; i < n; i++) {
errors[i] = 0.001;
data[i] = new BlackFunctionData(F, 1, SVI.evaluate(strikes[i]));
options[i] = new EuropeanVanillaOption(strikes[i], T, true);
}
final double[] initialValues = new double[] {0.04, 1, -0.3, 0.2 };
final BitSet fixed = new BitSet();
final SABRHaganVolatilityFunction sabr = new SABRHaganVolatilityFunction();
final SABRNonLinearLeastSquareFitter fitter = new SABRNonLinearLeastSquareFitter(sabr);
final LeastSquareResultsWithTransform result = fitter.getFitResult(options, data, errors, initialValues, fixed);
final double chiSqr = result.getChiSq();
final DoubleMatrix1D params = result.getModelParameters();
final SABRFormulaData fittedData = new SABRFormulaData(params.getEntry(0), params.getEntry(1), params.getEntry(2), params.getEntry(3));
final Function1D<Double, Double> sabrFunction = new Function1D<Double, Double>() {
@Override
public Double evaluate(final Double k) {
final EuropeanVanillaOption option = new EuropeanVanillaOption(k, T, true);
return sabr.getVolatilityFunction(option, F).evaluate(fittedData);
}
};
final ProbabilityDistribution<Double> sabrDist = new DistributionFromImpliedVolatility(F, T, sabrFunction);
for (int i = 0; i < 100; i++) {
final double k = 0.001 + i * 0.1 / 100;
final double vol = sabrFunction.evaluate(k);
final double pdf = sabrDist.getPDF(k);
final double cdf = sabrDist.getCDF(k);
}
//TODO this test does nothing
}
}