/**
* 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.provider;
import com.opengamma.analytics.financial.interestrate.PresentValueSABRSensitivityDataBundle;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CapFloorCMS;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponCMS;
import com.opengamma.analytics.financial.provider.description.interestrate.SABRSwaptionProviderInterface;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity;
import com.opengamma.util.money.MultipleCurrencyAmount;
/**
* Class used to compute the price of a CMS coupon by swaption replication with SABR Hagan formula.
*/
public class CouponCMSSABRReplicationGenericMethod {
/**
* The interval length on which the CMS replication is computed for cap. The range is [strike, strike+integrationInterval].
*/
private final double _integrationInterval;
/**
* The method used to price CMS cap/floor.
*/
private final CapFloorCMSSABRReplicationAbstractMethod _capFloorMethod;
/**
* Constructor of the CMS replication method with the integration range.
* @param capFloorMethod The method used to price CMS cap/floor.
*/
public CouponCMSSABRReplicationGenericMethod(final CapFloorCMSSABRReplicationAbstractMethod capFloorMethod) {
_integrationInterval = 1.0;
_capFloorMethod = capFloorMethod;
}
/**
* Constructor of the CMS replication method with the integration range.
* @param capFloorMethod The method used to price CMS cap/floor.
* @param integrationInterval Integration range.
*/
public CouponCMSSABRReplicationGenericMethod(final CapFloorCMSSABRReplicationAbstractMethod capFloorMethod, final double integrationInterval) {
_integrationInterval = integrationInterval;
_capFloorMethod = capFloorMethod;
}
/**
* Compute the price of a CMS coupon by replication in SABR framework.
* The CMS coupon is priced as a cap with strike 0.0. The strike 0.0 is used as the rates are always >=0.0 in SABR.
* @param cmsCoupon The CMS coupon.
* @param sabrData The SABR and curve data.
* @return The coupon price.
*/
public MultipleCurrencyAmount presentValue(final CouponCMS cmsCoupon, final SABRSwaptionProviderInterface sabrData) {
final CapFloorCMS cap0 = CapFloorCMS.from(cmsCoupon, 0.0, true);
final MultipleCurrencyAmount priceCMSCoupon = _capFloorMethod.presentValue(cap0, sabrData);
return priceCMSCoupon;
}
/**
* Computes the present value sensitivity to the yield curves of a CMS coupon by replication in SABR framework.
* @param cmsCoupon The CMS coupon.
* @param sabrData The SABR data bundle. The SABR function need to be the Hagan function.
* @return The present value sensitivity to curves.
*/
public MultipleCurrencyMulticurveSensitivity presentValueCurveSensitivity(final CouponCMS cmsCoupon, final SABRSwaptionProviderInterface sabrData) {
final CapFloorCMS cap0 = CapFloorCMS.from(cmsCoupon, 0.0, true);
// A CMS coupon is priced as a cap with strike 0.
return _capFloorMethod.presentValueCurveSensitivity(cap0, sabrData);
}
/**
* Computes the present value sensitivity to the SABR parameters of a CMS coupon by replication in SABR framework.
* @param cmsCoupon The CMS coupon.
* @param sabrData The SABR data bundle. The SABR function need to be the Hagan function.
* @return The present value sensitivity to SABR parameters.
*/
public PresentValueSABRSensitivityDataBundle presentValueSABRSensitivity(final CouponCMS cmsCoupon, final SABRSwaptionProviderInterface sabrData) {
final CapFloorCMS cap0 = CapFloorCMS.from(cmsCoupon, 0.0, true);
// A CMS coupon is priced as a cap with strike 0.
return _capFloorMethod.presentValueSABRSensitivity(cap0, sabrData);
}
/**
* Gets the integration interval.
* @return The integration interval.
*/
public double getIntegrationInterval() {
return _integrationInterval;
}
}