/** * 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 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.math.statistics.leastsquare.LeastSquareResultsWithTransform; /** * An interface for least-square fitting of option data to smile models * */ public abstract class LeastSquareSmileFitter { public abstract LeastSquareResultsWithTransform getFitResult(final EuropeanVanillaOption[] options, BlackFunctionData[] data, double[] errors, final double[] initialFitParameters, final BitSet fixed); public abstract LeastSquareResultsWithTransform getFitResult(final EuropeanVanillaOption[] options, BlackFunctionData[] data, final double[] initialFitParameters, final BitSet fixed); protected void testData(final EuropeanVanillaOption[] options, final BlackFunctionData[] data, final double[] errors, final double[] initialFitParameters, final BitSet fixed, final int nParameters) { Validate.notEmpty(options, "options"); final int n = options.length; Validate.notNull(data, "data"); Validate.isTrue(data.length == n, "Black function data array must be the same length as option array"); if (errors != null) { Validate.isTrue(errors.length == n, "Error array length must be the same as the option array length"); } Validate.notNull(initialFitParameters, "initial values"); Validate.isTrue(initialFitParameters.length == nParameters, "must have length of initial values array equal to number of parameters"); Validate.notNull(fixed, "fixed"); final double t = options[0].getTimeToExpiry(); final double fwd = data[0].getForward(); final double df = data[0].getDiscountFactor(); for (int i = 1; i < n; i++) { Validate.isTrue(Double.doubleToLongBits(options[i].getTimeToExpiry()) == Double.doubleToLongBits(t), "options not all at same time horizon"); Validate.isTrue(Double.doubleToLongBits(data[i].getForward()) == Double.doubleToLongBits(fwd), "options don't all have same forward"); Validate.isTrue(Double.doubleToLongBits(data[i].getDiscountFactor()) == Double.doubleToLongBits(df), "options don't all have same discount factors"); } } }