/** * Copyright (C) 2014 - 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.analytics.financial.equity.EqyOptRollGeskeWhaleyImpliedVolatilityCalculator; import com.opengamma.analytics.financial.equity.StaticReplicationDataBundle; import com.opengamma.analytics.financial.interestrate.InstrumentDerivative; import com.opengamma.core.value.MarketDataRequirementNames; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.function.FunctionCompilationContext; import com.opengamma.engine.function.FunctionInputs; import com.opengamma.engine.target.ComputationTargetReference; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ComputedValue; import com.opengamma.engine.value.ValueProperties; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueRequirementNames; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.financial.security.FinancialSecurity; /** * */ public class ListedEquityOptionRollGeskeWhaleyImpliedVolFunction extends ListedEquityOptionRollGeskeWhaleyFunction { /** The logger */ private static final Logger s_logger = LoggerFactory.getLogger(ListedEquityOptionRollGeskeWhaleyImpliedVolFunction.class); /** * Implied volatility calculator */ private static final EqyOptRollGeskeWhaleyImpliedVolatilityCalculator s_volCalculator = EqyOptRollGeskeWhaleyImpliedVolatilityCalculator.getInstance(); /** Default constructor */ public ListedEquityOptionRollGeskeWhaleyImpliedVolFunction() { super(ValueRequirementNames.IMPLIED_VOLATILITY); } @Override protected Set<ComputedValue> computeValues(final InstrumentDerivative derivative, final StaticReplicationDataBundle market, final FunctionInputs inputs, final Set<ValueRequirement> desiredValues, final ComputationTargetSpecification targetSpec, final ValueProperties resultProperties) { Double marketPrice = null; final ComputedValue mktPriceObj = inputs.getComputedValue(MarketDataRequirementNames.MARKET_VALUE); if (mktPriceObj == null) { s_logger.info(MarketDataRequirementNames.MARKET_VALUE + " not available," + targetSpec); } else { marketPrice = (Double) mktPriceObj.getValue(); } Double impliedVol = null; try { impliedVol = s_volCalculator.getRollGeskeWhaleyImpliedVol(derivative, market, marketPrice); } catch (final IllegalArgumentException e) { s_logger.info(MarketDataRequirementNames.IMPLIED_VOLATILITY + " undefined" + targetSpec); impliedVol = derivative.accept(s_volCalculator, market); } final ValueSpecification resultSpec = new ValueSpecification(getValueRequirementNames()[0], targetSpec, resultProperties); return Collections.singleton(new ComputedValue(resultSpec, impliedVol)); } @Override public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) { final Set<ValueRequirement> requirements = super.getRequirements(context, target, desiredValue); if (requirements == null) { return null; } // Add live market_value of the option final FinancialSecurity security = (FinancialSecurity) target.getSecurity(); final ComputationTargetReference securityTarget = new ComputationTargetSpecification(ComputationTargetType.SECURITY, security.getUniqueId()); final ValueRequirement securityValueReq = new ValueRequirement(MarketDataRequirementNames.MARKET_VALUE, securityTarget); requirements.add(securityValueReq); return requirements; } }