com.opengamma.strata.pricer.swaption.HullWhiteSwaptionPhysicalTradePricer Maven / Gradle / Ivy
/*
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.pricer.swaption;
import java.time.LocalDate;
import com.opengamma.strata.basics.currency.CurrencyAmount;
import com.opengamma.strata.basics.currency.MultiCurrencyAmount;
import com.opengamma.strata.basics.currency.Payment;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.market.sensitivity.PointSensitivities;
import com.opengamma.strata.market.sensitivity.PointSensitivityBuilder;
import com.opengamma.strata.pricer.DiscountingPaymentPricer;
import com.opengamma.strata.pricer.model.HullWhiteOneFactorPiecewiseConstantParametersProvider;
import com.opengamma.strata.pricer.rate.RatesProvider;
import com.opengamma.strata.product.swaption.ResolvedSwaption;
import com.opengamma.strata.product.swaption.ResolvedSwaptionTrade;
import com.opengamma.strata.product.swaption.Swaption;
/**
* Pricer for swaption with physical settlement in Hull-White one factor model with piecewise constant volatility.
*
* Reference: Henrard, M. "The Irony in the derivatives discounting Part II: the crisis", Wilmott Journal, 2010, 2, 301-316
*/
public class HullWhiteSwaptionPhysicalTradePricer {
/**
* Default implementation.
*/
public static final HullWhiteSwaptionPhysicalTradePricer DEFAULT = new HullWhiteSwaptionPhysicalTradePricer();
/**
* Pricer for {@link Swaption}.
*/
private static final HullWhiteSwaptionPhysicalProductPricer PRICER_PRODUCT = HullWhiteSwaptionPhysicalProductPricer.DEFAULT;
/**
* Pricer for {@link Payment} which is used to described the premium.
*/
private static final DiscountingPaymentPricer PRICER_PREMIUM = DiscountingPaymentPricer.DEFAULT;
/**
* Calculates the present value of the swaption trade.
*
* The result is expressed using the currency of the swapion.
*
* @param trade the swaption trade
* @param ratesProvider the rates provider
* @param hwProvider the Hull-White model parameter trade
* @return the present value
*/
public CurrencyAmount presentValue(
ResolvedSwaptionTrade trade,
RatesProvider ratesProvider,
HullWhiteOneFactorPiecewiseConstantParametersProvider hwProvider) {
ResolvedSwaption product = trade.getProduct();
CurrencyAmount pvProduct = PRICER_PRODUCT.presentValue(product, ratesProvider, hwProvider);
Payment premium = trade.getPremium();
CurrencyAmount pvPremium = PRICER_PREMIUM.presentValue(premium, ratesProvider);
return pvProduct.plus(pvPremium);
}
//-------------------------------------------------------------------------
/**
* Computes the currency exposure of the swaption trade.
*
* @param trade the swaption trade
* @param ratesProvider the rates provider
* @param hwProvider the Hull-White model parameter provider
* @return the currency exposure
*/
public MultiCurrencyAmount currencyExposure(
ResolvedSwaptionTrade trade,
RatesProvider ratesProvider,
HullWhiteOneFactorPiecewiseConstantParametersProvider hwProvider) {
return MultiCurrencyAmount.of(presentValue(trade, ratesProvider, hwProvider));
}
/**
* Calculates the current cash of the swaption trade.
*
* Only the premium is contributing to the current cash for non-cash settle swaptions.
*
* @param trade the swaption trade
* @param valuationDate the valuation date
* @return the current cash amount
*/
public CurrencyAmount currentCash(ResolvedSwaptionTrade trade, LocalDate valuationDate) {
Payment premium = trade.getPremium();
if (premium.getDate().equals(valuationDate)) {
return CurrencyAmount.of(premium.getCurrency(), premium.getAmount());
}
return CurrencyAmount.of(premium.getCurrency(), 0.0);
}
//-------------------------------------------------------------------------
/**
* Calculates the present value sensitivity of the swaption product.
*
* The present value sensitivity of the product is the sensitivity of the present value to
* the underlying curves.
*
* @param trade the swaption trade
* @param ratesProvider the rates provider
* @param hwProvider the Hull-White model parameter provider
* @return the point sensitivity to the rate curves
*/
public PointSensitivities presentValueSensitivityRates(
ResolvedSwaptionTrade trade,
RatesProvider ratesProvider,
HullWhiteOneFactorPiecewiseConstantParametersProvider hwProvider) {
ResolvedSwaption product = trade.getProduct();
PointSensitivityBuilder pvcsProduct =
PRICER_PRODUCT.presentValueSensitivityRates(product, ratesProvider, hwProvider);
Payment premium = trade.getPremium();
PointSensitivityBuilder pvcsPremium = PRICER_PREMIUM.presentValueSensitivity(premium, ratesProvider);
return pvcsProduct.combinedWith(pvcsPremium).build();
}
//-------------------------------------------------------------------------
/**
* Calculates the present value sensitivity piecewise constant volatility parameters of the Hull-White model.
*
* @param trade the swaption trade
* @param ratesProvider the rates provider
* @param hwProvider the Hull-White model parameter provider
* @return the present value Hull-White model parameter sensitivity of the swaption trade
*/
public DoubleArray presentValueSensitivityModelParamsHullWhite(
ResolvedSwaptionTrade trade,
RatesProvider ratesProvider,
HullWhiteOneFactorPiecewiseConstantParametersProvider hwProvider) {
ResolvedSwaption product = trade.getProduct();
return PRICER_PRODUCT.presentValueSensitivityModelParamsHullWhite(product, ratesProvider, hwProvider);
}
}