/**
* 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.financial.model.interestrate.curve.ForwardCurve;
import com.opengamma.analytics.math.surface.Surface;
/**
*
*/
public abstract class BlackVolatilitySurfaceConverter {
private static final SurfaceConverter CAL = SurfaceConverter.getInstance();
//********************************
//Conversion to delta surface
//********************************
public static BlackVolatilitySurfaceDelta toDeltaSurface(final BlackVolatilitySurfaceLogMoneyness from) {
Surface<Double, Double, Double> surf = CAL.logMoneynessToDelta(from.getSurface());
return new BlackVolatilitySurfaceDelta(surf, from.getForwardCurve());
}
public static BlackVolatilitySurfaceDelta toDeltaSurface(final BlackVolatilitySurfaceMoneyness from) {
Surface<Double, Double, Double> surf = CAL.moneynessToDelta(from.getSurface());
return new BlackVolatilitySurfaceDelta(surf, from.getForwardCurve());
}
public static BlackVolatilitySurfaceDelta toDeltaSurface(final BlackVolatilitySurfaceStrike from, final ForwardCurve forwardCurve) {
Surface<Double, Double, Double> surf = CAL.strikeToDelta(from.getSurface(), forwardCurve);
return new BlackVolatilitySurfaceDelta(surf, forwardCurve);
}
//********************************
//Conversion to log-moneyness surface
//********************************
public static BlackVolatilitySurfaceLogMoneyness toLogMoneynessSurface(final BlackVolatilitySurfaceDelta from) {
Surface<Double, Double, Double> surf = CAL.deltaToLogMoneyness(from.getSurface());
return new BlackVolatilitySurfaceLogMoneyness(surf, from.getForwardCurve());
}
public static BlackVolatilitySurfaceLogMoneyness toLogMoneynessSurface(final BlackVolatilitySurfaceMoneyness from) {
Surface<Double, Double, Double> surf = CAL.moneynessToLogMoneyness(from.getSurface());
return new BlackVolatilitySurfaceLogMoneyness(surf, from.getForwardCurve());
}
public static BlackVolatilitySurfaceLogMoneyness toLogMoneynessSurface(final BlackVolatilitySurfaceStrike from, final ForwardCurve fwdCurve) {
Surface<Double, Double, Double> surf = CAL.strikeToLogMoneyness(from.getSurface(), fwdCurve);
return new BlackVolatilitySurfaceLogMoneyness(surf, fwdCurve);
}
//********************************
//Conversion to moneyness surface
//********************************
public static BlackVolatilitySurfaceMoneyness toMoneynessSurface(final BlackVolatilitySurfaceDelta from) {
Surface<Double, Double, Double> surf = CAL.deltaToMoneyness(from.getSurface());
return new BlackVolatilitySurfaceMoneyness(surf, from.getForwardCurve());
}
public static BlackVolatilitySurfaceMoneyness toMoneynessSurface(final BlackVolatilitySurfaceLogMoneyness from) {
Surface<Double, Double, Double> surf = CAL.logMoneynessToMoneyness(from.getSurface());
return new BlackVolatilitySurfaceMoneyness(surf, from.getForwardCurve());
}
public static BlackVolatilitySurfaceMoneyness toMoneynessSurface(final BlackVolatilitySurfaceStrike from, final ForwardCurve fwdCurve) {
Surface<Double, Double, Double> surf = CAL.strikeToMoneyness(from.getSurface(), fwdCurve);
return new BlackVolatilitySurfaceMoneyness(surf, fwdCurve);
}
//********************************
// Conversion to strike surface
//********************************
public static BlackVolatilitySurfaceStrike toStrikeSurface(final BlackVolatilitySurfaceDelta from) {
final Surface<Double, Double, Double> surf = CAL.deltaToStrike(from.getSurface(), from.getForwardCurve());
return new BlackVolatilitySurfaceStrike(surf);
}
public static BlackVolatilitySurfaceStrike toStrikeSurface(final BlackVolatilitySurfaceMoneyness from) {
Surface<Double, Double, Double> surf = CAL.moneynessToStrike(from.getSurface(), from.getForwardCurve());
return new BlackVolatilitySurfaceStrike(surf);
}
public static BlackVolatilitySurfaceStrike toStrikeSurface(final BlackVolatilitySurfaceLogMoneyness from) {
Surface<Double, Double, Double> surf = CAL.logMoneynessToStrike(from.getSurface(), from.getForwardCurve());
return new BlackVolatilitySurfaceStrike(surf);
}
//********************************
// Finding of single points
//********************************
public static double strikeForDelta(final double delta, final BlackVolatilitySurfaceStrike strikeSurface, final ForwardCurve fwdCurve, final double t) {
final BlackVolatilitySurfaceLogMoneyness logMSurf = toLogMoneynessSurface(strikeSurface, fwdCurve);
final double x = CAL.getlogMoneynessForDelta(delta, logMSurf.getSurface(), t);
return fwdCurve.getForward(t) * Math.exp(x);
}
public static double deltaForStrike(final double strike, final BlackVolatilitySurfaceDelta deltaSurface, final double t) {
final double fwd = deltaSurface.getForwardCurve().getForward(t);
final double x = Math.log(strike / fwd);
return CAL.getDeltaForLogMoneyness(x, deltaSurface.getSurface(), t);
}
}