/**
* Copyright (C) 2015 - 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 com.opengamma.analytics.financial.interestrate.future.calculator.FuturesPriceNormalSTIRFuturesCalculator;
import com.opengamma.analytics.financial.interestrate.future.derivative.FuturesTransaction;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionSecurity;
import com.opengamma.analytics.financial.provider.calculator.normalstirfutures.PositionDeltaNormalSTIRFutureOptionCalculator;
import com.opengamma.analytics.financial.provider.calculator.normalstirfutures.PositionGammaNormalSTIRFutureOptionCalculator;
import com.opengamma.analytics.financial.provider.calculator.normalstirfutures.PositionThetaNormalSTIRFutureOptionCalculator;
import com.opengamma.analytics.financial.provider.calculator.normalstirfutures.PositionVegaNormalSTIRFutureOptionCalculator;
import com.opengamma.analytics.financial.provider.calculator.normalstirfutures.PresentValueCurveSensitivityNormalSTIRFuturesCalculator;
import com.opengamma.analytics.financial.provider.calculator.normalstirfutures.PresentValueNormalSTIRFuturesCalculator;
import com.opengamma.analytics.financial.provider.description.interestrate.NormalSTIRFuturesExpSimpleMoneynessProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.NormalSTIRFuturesProviderInterface;
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.model.fixedincome.BucketedCurveSensitivities;
import com.opengamma.sesame.CurveMatrixLabeller;
import com.opengamma.sesame.ZeroIRDeltaBucketingUtils;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.MultipleCurrencyAmount;
import com.opengamma.util.result.Result;
/**
* Interest rate future option Normal calculator.
*/
public class IRFutureOptionNormalCalculator implements IRFutureOptionCalculator {
private static final FuturesPriceNormalSTIRFuturesCalculator PRICE_CALC =
FuturesPriceNormalSTIRFuturesCalculator.getInstance();
private static final PresentValueNormalSTIRFuturesCalculator PV_CALC =
PresentValueNormalSTIRFuturesCalculator.getInstance();
private static final PresentValueCurveSensitivityNormalSTIRFuturesCalculator PV01_CALC =
PresentValueCurveSensitivityNormalSTIRFuturesCalculator.getInstance();
private static final ParameterSensitivityParameterCalculator<NormalSTIRFuturesProviderInterface> PSSFC =
new ParameterSensitivityParameterCalculator<>(PV01_CALC);
private static final PositionDeltaNormalSTIRFutureOptionCalculator DELTA_CALC =
PositionDeltaNormalSTIRFutureOptionCalculator.getInstance();
private static final PositionGammaNormalSTIRFutureOptionCalculator GAMMA_CALC =
PositionGammaNormalSTIRFutureOptionCalculator.getInstance();
private static final PositionThetaNormalSTIRFutureOptionCalculator THETA_CALC =
PositionThetaNormalSTIRFutureOptionCalculator.getInstance();
private static final PositionVegaNormalSTIRFutureOptionCalculator VEGA_CALC =
PositionVegaNormalSTIRFutureOptionCalculator.getInstance();
private final FuturesTransaction<InterestRateFutureOptionSecurity> _derivative;
private final Map<String, CurveMatrixLabeller> _curveLabellers;
private final NormalSTIRFuturesExpSimpleMoneynessProviderDiscount _normalSurface;
/**
* Constructs a interest rate future options Normal calculator.
* @param derivative FuturesTransaction for InterestRateFutureOptionSecurity
* @param normalSurface the normal surface provider
* @param curveLabellers curve labellers for the multicurve
*/
public IRFutureOptionNormalCalculator(FuturesTransaction<InterestRateFutureOptionSecurity> derivative,
NormalSTIRFuturesExpSimpleMoneynessProviderDiscount normalSurface,
Map<String, CurveMatrixLabeller> curveLabellers) {
_normalSurface = ArgumentChecker.notNull(normalSurface, "normalSurface");
_curveLabellers = ArgumentChecker.notNull(curveLabellers, "curveLabellers");
_derivative = ArgumentChecker.notNull(derivative, "derivative");
}
@Override
public Result<MultipleCurrencyAmount> calculatePV() {
return Result.success(_derivative.accept(PV_CALC, _normalSurface));
}
@Override
public Result<MultipleCurrencyMulticurveSensitivity> calculatePV01() {
return Result.success(_derivative.accept(PV01_CALC, _normalSurface));
}
@Override
public Result<Double> calculateModelPrice() {
return Result.success(_derivative.accept(PRICE_CALC, _normalSurface));
}
@Override
public Result<Double> calculateDelta() {
return Result.success(_derivative.accept(DELTA_CALC, _normalSurface));
}
@Override
public Result<Double> calculateGamma() {
return Result.success(_derivative.accept(GAMMA_CALC, _normalSurface));
}
@Override
public Result<Double> calculateVega() {
return Result.success(_derivative.accept(VEGA_CALC, _normalSurface));
}
@Override
public Result<Double> calculateTheta() {
return Result.success(_derivative.accept(THETA_CALC, _normalSurface));
}
@Override
public Result<BucketedCurveSensitivities> calculateBucketedZeroIRDelta() {
MultipleCurrencyParameterSensitivity sensitivities = PSSFC.calculateSensitivity(_derivative, _normalSurface);
BucketedCurveSensitivities bucketedCurveSensitivities =
ZeroIRDeltaBucketingUtils.getBucketedCurveSensitivities(sensitivities, _curveLabellers);
return Result.success(bucketedCurveSensitivities);
}
}