/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate; import org.apache.commons.lang.Validate; import com.opengamma.analytics.financial.interestrate.payments.derivative.CapFloorCMS; import com.opengamma.analytics.financial.interestrate.payments.derivative.CapFloorCMSSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.CapFloorIbor; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponCMS; import com.opengamma.analytics.financial.interestrate.payments.method.CapFloorCMSSABRExtrapolationRightReplicationMethod; import com.opengamma.analytics.financial.interestrate.payments.method.CapFloorCMSSpreadSABRBinormalMethod; import com.opengamma.analytics.financial.interestrate.payments.method.CapFloorIborSABRExtrapolationRightMethod; import com.opengamma.analytics.financial.interestrate.payments.method.CouponCMSSABRExtrapolationRightReplicationMethod; import com.opengamma.analytics.financial.interestrate.swaption.derivative.SwaptionCashFixedIbor; import com.opengamma.analytics.financial.interestrate.swaption.derivative.SwaptionPhysicalFixedIbor; import com.opengamma.analytics.financial.interestrate.swaption.method.SwaptionCashFixedIborSABRExtrapolationRightMethod; import com.opengamma.analytics.financial.interestrate.swaption.method.SwaptionPhysicalFixedIborSABRExtrapolationRightMethod; import com.opengamma.analytics.financial.model.option.definition.SABRInterestRateCorrelationParameters; import com.opengamma.analytics.financial.model.option.definition.SABRInterestRateDataBundle; /** * Present value calculator for interest rate instruments using SABR volatility formula with extrapolation for high strikes. * OpenGamma implementation note for the extrapolation: Smile extrapolation, version 1.2, May 2011. * @deprecated {@link PresentValueCalculator} is deprecated */ @Deprecated public final class PresentValueSABRExtrapolationCalculator extends PresentValueCalculator { /** * The cut-off strike. The smile is extrapolated above that level. */ private final double _cutOffStrike; /** * The tail thickness parameter. */ private final double _mu; /** * The methods. */ private final CouponCMSSABRExtrapolationRightReplicationMethod _methodExtraCMSCpn; private final CapFloorCMSSABRExtrapolationRightReplicationMethod _methodExtraCMSCap; /** * Constructor. * @param cutOffStrike The cut-off strike. * @param mu The tail thickness parameter. */ public PresentValueSABRExtrapolationCalculator(final double cutOffStrike, final double mu) { _mu = mu; _cutOffStrike = cutOffStrike; _methodExtraCMSCpn = new CouponCMSSABRExtrapolationRightReplicationMethod(_cutOffStrike, _mu); _methodExtraCMSCap = new CapFloorCMSSABRExtrapolationRightReplicationMethod(_cutOffStrike, _mu); } @Override public Double visitCapFloorIbor(final CapFloorIbor cap, final YieldCurveBundle curves) { Validate.notNull(cap); Validate.notNull(curves); if (curves instanceof SABRInterestRateDataBundle) { final SABRInterestRateDataBundle sabr = (SABRInterestRateDataBundle) curves; final CapFloorIborSABRExtrapolationRightMethod method = new CapFloorIborSABRExtrapolationRightMethod(_cutOffStrike, _mu); return method.presentValue(cap, sabr).getAmount(); } throw new UnsupportedOperationException("The PresentValueSABRExtrapolationCalculator visitor visitCapFloorIbor requires a SABRInterestRateDataBundle as data."); } @Override public Double visitSwaptionCashFixedIbor(final SwaptionCashFixedIbor swaption, final YieldCurveBundle curves) { Validate.notNull(swaption); Validate.notNull(curves); if (curves instanceof SABRInterestRateDataBundle) { final SABRInterestRateDataBundle sabr = (SABRInterestRateDataBundle) curves; final SwaptionCashFixedIborSABRExtrapolationRightMethod method = new SwaptionCashFixedIborSABRExtrapolationRightMethod(_cutOffStrike, _mu); return method.presentValue(swaption, sabr); } throw new UnsupportedOperationException("The PresentValueSABRExtrapolationCalculator visitor visitSwaptionCashFixedIbor requires a SABRInterestRateDataBundle as data."); } @Override public Double visitSwaptionPhysicalFixedIbor(final SwaptionPhysicalFixedIbor swaption, final YieldCurveBundle curves) { Validate.notNull(swaption); Validate.notNull(curves); if (curves instanceof SABRInterestRateDataBundle) { final SABRInterestRateDataBundle sabr = (SABRInterestRateDataBundle) curves; final SwaptionPhysicalFixedIborSABRExtrapolationRightMethod method = new SwaptionPhysicalFixedIborSABRExtrapolationRightMethod(_cutOffStrike, _mu); return method.presentValue(swaption, sabr); } throw new UnsupportedOperationException("The PresentValueSABRExtrapolationCalculator visitor visitSwaptionPhysicalFixedIbor requires a SABRInterestRateDataBundle as data."); } @Override public Double visitCouponCMS(final CouponCMS payment, final YieldCurveBundle curves) { Validate.notNull(curves); Validate.notNull(payment); if (curves instanceof SABRInterestRateDataBundle) { final SABRInterestRateDataBundle sabr = (SABRInterestRateDataBundle) curves; return _methodExtraCMSCpn.presentValue(payment, sabr).getAmount(); } throw new UnsupportedOperationException("The PresentValueSABRExtrapolationCalculator visitor visitCouponCMS requires a SABRInterestRateDataBundle as data."); } @Override public Double visitCapFloorCMS(final CapFloorCMS payment, final YieldCurveBundle curves) { Validate.notNull(curves); Validate.notNull(payment); if (curves instanceof SABRInterestRateDataBundle) { final SABRInterestRateDataBundle sabr = (SABRInterestRateDataBundle) curves; return _methodExtraCMSCap.presentValue(payment, sabr).getAmount(); } throw new UnsupportedOperationException("The PresentValueSABRExtrapolationCalculator visitor visitCapFloorCMS requires a SABRInterestRateDataBundle as data."); } @Override public Double visitCapFloorCMSSpread(final CapFloorCMSSpread payment, final YieldCurveBundle curves) { Validate.notNull(curves); Validate.notNull(payment); if (curves instanceof SABRInterestRateDataBundle) { final SABRInterestRateDataBundle sabrBundle = (SABRInterestRateDataBundle) curves; if (sabrBundle.getSABRParameter() instanceof SABRInterestRateCorrelationParameters) { final SABRInterestRateCorrelationParameters sabrCorrelation = (SABRInterestRateCorrelationParameters) sabrBundle.getSABRParameter(); final CapFloorCMSSpreadSABRBinormalMethod method = new CapFloorCMSSpreadSABRBinormalMethod(sabrCorrelation.getCorrelation(), _methodExtraCMSCap, _methodExtraCMSCpn); return method.presentValue(payment, sabrBundle).getAmount(); } } throw new UnsupportedOperationException("The PresentValueSABRCalculator visitor visitCapFloorCMSSpread requires a SABRInterestRateDataBundle with correlation as data."); } }