* @param security The future option security.
* @param sabrData The SABR data bundle.
* @return The security price curve sensitivity.
*/
public PresentValueSABRSensitivityDataBundle priceSABRSensitivity(final InterestRateFutureOptionMarginSecurity security, final SABRSTIRFuturesProviderInterface sabrData) {
final PresentValueSABRSensitivityDataBundle sensi = new PresentValueSABRSensitivityDataBundle();
// Forward sweep
final double priceFuture = METHOD_FUTURE.price(security.getUnderlyingFuture(), sabrData.getMulticurveProvider());
final double rateStrike = 1.0 - security.getStrike();
final EuropeanVanillaOption option = new EuropeanVanillaOption(rateStrike, security.getExpirationTime(), !security.isCall());
final double forward = 1 - priceFuture;
final double delay = security.getUnderlyingFuture().getLastTradingTime() - security.getExpirationTime();
final double[] volatilityAdjoint = sabrData.getSABRParameters().getVolatilityAdjoint(security.getExpirationTime(), delay, rateStrike, forward);
final BlackFunctionData dataBlack = new BlackFunctionData(forward, 1.0, volatilityAdjoint[0]);
final double[] priceAdjoint = BLACK_FUNCTION.getPriceAdjoint(option, dataBlack);
// Backward sweep
final double priceBar = 1.0;
final double volatilityBar = priceAdjoint[2] * priceBar;
final DoublesPair expiryDelay = new DoublesPair(security.getExpirationTime(), delay);
sensi.addAlpha(expiryDelay, volatilityAdjoint[3] * volatilityBar);
sensi.addBeta(expiryDelay, volatilityAdjoint[4] * volatilityBar);
sensi.addRho(expiryDelay, volatilityAdjoint[5] * volatilityBar);
sensi.addNu(expiryDelay, volatilityAdjoint[6] * volatilityBar);
return sensi;
}