com.opengamma.strata.pricer.capfloor.SabrIborCapFloorLegPricer Maven / Gradle / Ivy
/*
* 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.product.capfloor.IborCapletFloorletPeriod;
import com.opengamma.strata.product.capfloor.ResolvedIborCapFloorLeg;
/**
* Pricer for cap/floor legs in SABR model.
*/
public class SabrIborCapFloorLegPricer
extends VolatilityIborCapFloorLegPricer {
/**
* Default implementation.
*/
public static final SabrIborCapFloorLegPricer DEFAULT =
new SabrIborCapFloorLegPricer(SabrIborCapletFloorletPeriodPricer.DEFAULT);
/**
* The period pricer.
*/
private final SabrIborCapletFloorletPeriodPricer periodPricer;
/**
* Creates an instance.
*
* @param periodPricer the pricer for {@link IborCapletFloorletPeriod}.
*/
public SabrIborCapFloorLegPricer(SabrIborCapletFloorletPeriodPricer periodPricer) {
super(periodPricer);
this.periodPricer = periodPricer;
}
/**
* Calculates the present value sensitivity of the Ibor cap/floor leg to the rate curves.
*
* 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 capFloorLeg the Ibor cap/floor leg
* @param ratesProvider the rates provider
* @param volatilities the volatilities
* @return the point sensitivity to the rate curves
*/
public PointSensitivityBuilder presentValueSensitivityRatesStickyModel(
ResolvedIborCapFloorLeg capFloorLeg,
RatesProvider ratesProvider,
SabrIborCapletFloorletVolatilities volatilities) {
validate(ratesProvider, volatilities);
return capFloorLeg.getCapletFloorletPeriods()
.stream()
.map(period -> periodPricer.presentValueSensitivityRatesStickyModel(period, ratesProvider, volatilities))
.reduce((c1, c2) -> c1.combinedWith(c2))
.get();
}
/**
* Calculates the present value sensitivity to the SABR model parameters of the Ibor cap/floor.
*
* The sensitivity of the present value to the SABR model parameters, alpha, beta, rho and nu.
*
* @param capFloorLeg the Ibor cap/floor
* @param ratesProvider the rates provider
* @param volatilities the volatilities
* @return the point sensitivity to the SABR model parameters
*/
public PointSensitivityBuilder presentValueSensitivityModelParamsSabr(
ResolvedIborCapFloorLeg capFloorLeg,
RatesProvider ratesProvider,
SabrIborCapletFloorletVolatilities volatilities) {
validate(ratesProvider, volatilities);
return capFloorLeg.getCapletFloorletPeriods()
.stream()
.map(period -> periodPricer.presentValueSensitivityModelParamsSabr(period, ratesProvider, volatilities))
.reduce((c1, c2) -> c1.combinedWith(c2))
.get();
}
}