/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.provider.calculator.discounting; import com.opengamma.analytics.financial.forex.derivative.Forex; import com.opengamma.analytics.financial.forex.derivative.ForexSwap; import com.opengamma.analytics.financial.forex.provider.ForexDiscountingMethod; import com.opengamma.analytics.financial.forex.provider.ForexSwapDiscountingMethod; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter; import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity; import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed; import com.opengamma.analytics.financial.interestrate.cash.derivative.Cash; import com.opengamma.analytics.financial.interestrate.cash.derivative.DepositIbor; import com.opengamma.analytics.financial.interestrate.cash.provider.CashDiscountingMethod; import com.opengamma.analytics.financial.interestrate.cash.provider.DepositIborDiscountingMethod; import com.opengamma.analytics.financial.interestrate.fra.derivative.ForwardRateAgreement; import com.opengamma.analytics.financial.interestrate.fra.provider.ForwardRateAgreementDiscountingMethod; import com.opengamma.analytics.financial.interestrate.future.derivative.FederalFundsFutureTransaction; import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureTransaction; import com.opengamma.analytics.financial.interestrate.future.derivative.SwapFuturesPriceDeliverableTransaction; import com.opengamma.analytics.financial.interestrate.future.provider.FuturesTransactionMulticurveMethod; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixedAccruedCompounding; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixedCompounding; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixedFxReset; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIbor; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborAverage; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborAverageFixingDates; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborAverageFixingDatesCompounding; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborAverageFixingDatesCompoundingFlatSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborCompounding; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborCompoundingFlatSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborCompoundingSimpleSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborCompoundingSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborFxReset; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborGearing; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponON; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverage; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverageSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverageSpreadSimplified; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONCompounded; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.financial.interestrate.payments.derivative.PaymentFixed; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponFixedAccruedCompoundingDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponFixedCompoundingDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponFixedDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponFixedFxResetDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborAverageDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborAverageFixingDatesCompoundingDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborAverageFixingDatesCompoundingFlatSpreadDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborAverageFixingDatesDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborCompoundingDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborCompoundingFlatSpreadDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborCompoundingSimpleSpreadDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborCompoundingSpreadDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborFxResetDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborGearingDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponIborSpreadDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONArithmeticAverageDiscountingApproxMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONArithmeticAverageSpreadDiscountingApproxMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONArithmeticAverageSpreadSimplifiedDiscountingApproxMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONCompoundedDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONSpreadDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.PaymentFixedDiscountingMethod; import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap; import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapFixedCoupon; import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapMultileg; import com.opengamma.analytics.financial.provider.description.interestrate.ParameterProviderInterface; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity; import com.opengamma.util.ArgumentChecker; /** * Calculator of the present value curve sensitivity as multiple currency interest rate curve sensitivity. */ public final class PresentValueCurveSensitivityDiscountingCalculator extends InstrumentDerivativeVisitorAdapter<ParameterProviderInterface, MultipleCurrencyMulticurveSensitivity> { /** * The unique instance of the calculator. */ private static final PresentValueCurveSensitivityDiscountingCalculator INSTANCE = new PresentValueCurveSensitivityDiscountingCalculator(); /** * Gets the calculator instance. * @return The calculator. */ public static PresentValueCurveSensitivityDiscountingCalculator getInstance() { return INSTANCE; } /** * Constructor. */ private PresentValueCurveSensitivityDiscountingCalculator() { } /** * The methods used by the different instruments. */ private static final CashDiscountingMethod METHOD_DEPOSIT = CashDiscountingMethod.getInstance(); private static final DepositIborDiscountingMethod METHOD_DEPOSIT_IBOR = DepositIborDiscountingMethod.getInstance(); private static final PaymentFixedDiscountingMethod METHOD_PAY_FIXED = PaymentFixedDiscountingMethod.getInstance(); private static final CouponFixedDiscountingMethod METHOD_CPN_FIXED = CouponFixedDiscountingMethod.getInstance(); private static final CouponFixedCompoundingDiscountingMethod METHOD_CPN_FIXED_COMPOUNDING = CouponFixedCompoundingDiscountingMethod.getInstance(); private static final CouponFixedFxResetDiscountingMethod METHOD_CPN_FIXED_FXRESET = CouponFixedFxResetDiscountingMethod.getInstance(); private static final CouponIborFxResetDiscountingMethod METHOD_CPN_IBOR_FXRESET = CouponIborFxResetDiscountingMethod.getInstance(); private static final CouponIborDiscountingMethod METHOD_CPN_IBOR = CouponIborDiscountingMethod.getInstance(); private static final CouponIborAverageDiscountingMethod METHOD_CPN_IBOR_AVERAGE = CouponIborAverageDiscountingMethod.getInstance(); private static final CouponIborSpreadDiscountingMethod METHOD_CPN_IBOR_SPREAD = CouponIborSpreadDiscountingMethod.getInstance(); private static final CouponIborGearingDiscountingMethod METHOD_CPN_IBOR_GEARING = CouponIborGearingDiscountingMethod.getInstance(); private static final CouponIborCompoundingDiscountingMethod METHOD_CPN_IBOR_COMP = CouponIborCompoundingDiscountingMethod.getInstance(); private static final CouponIborCompoundingSpreadDiscountingMethod METHOD_CPN_IBOR_COMP_SPREAD = CouponIborCompoundingSpreadDiscountingMethod.getInstance(); private static final CouponIborCompoundingFlatSpreadDiscountingMethod METHOD_CPN_IBOR_COMP_FLAT_SPREAD = CouponIborCompoundingFlatSpreadDiscountingMethod.getInstance(); private static final CouponIborCompoundingSimpleSpreadDiscountingMethod METHOD_CPN_IBOR_COMP_SIMPLE_SPREAD = CouponIborCompoundingSimpleSpreadDiscountingMethod.getInstance(); private static final CouponONDiscountingMethod METHOD_CPN_ON = CouponONDiscountingMethod.getInstance(); private static final CouponONSpreadDiscountingMethod METHOD_CPN_ON_SPREAD = CouponONSpreadDiscountingMethod.getInstance(); private static final CouponONArithmeticAverageDiscountingApproxMethod METHOD_CPN_AAON = CouponONArithmeticAverageDiscountingApproxMethod.getInstance(); private static final CouponONArithmeticAverageSpreadDiscountingApproxMethod METHOD_CPN_AAON_SPREAD = CouponONArithmeticAverageSpreadDiscountingApproxMethod.getInstance(); private static final CouponONArithmeticAverageSpreadSimplifiedDiscountingApproxMethod METHOD_CPN_ONAA_SPREADSIMPL = CouponONArithmeticAverageSpreadSimplifiedDiscountingApproxMethod.getInstance(); private static final ForwardRateAgreementDiscountingMethod METHOD_FRA = ForwardRateAgreementDiscountingMethod.getInstance(); private static final ForexDiscountingMethod METHOD_FOREX = ForexDiscountingMethod.getInstance(); private static final ForexSwapDiscountingMethod METHOD_FOREX_SWAP = ForexSwapDiscountingMethod.getInstance(); private static final FuturesTransactionMulticurveMethod METHOD_FUT = new FuturesTransactionMulticurveMethod(); private static final CouponFixedAccruedCompoundingDiscountingMethod METHOD_CPN_FIXED_ACCRUED_COMPOUNDING = CouponFixedAccruedCompoundingDiscountingMethod.getInstance(); private static final CouponONCompoundedDiscountingMethod METHOD_CPN_ON_COMPOUNDING = CouponONCompoundedDiscountingMethod.getInstance(); private static final CouponIborAverageFixingDatesDiscountingMethod METHOD_CPN_IBOR_AVERAGE_FIXING_DATES = CouponIborAverageFixingDatesDiscountingMethod.getInstance(); private static final CouponIborAverageFixingDatesCompoundingDiscountingMethod METHOD_CPN_IBOR_AVERAGE_CMP = CouponIborAverageFixingDatesCompoundingDiscountingMethod.getInstance(); private static final CouponIborAverageFixingDatesCompoundingFlatSpreadDiscountingMethod METHOD_CPN_IBOR_FLAT_CMP_SPREAD = CouponIborAverageFixingDatesCompoundingFlatSpreadDiscountingMethod.getInstance(); // ----- Deposit ------ @Override public MultipleCurrencyMulticurveSensitivity visitCash(final Cash cash, final ParameterProviderInterface multicurve) { return METHOD_DEPOSIT.presentValueCurveSensitivity(cash, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitDepositIbor(final DepositIbor deposit, final ParameterProviderInterface multicurve) { return METHOD_DEPOSIT_IBOR.presentValueCurveSensitivity(deposit, multicurve.getMulticurveProvider()); } // ----- Payment/Coupon ------ @Override public MultipleCurrencyMulticurveSensitivity visitFixedPayment(final PaymentFixed payment, final ParameterProviderInterface multicurve) { return METHOD_PAY_FIXED.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponFixed(final CouponFixed payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_FIXED.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponFixedCompounding(final CouponFixedCompounding payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_FIXED_COMPOUNDING.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponFixedFxReset(final CouponFixedFxReset coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_FIXED_FXRESET.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborFxReset(final CouponIborFxReset coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_FXRESET.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIbor(final CouponIbor payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborAverage(final CouponIborAverage payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_AVERAGE.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborSpread(final CouponIborSpread payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_SPREAD.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborGearing(final CouponIborGearing payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_GEARING.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborCompounding(final CouponIborCompounding payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_COMP.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborCompoundingSpread(final CouponIborCompoundingSpread payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_COMP_SPREAD.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborCompoundingFlatSpread(final CouponIborCompoundingFlatSpread coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_COMP_FLAT_SPREAD.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborCompoundingSimpleSpread(final CouponIborCompoundingSimpleSpread coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_COMP_SIMPLE_SPREAD.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponOIS(final CouponON payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_ON.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponONSpread(final CouponONSpread payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_ON_SPREAD.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponONArithmeticAverage(final CouponONArithmeticAverage payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_AAON.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponONArithmeticAverageSpread( final CouponONArithmeticAverageSpread coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_AAON_SPREAD.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponONArithmeticAverageSpreadSimplified(final CouponONArithmeticAverageSpreadSimplified coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_ONAA_SPREADSIMPL.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitForwardRateAgreement(final ForwardRateAgreement fra, final ParameterProviderInterface multicurve) { return METHOD_FRA.presentValueCurveSensitivity(fra, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponFixedAccruedCompounding(final CouponFixedAccruedCompounding coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_FIXED_ACCRUED_COMPOUNDING.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponONCompounded(final CouponONCompounded coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_ON_COMPOUNDING.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborAverageFixingDates(final CouponIborAverageFixingDates coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_AVERAGE_FIXING_DATES.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborAverageCompounding(final CouponIborAverageFixingDatesCompounding coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_AVERAGE_CMP.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponIborAverageFlatCompoundingSpread( final CouponIborAverageFixingDatesCompoundingFlatSpread coupon, final ParameterProviderInterface multicurve) { return METHOD_CPN_IBOR_FLAT_CMP_SPREAD.presentValueCurveSensitivity(coupon, multicurve.getMulticurveProvider()); } // ----- Annuity ------ @Override public MultipleCurrencyMulticurveSensitivity visitGenericAnnuity(final Annuity<? extends Payment> annuity, final ParameterProviderInterface multicurve) { ArgumentChecker.notNull(annuity, "Annuity"); ArgumentChecker.notNull(multicurve, "multicurve"); MultipleCurrencyMulticurveSensitivity cs = annuity.getNthPayment(0).accept(this, multicurve); for (int loopp = 1; loopp < annuity.getNumberOfPayments(); loopp++) { cs = cs.plus(annuity.getNthPayment(loopp).accept(this, multicurve)); } return cs; } @Override public MultipleCurrencyMulticurveSensitivity visitFixedCouponAnnuity(final AnnuityCouponFixed annuity, final ParameterProviderInterface multicurve) { return visitGenericAnnuity(annuity, multicurve); } // ----- Swap ------ @Override public MultipleCurrencyMulticurveSensitivity visitSwap(final Swap<?, ?> swap, final ParameterProviderInterface multicurve) { final MultipleCurrencyMulticurveSensitivity sensitivity1 = swap.getFirstLeg().accept(this, multicurve); final MultipleCurrencyMulticurveSensitivity sensitivity2 = swap.getSecondLeg().accept(this, multicurve); return sensitivity1.plus(sensitivity2); } @Override public MultipleCurrencyMulticurveSensitivity visitFixedCouponSwap(final SwapFixedCoupon<?> swap, final ParameterProviderInterface multicurve) { return visitSwap(swap, multicurve); } @Override public MultipleCurrencyMulticurveSensitivity visitSwapMultileg(final SwapMultileg swap, final ParameterProviderInterface multicurve) { final int nbLegs = swap.getLegs().length; MultipleCurrencyMulticurveSensitivity pvcs = swap.getLegs()[0].accept(this, multicurve); for (int loopleg = 1; loopleg < nbLegs; loopleg++) { pvcs = pvcs.plus(swap.getLegs()[loopleg].accept(this, multicurve)); } return pvcs; } // ----- Futures ------ @Override public MultipleCurrencyMulticurveSensitivity visitFederalFundsFutureTransaction(final FederalFundsFutureTransaction futures, final ParameterProviderInterface multicurves) { return METHOD_FUT.presentValueCurveSensitivity(futures, multicurves); } @Override public MultipleCurrencyMulticurveSensitivity visitInterestRateFutureTransaction(final InterestRateFutureTransaction futures, final ParameterProviderInterface multicurves) { return METHOD_FUT.presentValueCurveSensitivity(futures, multicurves); } @Override public MultipleCurrencyMulticurveSensitivity visitSwapFuturesPriceDeliverableTransaction(final SwapFuturesPriceDeliverableTransaction future, final ParameterProviderInterface multicurves) { return METHOD_FUT.presentValueCurveSensitivity(future, multicurves); } // ----- Forex ------ @Override public MultipleCurrencyMulticurveSensitivity visitForex(final Forex derivative, final ParameterProviderInterface multicurves) { return METHOD_FOREX.presentValueCurveSensitivity(derivative, multicurves.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitForexSwap(final ForexSwap derivative, final ParameterProviderInterface multicurves) { return METHOD_FOREX_SWAP.presentValueCurveSensitivity(derivative, multicurves.getMulticurveProvider()); } }