Package com.opengamma.financial.analytics.model.riskfactor.option

Source Code of com.opengamma.financial.analytics.model.riskfactor.option.UnderlyingTimeSeriesProvider

/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.riskfactor.option;

import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.greeks.AbstractGreekVisitor;
import com.opengamma.analytics.financial.greeks.Greek;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.financial.analytics.timeseries.DateConstraint;
import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesFunctionUtils;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityVisitorAdapter;
import com.opengamma.financial.security.option.EquityIndexOptionSecurity;
import com.opengamma.financial.security.option.EquityOptionSecurity;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver;
import com.opengamma.util.ArgumentChecker;

/**
*
*/
public class UnderlyingTimeSeriesProvider {

  private static final FieldGreekVisitor FIELD_VISITOR = new FieldGreekVisitor();

  private final HistoricalTimeSeriesResolver _timeSeriesResolver;
  private final String _resolutionKey;
  private final UnderlyingFinancialSecurityVisitor _securityVisitor;

  public UnderlyingTimeSeriesProvider(final HistoricalTimeSeriesResolver timeSeriesResolver, final String resolutionKey, final SecuritySource securitySource) {
    ArgumentChecker.notNull(timeSeriesResolver, "timeSeriesResolver");
    ArgumentChecker.notNull(resolutionKey, "resolutionLey");
    ArgumentChecker.notNull(securitySource, "securitySource");
    _timeSeriesResolver = timeSeriesResolver;
    _resolutionKey = resolutionKey;
    _securityVisitor = new UnderlyingFinancialSecurityVisitor(securitySource);
  }

  private HistoricalTimeSeriesResolver getTimeSeriesResolver() {
    return _timeSeriesResolver;
  }

  private String getResolutionKey() {
    return _resolutionKey;
  }

  private UnderlyingFinancialSecurityVisitor getSecurityVisitor() {
    return _securityVisitor;
  }

  public ValueRequirement getSeriesRequirement(final Greek greek, final FinancialSecurity security) {
    return getSeriesRequirement(greek, security, DateConstraint.NULL, DateConstraint.VALUATION_TIME);
  }

  public ValueRequirement getSeriesRequirement(final Greek greek, final FinancialSecurity security, final DateConstraint startDate, final DateConstraint endDate) {
    final String fieldName = greek.accept(FIELD_VISITOR);
    final ExternalIdBundle underlyingId = security.accept(getSecurityVisitor());
    final HistoricalTimeSeriesResolutionResult timeSeries = getTimeSeriesResolver().resolve(underlyingId, null, null, null, fieldName, getResolutionKey());
    if (timeSeries == null) {
      throw new OpenGammaRuntimeException("Could not resolve time series for " + underlyingId + " for security " + security + " for " + getResolutionKey() + "/" + fieldName);
    }
    return HistoricalTimeSeriesFunctionUtils.createHTSRequirement(timeSeries, fieldName, startDate, true, endDate, true);
  }

  private static class FieldGreekVisitor extends AbstractGreekVisitor<String> {

    public FieldGreekVisitor() {
    }

    @Override
    public String visitDelta() {
      return MarketDataRequirementNames.MARKET_VALUE;
    }

    @Override
    public String visitGamma() {
      return MarketDataRequirementNames.MARKET_VALUE;
    }
  }

  private class UnderlyingFinancialSecurityVisitor extends FinancialSecurityVisitorAdapter<ExternalIdBundle> {
    private final SecuritySource _securitySource;

    public UnderlyingFinancialSecurityVisitor(final SecuritySource securitySource) {
      _securitySource = securitySource;
    }

    @Override
    public ExternalIdBundle visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) {
      return _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())).getExternalIdBundle();
    }

    @Override
    public ExternalIdBundle visitEquityOptionSecurity(final EquityOptionSecurity security) {
      Security underlyingSecurity = _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId()));
      if (underlyingSecurity == null) {
        throw new NullPointerException("Unable to obtain underlying security for " + security.getUnderlyingId());
      }
      return underlyingSecurity.getExternalIdBundle();
    }

  }
}
TOP

Related Classes of com.opengamma.financial.analytics.model.riskfactor.option.UnderlyingTimeSeriesProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.