/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.description.interestrate;
import java.util.List;
import java.util.Set;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.model.volatility.smile.function.SSVIVolatilityFunction;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity;
import com.opengamma.analytics.math.curve.DoublesCurve;
import com.opengamma.analytics.math.differentiation.ValueDerivatives;
import com.opengamma.util.tuple.DoublesPair;
/**
* Implementation of Black implied volatility for STIR futures with volatility given by a SSVI formula.
*/
public class BlackStirFuturesSsviPriceConstantProvider implements BlackStirFuturesSsviPriceProvider {
/**
* The multicurve provider.
*/
private final MulticurveProviderInterface _multicurve;
/**
* The Black ATM implied volatility curve.
*/
private final DoublesCurve _volatilityAtm;
/** The rho parameter of the SSVI formula. **/
private final double _rho;
/** The eta parameter of the SSVI formula. **/
private final double _eta;
/**
* The Ibor Index of the futures on for which the Black data is valid, i.e. the data is calibrated to futures on the given index.
*/
private final IborIndex _index;
/**
* Constructor.
* @param multicurve The multi-curve provider.
* @param volatilityAtm The ATM imoplied volatility curve.
* @param rho The rho parameter.
* @param eta The eta parameter.
* @param index The Ibor Index of the futures on for which the Black data is valid.
*/
public BlackStirFuturesSsviPriceConstantProvider(
MulticurveProviderInterface multicurve,
DoublesCurve volatilityAtm,
double rho,
double eta,
IborIndex index) {
this._multicurve = multicurve;
this._volatilityAtm = volatilityAtm;
this._rho = rho;
this._eta = eta;
this._index = index;
}
@Override
public ValueDerivatives volatilityAdjoint(double expiry, double delay, double strikePrice, double futuresPrice) {
return SSVIVolatilityFunction
.volatilityAdjoint(futuresPrice, strikePrice, expiry, _volatilityAtm.getYValue(expiry), _rho, _eta);
}
@Override
public MulticurveProviderInterface getMulticurveProvider() {
return _multicurve;
}
@Override
public double[] parameterSensitivity(String name, List<DoublesPair> pointSensitivity) {
return _multicurve.parameterSensitivity(name, pointSensitivity);
}
@Override
public double[] parameterForwardSensitivity(String name, List<ForwardSensitivity> pointSensitivity) {
return _multicurve.parameterForwardSensitivity(name, pointSensitivity);
}
@Override
public Set<String> getAllCurveNames() {
return _multicurve.getAllCurveNames();
}
@Override
public BlackSTIRFuturesProviderInterface copy() {
final MulticurveProviderInterface multicurveProvider = _multicurve.copy();
return new BlackStirFuturesSsviPriceConstantProvider(multicurveProvider, _volatilityAtm, _rho, _eta, _index);
}
@Override
public double getVolatility(double expiry, double delay, double strikePrice, double futuresPrice) {
return SSVIVolatilityFunction
.volatility(futuresPrice, strikePrice, expiry, _volatilityAtm.getYValue(expiry), _rho, _eta);
}
@Override
public IborIndex getFuturesIndex() {
return _index;
}
}