/**
* 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.apache.commons.lang.Validate;
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.smile.function.SABRHaganVolatilityFunction;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
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 SABRSurfaceFittingTest {
private static final SABRNonLinearLeastSquareFitter FITTER = new SABRNonLinearLeastSquareFitter(new SABRHaganVolatilityFunction());
@Test
public void doIt() {
final double[] maturities = new double[] {5, 1, 10, 15, 1, 5 };
final double[] tenors = new double[] {5, 5, 10, 15, 1, 10 };
final double[] forwards = new double[] {0.0424, 0.025513, 0.046213, 0.04405, 0.010482, 0.04443 };
final double[] atmVols = new double[] {0.23845, 0.36995, 0.18745, 0.162, 0.7332, 0.2177 };
final int n = maturities.length;
Validate.isTrue(n == tenors.length && n == forwards.length && n == atmVols.length);
final double[] moneynessSigma = new double[] {-2, -1, -0.5, -0.25, 0, 0.25, 0.5, 1, 2 };
final double[][] vols = new double[n][];
vols[0] = new double[] {0, 0.27, 0.253, 0.247, 0.23845, 0.238, 0.236, 0.233, 0.226 };
vols[1] = new double[] {0.653, 0.442, 0.396, 0.382, 0.36995, 0.367, 0.363, 0.363, 0.36 };
vols[2] = new double[] {0.25, 0.214, 0.2, 0.194, 0.18745, 0.186, 0.183, 0.179, 0.171 };
vols[3] = new double[] {0.224, 0.19, 0.175, 0.17, 0.162, 0.161, 0.158, 0.154, 0.15 };
vols[4] = new double[] {0, 0, 0.847, 0.776, 0.7332, 0.718, 0.707, 0.702, 0.701 };
vols[5] = new double[] {0.284, 0.247, 0.231, 0.225, 0.2177, 0.217, 0.213, 0.209, 0.207 };
final double[] alpha = new double[n];
final double[] beta = new double[n];
final double[] nu = new double[n];
final double[] rho = new double[n];
final double[] start = new double[] {0.3, 0.9, 0.3, 0.0 };
for (int i = 0; i < n; i++) {
int m = 0;
for (int j = 0; j < vols[i].length; j++) {
if (vols[i][j] > 0.0) {
m++;
}
}
final EuropeanVanillaOption[] options = new EuropeanVanillaOption[m];
final BlackFunctionData[] data = new BlackFunctionData[m];
final double[] errors = new double[m];
int p = 0;
for (int j = 0; j < vols[i].length; j++) {
if (vols[i][j] > 0.0) {
options[p] = new EuropeanVanillaOption(forwards[i] * Math.exp(atmVols[i] * Math.sqrt(maturities[i]) * moneynessSigma[j]), maturities[i], true);
data[p] = new BlackFunctionData(forwards[i], 1, vols[i][j]);
errors[p] = 0.001;
p++;
}
}
final LeastSquareResultsWithTransform result = FITTER.getFitResult(options, data, errors, start, new BitSet(4));
final DoubleMatrix1D params = result.getModelParameters();
alpha[i] = params.getEntry(0);
beta[i] = params.getEntry(1);
nu[i] = params.getEntry(2);
rho[i] = params.getEntry(3);
// System.out.print(alpha[i] + "\t" + beta[i] + "\t" + nu[i] + "\t" + rho[i] + "\t");
// for (int j = 0; j < m; j++) {
// System.out.print("\t" + strikes[j]);
// }
// System.out.print("\n");
// System.out.print("\t\t\t\t");
// for (int j = 0; j < m; j++) {
// double sabrVol = sabr.impliedVolatility(forwards[i], alpha[i], beta[i], nu[i], rho[i], strikes[j], maturities[i]);
// System.out.print("\t" + sabrVol);
// }
// System.out.print("\n");
}
}
}