/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.payments.method;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.analytics.financial.interestrate.InterestRateCurveSensitivity;
import com.opengamma.analytics.financial.interestrate.ParRateCalculator;
import com.opengamma.analytics.financial.interestrate.ParRateCurveSensitivityCalculator;
import com.opengamma.analytics.financial.interestrate.PresentValueCurveSensitivityCalculator;
import com.opengamma.analytics.financial.interestrate.YieldCurveBundle;
import com.opengamma.analytics.financial.interestrate.method.PricingMethod;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponCMS;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.definition.HullWhiteOneFactorPiecewiseConstantDataBundle;
import com.opengamma.util.money.CurrencyAmount;
/**
* Pricing and sensitivities of a CMS coupon by discounting (no convexity adjustment).
* @deprecated {@link YieldCurveBundle} is deprecated
*/
@Deprecated
public final class CouponCMSDiscountingMethod implements PricingMethod {
/**
* The method unique instance.
*/
private static final CouponCMSDiscountingMethod INSTANCE = new CouponCMSDiscountingMethod();
/**
* Return the unique instance of the class.
* @return The instance.
*/
public static CouponCMSDiscountingMethod getInstance() {
return INSTANCE;
}
/**
* Private constructor.
*/
private CouponCMSDiscountingMethod() {
}
/**
* Compute the present value of a CMS coupon by discounting (no convexity adjustment).
* @param cmsCoupon The CMS coupon.
* @param curves The yield curves. Should contain the discounting and forward curves associated.
* @return The coupon price.
*/
public CurrencyAmount presentValue(final CouponCMS cmsCoupon, final YieldCurveBundle curves) {
Validate.notNull(cmsCoupon);
Validate.notNull(curves);
final ParRateCalculator parRate = ParRateCalculator.getInstance();
final double swapRate = parRate.visitFixedCouponSwap(cmsCoupon.getUnderlyingSwap(), curves);
final YieldAndDiscountCurve fundingCurve = curves.getCurve(cmsCoupon.getFundingCurveName());
final double paymentDiscountFactor = fundingCurve.getDiscountFactor(cmsCoupon.getPaymentTime());
final double pv = swapRate * cmsCoupon.getPaymentYearFraction() * cmsCoupon.getNotional() * paymentDiscountFactor;
return CurrencyAmount.of(cmsCoupon.getCurrency(), pv);
}
@Override
public CurrencyAmount presentValue(final InstrumentDerivative instrument, final YieldCurveBundle curves) {
Validate.isTrue(instrument instanceof CouponCMS, "Coupon CMS");
Validate.isTrue(curves instanceof HullWhiteOneFactorPiecewiseConstantDataBundle, "Hull-White data");
return presentValue((CouponCMS) instrument, (HullWhiteOneFactorPiecewiseConstantDataBundle) curves);
}
/**
* Compute the present value sensitivity to the yield curves of a CMS coupon by discounting (no convexity adjustment).
* @param cmsCoupon The CMS coupon.
* @param curves The yield curves. Should contain the discounting and forward curves associated.
* @return The present value curve sensitivity.
*/
public InterestRateCurveSensitivity presentValueSensitivity(final CouponCMS cmsCoupon, final YieldCurveBundle curves) {
Validate.notNull(cmsCoupon);
Validate.notNull(curves);
final ParRateCalculator parRateCal = ParRateCalculator.getInstance();
final double swapRate = parRateCal.visitFixedCouponSwap(cmsCoupon.getUnderlyingSwap(), curves);
final String fundingCurveName = cmsCoupon.getFundingCurveName();
final YieldAndDiscountCurve fundingCurve = curves.getCurve(fundingCurveName);
final double paymentTime = cmsCoupon.getPaymentTime();
final double paymentDiscountFactor = fundingCurve.getDiscountFactor(paymentTime);
final ParRateCurveSensitivityCalculator parRateSensCal = ParRateCurveSensitivityCalculator.getInstance();
final InterestRateCurveSensitivity swapRateSens = new InterestRateCurveSensitivity(cmsCoupon.getUnderlyingSwap().accept(parRateSensCal, curves));
final InterestRateCurveSensitivity payDFSens = new InterestRateCurveSensitivity(PresentValueCurveSensitivityCalculator.discountFactorSensitivity(fundingCurveName, fundingCurve, paymentTime));
InterestRateCurveSensitivity result = swapRateSens.multipliedBy(paymentDiscountFactor);
result = result.plus(payDFSens.multipliedBy(swapRate));
result = result.multipliedBy(cmsCoupon.getNotional() * cmsCoupon.getPaymentYearFraction());
return result;
}
}