/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate; import java.util.HashMap; import java.util.Map; import java.util.Set; import com.opengamma.analytics.math.matrix.DoubleMatrix1D; import com.opengamma.analytics.math.matrix.DoubleMatrix2D; import com.opengamma.analytics.math.matrix.MatrixAlgebra; import com.opengamma.analytics.math.matrix.MatrixAlgebraFactory; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.DoublesPair; /** * Computes sensitivity to Black volatilities from SABR sensitivities and the SABR parameters sensitivities to calibration volatilities. */ public class BlackSensitivityFromSABRSensitivityCalculator { /** * The implementation of the matrix algebra used. */ private static final MatrixAlgebra ALGEBRA = MatrixAlgebraFactory.OG_ALGEBRA; /** * Computes the sensitivities to Black volatilities from the sensitivities to SABR parameters. * The SABR sensitivities are the node sensitivities to the same grid points as the Black volatilities and the inverseJacobian provided. * @param sabrSensitivity The node SABR sensitivities. * @param inverseJacobianMap The inverse Jacobian for each node point. * @return The Black sensitivity. */ public static Map<DoublesPair, DoubleMatrix1D> blackSensitivity(final PresentValueSABRSensitivityDataBundle sabrSensitivity, final Map<DoublesPair, DoubleMatrix2D> inverseJacobianMap) { final Set<DoublesPair> alphaSet = sabrSensitivity.getAlpha().getMap().keySet(); final Set<DoublesPair> ijSet = inverseJacobianMap.keySet(); ArgumentChecker.isTrue(alphaSet.equals(ijSet), "Point of SABR sensitivity and inverse Jacobian are not the same."); final HashMap<DoublesPair, DoubleMatrix1D> result = new HashMap<>(); for (final DoublesPair expiryMaturity : sabrSensitivity.getAlpha().getMap().keySet()) { final double alphaSensitivity = sabrSensitivity.getAlpha().getMap().get(expiryMaturity); final double betaSensitivity = sabrSensitivity.getBeta().getMap().get(expiryMaturity); final double rhoSensitivity = sabrSensitivity.getRho().getMap().get(expiryMaturity); final double nuSensitivity = sabrSensitivity.getNu().getMap().get(expiryMaturity); final DoubleMatrix1D sabrPointSensitivity = new DoubleMatrix1D(alphaSensitivity, betaSensitivity, rhoSensitivity, nuSensitivity); final DoubleMatrix2D inverseJacobian = inverseJacobianMap.get(expiryMaturity); final DoubleMatrix1D blackPointSensitivity = (DoubleMatrix1D) ALGEBRA.multiply(sabrPointSensitivity, inverseJacobian); result.put(expiryMaturity, blackPointSensitivity); } return result; } }