/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.irfutureoption;
import java.util.Collections;
import java.util.Set;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionMarginTransaction;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionPremiumTransaction;
import com.opengamma.analytics.financial.interestrate.future.method.InterestRateFutureOptionMarginSecurityBlackSurfaceMethod;
import com.opengamma.analytics.financial.interestrate.future.method.InterestRateFutureOptionMarginTransactionBlackSurfaceMethod;
import com.opengamma.analytics.financial.interestrate.future.method.InterestRateFutureOptionPremiumSecurityBlackSurfaceMethod;
import com.opengamma.analytics.financial.interestrate.future.method.InterestRateFutureOptionPremiumTransactionBlackSurfaceMethod;
import com.opengamma.analytics.financial.model.option.definition.YieldCurveWithBlackCubeBundle;
import com.opengamma.engine.value.ComputedValue;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.financial.analytics.model.black.BlackDiscountingValueGammaIRFutureOptionFunction;
/**
* Calculates the "ValueGammaP" ({@link ValueRequirementNames#VALUE_GAMMA_P}) of an interest rate future option.
* The underlying Futures price is computed from the futures curve.
* @deprecated Use {@link BlackDiscountingValueGammaIRFutureOptionFunction}
*/
@Deprecated
public class InterestRateFutureOptionBlackValueGammaPFunction extends InterestRateFutureOptionBlackFunction {
/** Calculates gamma for margined future options */
private static final InterestRateFutureOptionMarginTransactionBlackSurfaceMethod MARGINED_TRANSACTION_METHOD = InterestRateFutureOptionMarginTransactionBlackSurfaceMethod.getInstance();
/** Calculates the underlying forward rate for margined future options */
private static final InterestRateFutureOptionMarginSecurityBlackSurfaceMethod MARGINED_SECURITY_METHOD = InterestRateFutureOptionMarginSecurityBlackSurfaceMethod.getInstance();
/** Calculates gamma for future options with a premium */
private static final InterestRateFutureOptionPremiumTransactionBlackSurfaceMethod PREMIUM_TRANSACTION_METHOD = InterestRateFutureOptionPremiumTransactionBlackSurfaceMethod.getInstance();
/** Calculates the underlying forward rate for future options with a premium */
private static final InterestRateFutureOptionPremiumSecurityBlackSurfaceMethod PREMIUM_SECURITY_METHOD = InterestRateFutureOptionPremiumSecurityBlackSurfaceMethod.getInstance();
/**
* Sets the value requirement name to {@link ValueRequirementNames#VALUE_GAMMA_P}
*/
public InterestRateFutureOptionBlackValueGammaPFunction() {
super(ValueRequirementNames.VALUE_GAMMA_P, true);
}
@Override
protected Set<ComputedValue> getResult(final InstrumentDerivative derivative, final YieldCurveWithBlackCubeBundle data, final ValueSpecification spec, final Set<ValueRequirement> desiredValues) {
final double gamma, spot;
if (derivative instanceof InterestRateFutureOptionMarginTransaction) {
final InterestRateFutureOptionMarginTransaction transaction = (InterestRateFutureOptionMarginTransaction) derivative;
gamma = MARGINED_TRANSACTION_METHOD.presentValueGamma(transaction, data);
spot = MARGINED_SECURITY_METHOD.underlyingFuturePrice(transaction.getUnderlyingSecurity(), data);
} else if (derivative instanceof InterestRateFutureOptionPremiumTransaction) {
final InterestRateFutureOptionPremiumTransaction transaction = (InterestRateFutureOptionPremiumTransaction) derivative;
gamma = PREMIUM_TRANSACTION_METHOD.presentValueGamma(transaction, data);
spot = PREMIUM_SECURITY_METHOD.underlyingFuturePrice(transaction.getUnderlyingSecurity(), data);
} else {
throw new OpenGammaRuntimeException("Could not handle derivatives of type " + derivative.getClass());
}
final Double valueGamma = gamma * spot;
return Collections.singleton(new ComputedValue(spec, valueGamma / 2500000.0));
}
}