/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.equity.varianceswap; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; import com.opengamma.analytics.financial.equity.EquityDerivativeSensitivityCalculator; import com.opengamma.analytics.financial.equity.StaticReplicationDataBundle; import com.opengamma.analytics.financial.equity.variance.VarianceSwapPresentValueCalculator; import com.opengamma.analytics.financial.varianceswap.VarianceSwap; import com.opengamma.analytics.math.surface.NodalDoublesSurface; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.function.FunctionInputs; import com.opengamma.engine.value.ComputedValue; import com.opengamma.engine.value.ValueProperties; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueRequirementNames; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.financial.analytics.DoubleLabelledMatrix2D; import com.opengamma.financial.analytics.model.InstrumentTypeProperties; import com.opengamma.financial.security.equity.EquityVarianceSwapSecurity; /** * */ public class EquityVarianceSwapStaticReplicationVegaFunction extends EquityVarianceSwapStaticReplicationFunction { private static final EquityDerivativeSensitivityCalculator CALCULATOR = new EquityDerivativeSensitivityCalculator(VarianceSwapPresentValueCalculator.getInstance()); public EquityVarianceSwapStaticReplicationVegaFunction() { super(ValueRequirementNames.VEGA_QUOTE_MATRIX); } @Override protected Set<ComputedValue> computeValues(final ValueSpecification resultSpec, final FunctionInputs inputs, final VarianceSwap derivative, final StaticReplicationDataBundle market) { final NodalDoublesSurface vegaSurface = CALCULATOR.calcBlackVegaForEntireSurface(derivative, market); final Double[] xValues = vegaSurface.getXData(); final Double[] yValues = vegaSurface.getYData(); final Set<Double> xSet = new HashSet<Double>(Arrays.asList(xValues)); final Set<Double> ySet = new HashSet<Double>(Arrays.asList(yValues)); final Double[] uniqueX = xSet.toArray(new Double[0]); final Double[] uniqueY = ySet.toArray(new Double[0]); final double[][] values = new double[ySet.size()][xSet.size()]; int i = 0; for (final Double x : xSet) { int j = 0; for (final Double y : ySet) { double vega; try { vega = vegaSurface.getZValue(x, y); } catch (final IllegalArgumentException e) { vega = 0; } values[j++][i] = vega; } i++; } final DoubleLabelledMatrix2D matrix = new DoubleLabelledMatrix2D(uniqueX, uniqueY, values); return Collections.singleton(new ComputedValue(resultSpec, matrix)); } @Override protected ValueSpecification getValueSpecification(final ComputationTarget target) { final EquityVarianceSwapSecurity security = (EquityVarianceSwapSecurity) target.getSecurity(); final ValueProperties properties = createValueProperties() .with(ValuePropertyNames.CURRENCY, security.getCurrency().getCode()) .withAny(ValuePropertyNames.CURVE) .withAny(ValuePropertyNames.CURVE_CALCULATION_CONFIG) .withAny(ValuePropertyNames.SURFACE) .with(InstrumentTypeProperties.PROPERTY_SURFACE_INSTRUMENT_TYPE, InstrumentTypeProperties.EQUITY_OPTION) .with(ValuePropertyNames.CALCULATION_METHOD, CALCULATION_METHOD) .get(); return new ValueSpecification(ValueRequirementNames.VEGA_QUOTE_MATRIX, target.toSpecification(), properties); } @Override protected ValueSpecification getValueSpecification(final ComputationTarget target, final String curveName, final String curveCalculationConfig, final String surfaceName) { final EquityVarianceSwapSecurity security = (EquityVarianceSwapSecurity) target.getSecurity(); final ValueProperties properties = createValueProperties() .with(ValuePropertyNames.CURRENCY, security.getCurrency().getCode()) .with(ValuePropertyNames.CURVE, curveName) .with(ValuePropertyNames.CURVE_CALCULATION_CONFIG, curveCalculationConfig) .with(ValuePropertyNames.SURFACE, surfaceName) .with(InstrumentTypeProperties.PROPERTY_SURFACE_INSTRUMENT_TYPE, InstrumentTypeProperties.EQUITY_OPTION) .with(ValuePropertyNames.CALCULATION_METHOD, CALCULATION_METHOD) .get(); return new ValueSpecification(ValueRequirementNames.VEGA_QUOTE_MATRIX, target.toSpecification(), properties); } }