/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.equity.option;
import java.util.Collections;
import java.util.Set;
import com.opengamma.core.security.Security;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.financial.analytics.OpenGammaFunctionExclusions;
import com.opengamma.financial.property.StaticDefaultPropertyFunction;
import com.opengamma.financial.security.FinancialSecurityTypes;
import com.opengamma.financial.security.option.EquityBarrierOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexOptionSecurity;
import com.opengamma.financial.security.option.EquityOptionSecurity;
import com.opengamma.util.ArgumentChecker;
/**
* Populates {@link EquityOptionFunction}, with CalculationMethods for each of the following assets:
* <ul>
* <li>FinancialSecurityTypes.EQUITY_OPTION_SECURITY
* <li>FinancialSecurityTypes.EQUITY_INDEX_OPTION_SECURITY
* <li>FinancialSecurityTypes.EQUITY_INDEX_FUTURE_OPTION_SECURITY
* </ul>
*/
public class EquityOptionCalculationMethodDefaultFunction extends StaticDefaultPropertyFunction {
/** The priority of this set of defaults */
private final PriorityClass _priority;
/** The CalculationMethod for EQUITY_OPTION_SECURITY */
private final Set<String> _equityOptionMethod;
/** The CalculationMethod for EQUITY_INDEX_OPTION_SECURITY */
private final Set<String> _equityIndexOptionMethod;
/** The CalculationMethod for EQUITY_INDEX_FUTURE_OPTION_SECURITY */
private final Set<String> _equityIndexFutureOptionMethod;
/** The CalculationMethod for EQUITY_BARRIER_OPTION_SECURITY */
private final Set<String> _equityBarrierOptionMethod;
/** The value requirement names for which these defaults apply */
private static final String[] VALUE_REQUIREMENTS = new String[] {
ValueRequirementNames.PRESENT_VALUE,
ValueRequirementNames.VEGA_QUOTE_MATRIX,
ValueRequirementNames.VALUE_VEGA,
ValueRequirementNames.IMPLIED_VOLATILITY,
ValueRequirementNames.YIELD_CURVE_NODE_SENSITIVITIES,
ValueRequirementNames.FORWARD,
ValueRequirementNames.SPOT,
ValueRequirementNames.VALUE_DELTA,
ValueRequirementNames.VALUE_GAMMA,
ValueRequirementNames.VALUE_VOMMA,
ValueRequirementNames.VALUE_VANNA,
ValueRequirementNames.VALUE_RHO,
ValueRequirementNames.VALUE_CARRY_RHO,
ValueRequirementNames.VALUE_THETA,
ValueRequirementNames.VALUE_DUAL_DELTA,
ValueRequirementNames.DELTA,
ValueRequirementNames.GAMMA,
ValueRequirementNames.VOMMA,
ValueRequirementNames.VANNA,
ValueRequirementNames.RHO,
ValueRequirementNames.CARRY_RHO,
ValueRequirementNames.THETA,
ValueRequirementNames.DUAL_DELTA,
ValueRequirementNames.VEGA,
ValueRequirementNames.PNL, // Produced by EquityOption*ScenarioFunction
ValueRequirementNames.POSITION_DELTA,
ValueRequirementNames.POSITION_GAMMA,
ValueRequirementNames.POSITION_RHO,
ValueRequirementNames.POSITION_THETA,
ValueRequirementNames.POSITION_VEGA,
ValueRequirementNames.POSITION_WEIGHTED_VEGA
};
public EquityOptionCalculationMethodDefaultFunction(final String priority,
final String equityOptionMethod, final String equityIndexOptionMethod,
final String equityIndexFutureOptionMethod, final String equityBarrierOptionMethod) {
super(FinancialSecurityTypes.EQUITY_OPTION_SECURITY.or(FinancialSecurityTypes.EQUITY_INDEX_OPTION_SECURITY)
.or(FinancialSecurityTypes.EQUITY_INDEX_FUTURE_OPTION_SECURITY).or(FinancialSecurityTypes.EQUITY_BARRIER_OPTION_SECURITY), ValuePropertyNames.CALCULATION_METHOD,
true, VALUE_REQUIREMENTS);
ArgumentChecker.notNull(priority, "priority");
ArgumentChecker.notNull(equityOptionMethod, "No CalculationMethod provided for " + FinancialSecurityTypes.EQUITY_OPTION_SECURITY);
ArgumentChecker.notNull(equityIndexOptionMethod, "No CalculationMethod provided for " + FinancialSecurityTypes.EQUITY_INDEX_OPTION_SECURITY);
ArgumentChecker.notNull(equityIndexFutureOptionMethod, "No CalculationMethod provided for " + FinancialSecurityTypes.EQUITY_INDEX_FUTURE_OPTION_SECURITY);
ArgumentChecker.notNull(equityBarrierOptionMethod, "No CalculationMethod provided for " + FinancialSecurityTypes.EQUITY_BARRIER_OPTION_SECURITY);
_priority = PriorityClass.valueOf(priority);
_equityOptionMethod = Collections.singleton(equityOptionMethod);
_equityIndexOptionMethod = Collections.singleton(equityIndexOptionMethod);
_equityIndexFutureOptionMethod = Collections.singleton(equityIndexFutureOptionMethod);
_equityBarrierOptionMethod = Collections.singleton(equityBarrierOptionMethod);
}
public EquityOptionCalculationMethodDefaultFunction(final String priority,
final String equityOptionMethod, final String equityIndexOptionMethod,
final String equityIndexFutureOptionMethod) {
super(FinancialSecurityTypes.EQUITY_OPTION_SECURITY.or(FinancialSecurityTypes.EQUITY_INDEX_OPTION_SECURITY)
.or(FinancialSecurityTypes.EQUITY_INDEX_FUTURE_OPTION_SECURITY).or(FinancialSecurityTypes.EQUITY_BARRIER_OPTION_SECURITY), ValuePropertyNames.CALCULATION_METHOD,
true, VALUE_REQUIREMENTS);
ArgumentChecker.notNull(priority, "priority");
ArgumentChecker.notNull(equityOptionMethod, "No CalculationMethod provided for " + FinancialSecurityTypes.EQUITY_OPTION_SECURITY);
ArgumentChecker.notNull(equityIndexOptionMethod, "No CalculationMethod provided for " + FinancialSecurityTypes.EQUITY_INDEX_OPTION_SECURITY);
ArgumentChecker.notNull(equityIndexFutureOptionMethod, "No CalculationMethod provided for " + FinancialSecurityTypes.EQUITY_INDEX_FUTURE_OPTION_SECURITY);
_priority = PriorityClass.valueOf(priority);
_equityOptionMethod = Collections.singleton(equityOptionMethod);
_equityIndexOptionMethod = Collections.singleton(equityIndexOptionMethod);
_equityIndexFutureOptionMethod = Collections.singleton(equityIndexFutureOptionMethod);
_equityBarrierOptionMethod = Collections.singleton(equityOptionMethod);
}
/**
* All Equity Option types to be priced with the same CalculationMethod
*
* @param priority Default priority
* @param calculationMethod The single calculation method to be used for all Equity Options. e.g. BjerksundStenslandMethod. See CalculationPropertyNamesAndValues for more.
*/
public EquityOptionCalculationMethodDefaultFunction(final String priority, final String calculationMethod) {
super(FinancialSecurityTypes.EQUITY_OPTION_SECURITY.or(FinancialSecurityTypes.EQUITY_INDEX_OPTION_SECURITY)
.or(FinancialSecurityTypes.EQUITY_INDEX_FUTURE_OPTION_SECURITY).or(FinancialSecurityTypes.EQUITY_BARRIER_OPTION_SECURITY), ValuePropertyNames.CALCULATION_METHOD,
true, VALUE_REQUIREMENTS);
ArgumentChecker.notNull(priority, "priority");
ArgumentChecker.notNull(calculationMethod, "No CalculationMethod provided");
_priority = PriorityClass.valueOf(priority);
_equityOptionMethod = Collections.singleton(calculationMethod);
_equityIndexOptionMethod = Collections.singleton(calculationMethod);
_equityIndexFutureOptionMethod = Collections.singleton(calculationMethod);
_equityBarrierOptionMethod = Collections.singleton(calculationMethod);
}
@Override
protected Set<String> getDefaultValue(FunctionCompilationContext context, ComputationTarget target, ValueRequirement desiredValue) {
final Security security = target.getSecurity();
if (security instanceof EquityOptionSecurity) {
return _equityOptionMethod;
}
if (security instanceof EquityIndexOptionSecurity) {
return _equityIndexOptionMethod;
}
if (security instanceof EquityIndexFutureOptionSecurity) {
return _equityIndexFutureOptionMethod;
}
if (security instanceof EquityBarrierOptionSecurity) {
return _equityBarrierOptionMethod;
}
return null;
}
@Override
public String getMutualExclusionGroup() {
return OpenGammaFunctionExclusions.CALCULATION_METHOD_DEFAULTS;
}
}