/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.pricer.capfloor;
import com.opengamma.strata.market.sensitivity.PointSensitivityBuilder;
import com.opengamma.strata.pricer.rate.RatesProvider;
import com.opengamma.strata.pricer.swap.DiscountingSwapLegPricer;
import com.opengamma.strata.product.capfloor.IborCapFloorLeg;
import com.opengamma.strata.product.capfloor.ResolvedIborCapFloor;
import com.opengamma.strata.product.swap.SwapLeg;
/**
* Pricer for cap/floor products in SABR model.
*/
public class SabrIborCapFloorProductPricer
extends VolatilityIborCapFloorProductPricer {
/**
* Default implementation.
*/
public static final SabrIborCapFloorProductPricer DEFAULT =
new SabrIborCapFloorProductPricer(SabrIborCapFloorLegPricer.DEFAULT, DiscountingSwapLegPricer.DEFAULT);
/**
* The leg pricer.
*/
private final SabrIborCapFloorLegPricer capFloorLegPricer;
/**
* Creates an instance.
*
* @param capFloorLegPricer the pricer for {@link IborCapFloorLeg}
* @param payLegPricer the pricer for {@link SwapLeg}
*/
public SabrIborCapFloorProductPricer(SabrIborCapFloorLegPricer capFloorLegPricer, DiscountingSwapLegPricer payLegPricer) {
super(capFloorLegPricer, payLegPricer);
this.capFloorLegPricer = capFloorLegPricer;
}
//-------------------------------------------------------------------------
/**
* Calculates the present value rates sensitivity of the Ibor cap/floor product.
* <p>
* The present value sensitivity is computed in a "sticky model parameter" style, i.e. the sensitivity to the
* curve nodes with the SABR model parameters unchanged. This sensitivity does not include a potential
* re-calibration of the model parameters to the raw market data.
*
* @param capFloor the Ibor cap/floor product
* @param ratesProvider the rates provider
* @param volatilities the volatilities
* @return the present value sensitivity
*/
public PointSensitivityBuilder presentValueSensitivityRatesStickyModel(
ResolvedIborCapFloor capFloor,
RatesProvider ratesProvider,
SabrIborCapletFloorletVolatilities volatilities) {
PointSensitivityBuilder pvSensiCapFloorLeg =
capFloorLegPricer.presentValueSensitivityRatesStickyModel(capFloor.getCapFloorLeg(), ratesProvider, volatilities);
if (!capFloor.getPayLeg().isPresent()) {
return pvSensiCapFloorLeg;
}
PointSensitivityBuilder pvSensiPayLeg = getPayLegPricer().presentValueSensitivity(capFloor.getPayLeg().get(), ratesProvider);
return pvSensiCapFloorLeg.combinedWith(pvSensiPayLeg);
}
//-------------------------------------------------------------------------
/**
* Calculates the present value volatility sensitivity of the Ibor cap/floor product.
* <p>
* The sensitivity of the present value to the SABR model parameters, alpha, beta, rho and nu.
*
* @param capFloor the Ibor cap/floor product
* @param ratesProvider the rates provider
* @param volatilities the volatilities
* @return the present value sensitivity
*/
public PointSensitivityBuilder presentValueSensitivityModelParamsSabr(
ResolvedIborCapFloor capFloor,
RatesProvider ratesProvider,
SabrIborCapletFloorletVolatilities volatilities) {
return capFloorLegPricer.presentValueSensitivityModelParamsSabr(capFloor.getCapFloorLeg(), ratesProvider, volatilities);
}
}