/** * Computes the present value of a fixed coupon by discounting. * * @param cpn The coupon. * @param curves The curve bundle. * @return The present value. */ public CurrencyAmount presentValue(CouponFixed cpn, YieldCurveBundle curves) { Validate.notNull(curves); Validate.notNull(cpn); final YieldAndDiscountCurve fundingCurve = curves.getCurve(cpn.getFundingCurveName()); double pv = cpn.getAmount() * fundingCurve.getDiscountFactor(cpn.getPaymentTime()); return CurrencyAmount.of(cpn.getCurrency(), pv); }
/** * Compute the the present value curve sensitivity of a fixed coupon by discounting to a parallel * curve movement. * * @param cpn The coupon. * @param curves The curve bundle. * @return The sensitivity. */ public StringValue presentValueParallelCurveSensitivity( CouponFixed cpn, YieldCurveBundle curves) { final String curveName = cpn.getFundingCurveName(); final YieldAndDiscountCurve discountingCurve = curves.getCurve(curveName); final double time = cpn.getPaymentTime(); double sensitivity = -time * cpn.getAmount() * discountingCurve.getDiscountFactor(time); return StringValue.from(curveName, sensitivity); }
/** * Computes the present value curve sensitivity of a fixed coupon by discounting. * * @param cpn The coupon. * @param curves The curve bundle. * @return The sensitivity. */ public InterestRateCurveSensitivity presentValueCurveSensitivity( CouponFixed cpn, YieldCurveBundle curves) { final String curveName = cpn.getFundingCurveName(); final YieldAndDiscountCurve discountingCurve = curves.getCurve(curveName); final double time = cpn.getPaymentTime(); final DoublesPair s = new DoublesPair(time, -time * cpn.getAmount() * discountingCurve.getDiscountFactor(time)); final List<DoublesPair> list = new ArrayList<DoublesPair>(); list.add(s); final Map<String, List<DoublesPair>> result = new HashMap<String, List<DoublesPair>>(); result.put(curveName, list); return new InterestRateCurveSensitivity(result); }
@Test /** Test the cap/floor/forward parity above the cut-off strike. */ public void presentValueCapFloorParityAboveCutOff() { final CurrencyAmount priceCap = METHOD.presentValue(CAP_HIGH_LONG, SABR_BUNDLE); final CurrencyAmount priceFloor = METHOD.presentValue(FLOOR_HIGH_SHORT, SABR_BUNDLE); final double priceCouponStrike = COUPON_STRIKE_HIGH.accept(PVC, CURVES); final double priceCouponIbor = COUPON_IBOR.accept(PVC, CURVES); assertEquals( "Cap/floor: SABR with extrapolation pricing: cap/floor parity", priceCouponIbor - priceCouponStrike, priceCap.getAmount() + priceFloor.getAmount(), 1E-2); }
/** * Computes the present value of the fixed coupon with positive notional (abs(notional) is used) * by discounting. * * @param cpn The coupon. * @param curves The curve bundle. * @return The present value. */ public CurrencyAmount presentValuePositiveNotional(CouponFixed cpn, YieldCurveBundle curves) { Validate.notNull(curves); Validate.notNull(cpn); final YieldAndDiscountCurve fundingCurve = curves.getCurve(cpn.getFundingCurveName()); double pv = cpn.getPaymentYearFraction() * Math.abs(cpn.getNotional()) * cpn.getFixedRate() * fundingCurve.getDiscountFactor(cpn.getPaymentTime()); return CurrencyAmount.of(cpn.getCurrency(), pv); }
@Override public Map<String, List<DoublesPair>> visitCouponFixed( final CouponFixed payment, final YieldCurveBundle data) { return visitFixedPayment(payment.toPaymentFixed(), data); }