/**
* 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.surface;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.model.option.definition.OptionDefinition;
import com.opengamma.analytics.financial.model.option.definition.SkewKurtosisOptionDataBundle;
import com.opengamma.analytics.math.surface.ConstantDoublesSurface;
/**
*
*/
public class SkewnessKurtosisBlackScholesMertonEquivalentVolatilitySurfaceModel implements VolatilitySurfaceModel<OptionDefinition, SkewKurtosisOptionDataBundle> {
@Override
public VolatilitySurface getSurface(final OptionDefinition option, final SkewKurtosisOptionDataBundle data) {
Validate.notNull(option, "option");
Validate.notNull(data, "data");
final double s = data.getSpot();
final double t = option.getTimeToExpiry(data.getDate());
final double k = option.getStrike();
final double sigma = data.getVolatility(t, k);
final double b = data.getCostOfCarry();
final double skew = data.getAnnualizedSkew();
final double kurtosis = data.getAnnualizedFisherKurtosis();
final double d1 = (Math.log(s / k) + t * (b + sigma * sigma * 0.5)) / sigma / Math.sqrt(t);
return new VolatilitySurface(ConstantDoublesSurface.from(sigma * (1 - skew * d1 / 6 - kurtosis * (1 - d1 * d1) / 24)));
}
}