/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.equity; import java.util.Map; import com.opengamma.analytics.financial.equity.StaticReplicationDataBundle; import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve; import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve; import com.opengamma.analytics.financial.model.volatility.surface.BlackVolatilitySurfaceStrike; import com.opengamma.analytics.financial.model.volatility.surface.VolatilitySurface; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount; import com.opengamma.financial.security.option.EquityIndexOptionSecurity; import com.opengamma.sesame.DiscountingMulticurveCombinerFn; import com.opengamma.sesame.Environment; import com.opengamma.sesame.ForwardCurveFn; import com.opengamma.sesame.MulticurveBundle; import com.opengamma.sesame.marketdata.VolatilitySurfaceId; import com.opengamma.sesame.trade.EquityIndexOptionTrade; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; import com.opengamma.util.result.Result; /** * {@link StaticReplicationDataBundleFn } implementation to return instances of * {@link StaticReplicationDataBundle} with {@link BlackVolatilitySurfaceStrike}. */ public class StrikeDataBundleFn implements StaticReplicationDataBundleFn { private final DiscountingMulticurveCombinerFn _multicurveCombinerFn; private final ForwardCurveFn _forwardCurveFn; /** * Constructors a black volatility provider function for bond future options. * @param discountingMulticurveCombinerFn the discounting multicurve combiner function, not null. * @param forwardCurveFn the function to provide the forward curve, not null. */ public StrikeDataBundleFn(DiscountingMulticurveCombinerFn discountingMulticurveCombinerFn, ForwardCurveFn forwardCurveFn) { _multicurveCombinerFn = ArgumentChecker.notNull(discountingMulticurveCombinerFn, "discountingMulticurveCombinerFn"); _forwardCurveFn = ArgumentChecker.notNull(forwardCurveFn, "forwardCurveFn"); } @Override public Result<StaticReplicationDataBundle> getEquityIndexDataProvider(Environment env, EquityIndexOptionTrade tradeWrapper) { EquityIndexOptionSecurity security = tradeWrapper.getSecurity(); Result<MulticurveBundle> bundleResult = _multicurveCombinerFn.getMulticurveBundle(env, tradeWrapper); String volId = security.getOptionType() + "_" + security.getUnderlyingId().getValue(); Result<VolatilitySurface> surfaceResult = env.getMarketDataBundle().get(VolatilitySurfaceId.of(volId), VolatilitySurface.class); Result<ForwardCurve> forwardResult = _forwardCurveFn.getEquityIndexForwardCurve(env, tradeWrapper); if (Result.allSuccessful(bundleResult, surfaceResult, forwardResult)) { MulticurveProviderDiscount multicurve = bundleResult.getValue().getMulticurveProvider(); VolatilitySurface volSurface = surfaceResult.getValue(); ForwardCurve forwardCurve = forwardResult.getValue(); Map<Currency, YieldAndDiscountCurve> discountingCurves = multicurve.getDiscountingCurves(); YieldAndDiscountCurve discountCurve = discountingCurves.get(security.getCurrency()); BlackVolatilitySurfaceStrike blackVolSurface = new BlackVolatilitySurfaceStrike(volSurface.getSurface()); StaticReplicationDataBundle bundle = new StaticReplicationDataBundle(blackVolSurface, discountCurve, forwardCurve); return Result.success(bundle); } else { return Result.failure(bundleResult, surfaceResult, forwardResult); } } }