/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.volatility.surface;
import com.opengamma.analytics.math.surface.Surface;
import com.opengamma.util.tuple.DoublesPair;
/**
* A surface with gives Black (implied) volatility as a function of time to maturity and value some abstraction of strike
* @param <T> Parameter that describes the abstraction of strike - this could be the actual strike, the delta (most commonly used in FX), moneyness (defined as the strike/forward),
* the logarithm of moneyness or some other parameterisation
*/
public abstract class BlackVolatilitySurface<T extends StrikeType> extends VolatilitySurface {
/**
* @param surface The time to maturity should be the first coordinate and the abstraction of strike the second
*/
public BlackVolatilitySurface(final Surface<Double, Double, Double> surface) {
super(surface);
}
public double getVolatility(final double t, final T s) {
final DoublesPair temp = DoublesPair.of(t, s.value());
return getVolatility(temp);
}
@Override
public abstract double getVolatility(final double t, final double k);
public abstract double getAbsoluteStrike(final double t, final T s);
public abstract BlackVolatilitySurface<T> withShift(final double shift, final boolean useAdditive);
public abstract BlackVolatilitySurface<T> withSurface(Surface<Double, Double, Double> surface);
public abstract <S, U> U accept(final BlackVolatilitySurfaceVisitor<S, U> visitor, final S data);
public abstract <U> U accept(final BlackVolatilitySurfaceVisitor<?, U> visitor);
@Override
public VolatilitySurface withParallelShift(final double shift) {
return withSurface(getParallelShiftedSurface(shift));
}
@Override
public VolatilitySurface withSingleAdditiveShift(final double x, final double y, final double shift) {
return withSurface(getSingleAdditiveShiftSurface(x, y, shift));
}
@Override
public VolatilitySurface withMultipleAdditiveShifts(final double[] x, final double[] y, final double[] shifts) {
return withSurface(getMultipleAdditiveShiftsSurface(x, y, shifts));
}
@Override
public VolatilitySurface withConstantMultiplicativeShift(final double shift) {
return withSurface(getConstantMultiplicativeShiftSurface(shift));
}
@Override
public VolatilitySurface withSingleMultiplicativeShift(final double x, final double y, final double shift) {
return withSurface(getSingleMultiplicativeShiftSurface(x, y, shift));
}
@Override
public VolatilitySurface withMultipleMultiplicativeShifts(final double[] x, final double[] y, final double[] shifts) {
return withSurface(getMultipleMultiplicativeShiftsSurface(x, y, shifts));
}
}