/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.irfutureoption; import java.util.Map; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.interestrate.InstrumentDerivative; import com.opengamma.analytics.financial.interestrate.future.calculator.FuturesPriceBlackSTIRFuturesCalculator; import com.opengamma.analytics.financial.provider.calculator.blackstirfutures.PositionDeltaSTIRFutureOptionCalculator; import com.opengamma.analytics.financial.provider.calculator.blackstirfutures.PositionGammaSTIRFutureOptionCalculator; import com.opengamma.analytics.financial.provider.calculator.blackstirfutures.PositionThetaSTIRFutureOptionCalculator; import com.opengamma.analytics.financial.provider.calculator.blackstirfutures.PositionVegaSTIRFutureOptionCalculator; import com.opengamma.analytics.financial.provider.calculator.blackstirfutures.PresentValueBlackSTIRFutureOptionCalculator; import com.opengamma.analytics.financial.provider.calculator.blackstirfutures.PresentValueCurveSensitivityBlackSTIRFutureOptionCalculator; import com.opengamma.analytics.financial.provider.description.interestrate.BlackSTIRFuturesProviderInterface; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.parameter.ParameterSensitivityParameterCalculator; import com.opengamma.financial.analytics.conversion.FixedIncomeConverterDataProvider; import com.opengamma.financial.analytics.conversion.InterestRateFutureOptionTradeConverter; import com.opengamma.financial.analytics.model.fixedincome.BucketedCurveSensitivities; import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesBundle; import com.opengamma.sesame.CurveMatrixLabeller; import com.opengamma.sesame.ZeroIRDeltaBucketingUtils; import com.opengamma.sesame.trade.IRFutureOptionTrade; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.MultipleCurrencyAmount; import com.opengamma.util.result.Result; /** * Interest rate future option Black Log-Normal calculator. */ public class IRFutureOptionBlackCalculator implements IRFutureOptionCalculator { /** * Calculator for the present value of the interest rate future option. */ private static final PresentValueBlackSTIRFutureOptionCalculator PV_CALC = PresentValueBlackSTIRFutureOptionCalculator .getInstance(); /** * Calculator for the PV01 of the interest rate future option. */ private static final PresentValueCurveSensitivityBlackSTIRFutureOptionCalculator PV01_CALC = PresentValueCurveSensitivityBlackSTIRFutureOptionCalculator.getInstance(); /** * Calculator the model price of the interest rate future option. */ private static final FuturesPriceBlackSTIRFuturesCalculator PRICE_CALC = FuturesPriceBlackSTIRFuturesCalculator .getInstance(); /** * Calculate for the delta of the interest rate future option. */ private static final PositionDeltaSTIRFutureOptionCalculator DELTA_CALC = PositionDeltaSTIRFutureOptionCalculator .getInstance(); /** * Calculate for the gamma of the interest rate future option. */ private static final PositionGammaSTIRFutureOptionCalculator GAMMA_CALC = PositionGammaSTIRFutureOptionCalculator .getInstance(); /** * Calculate for the vega of the interest rate future option. */ private static final PositionVegaSTIRFutureOptionCalculator VEGA_CALC = PositionVegaSTIRFutureOptionCalculator .getInstance(); /** * Calculate for the theta of the interest rate future option. */ private static final PositionThetaSTIRFutureOptionCalculator THETA_CALC = PositionThetaSTIRFutureOptionCalculator .getInstance(); /** * Calculator for the curve sensitivity of the interest rate future option. */ private static final PresentValueCurveSensitivityBlackSTIRFutureOptionCalculator PVCSBFOC = PresentValueCurveSensitivityBlackSTIRFutureOptionCalculator.getInstance(); /** * Calculator for the parameter sensitivity of the interest rate future option. */ private static final ParameterSensitivityParameterCalculator<BlackSTIRFuturesProviderInterface> PSSFC = new ParameterSensitivityParameterCalculator<>(PVCSBFOC); /** * Derivative form of the security. */ private final InstrumentDerivative _derivative; /** * Black volatility data. */ private final BlackSTIRFuturesProviderInterface _black; /** * Map containing the curve labellers for each curve in the multicurve. */ private final Map<String, CurveMatrixLabeller> _curveLabellers; /** * Constructs a calculator for interest rate future options using the Black model. * @param trade the interest rate future option trade, not null. * @param converter the converter used to create the definition of the interest rate future option, not null. * @param black the Black volatility data, not null. * @param valTime the valuation date time, not null. * @param definitionToDerivativeConverter the converter to create the derivative form of the future option, not null. * @param fixings the historical prices of the underlying interest rate future, not null. * @param curveLabellers map containing the per curve labellers */ public IRFutureOptionBlackCalculator(IRFutureOptionTrade trade, InterestRateFutureOptionTradeConverter converter, BlackSTIRFuturesProviderInterface black, ZonedDateTime valTime, FixedIncomeConverterDataProvider definitionToDerivativeConverter, HistoricalTimeSeriesBundle fixings, Map<String, CurveMatrixLabeller> curveLabellers) { ArgumentChecker.notNull(trade, "trade"); ArgumentChecker.notNull(converter, "converter"); ArgumentChecker.notNull(valTime, "valTime"); ArgumentChecker.notNull(definitionToDerivativeConverter, "definitionToDerivativeConverter"); ArgumentChecker.notNull(fixings, "fixings"); _derivative = IRFutureOptionFnUtils.createDerivative(trade, converter, valTime, definitionToDerivativeConverter, fixings); _black = ArgumentChecker.notNull(black, "black"); _curveLabellers = ArgumentChecker.notNull(curveLabellers, "curveLabellers"); } @Override public Result<MultipleCurrencyAmount> calculatePV() { return Result.success(_derivative.accept(PV_CALC, _black)); } @Override public Result<MultipleCurrencyMulticurveSensitivity> calculatePV01() { return Result.success(_derivative.accept(PV01_CALC, _black)); } @Override public Result<Double> calculateModelPrice() { return Result.success(_derivative.accept(PRICE_CALC, _black)); } @Override public Result<Double> calculateDelta() { return Result.success(_derivative.accept(DELTA_CALC, _black)); } @Override public Result<Double> calculateGamma() { return Result.success(_derivative.accept(GAMMA_CALC, _black)); } @Override public Result<Double> calculateVega() { return Result.success(_derivative.accept(VEGA_CALC, _black)); } @Override public Result<Double> calculateTheta() { return Result.success(_derivative.accept(THETA_CALC, _black)); } @Override public Result<BucketedCurveSensitivities> calculateBucketedZeroIRDelta() { MultipleCurrencyParameterSensitivity sensitivities = PSSFC.calculateSensitivity(_derivative, _black); BucketedCurveSensitivities bucketedCurveSensitivities = ZeroIRDeltaBucketingUtils.getBucketedCurveSensitivities(sensitivities, _curveLabellers); return Result.success(bucketedCurveSensitivities); } }