/** * This calculates the sensitivity of the present value (PV) to the continuously-compounded * discount rates at the knot points of the funding curve. * * <p>The return format is a DoubleMatrix1D (i.e. a vector) with length equal to the total number * of knots in the curve * * <p>The change of a curve due to the movement of a single knot is interpolator-dependent, so an * instrument can have sensitivity to knots at times beyond its maturity * * @param swap the VarianceSwap * @param market the VarianceSwapDataBundle * @return A DoubleMatrix1D containing bucketed delta in order and length of * market.getDiscountCurve(). Currency amount per unit amount change in discount rate */ public DoubleMatrix1D calcDeltaBucketed( final VarianceSwap swap, final VarianceSwapDataBundle market) { Validate.notNull(swap, "null VarianceSwap"); Validate.notNull(market, "null VarianceSwapDataBundle"); // We know that the VarianceSwap only has true sensitivity to one maturity on one curve. // A function written for interestRate sensitivities spreads this sensitivity across yield nodes // NodeSensitivityCalculator.curveToNodeSensitivities(curveSensitivities, interpolatedCurves) // 2nd arg = LinkedHashMap<String, YieldAndDiscountCurve> interpolatedCurves final YieldAndDiscountCurve discCrv = market.getDiscountCurve(); final String discCrvName = discCrv.getCurve().getName(); final YieldCurveBundle interpolatedCurves = new YieldCurveBundle(); interpolatedCurves.setCurve(discCrvName, discCrv); // 1st arg = Map<String, List<DoublesPair>> curveSensitivities = <curveName, // List<(maturity,sensitivity)>> final double settlement = swap.getTimeToSettlement(); final Double sens = calcDiscountRateSensitivity(swap, market); final Map<String, List<DoublesPair>> curveSensitivities = new HashMap<String, List<DoublesPair>>(); curveSensitivities.put(discCrvName, Lists.newArrayList(new DoublesPair(settlement, sens))); final NodeSensitivityCalculator distributor = PresentValueNodeSensitivityCalculator.getDefaultInstance(); return distributor.curveToNodeSensitivities(curveSensitivities, interpolatedCurves); }
@Override protected PresentValueNodeSensitivityCalculator getNodeSensitivityCalculator( final ValueRequirement desiredValue) { final Double cutoff = Double.parseDouble( desiredValue.getConstraint(SABRRightExtrapolationFunction.PROPERTY_CUTOFF_STRIKE)); final Double mu = Double.parseDouble( desiredValue.getConstraint( SABRRightExtrapolationFunction.PROPERTY_TAIL_THICKNESS_PARAMETER)); return PresentValueNodeSensitivityCalculator.using( new PresentValueCurveSensitivitySABRExtrapolationCalculator(cutoff, mu)); }