/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.volatility.surface; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.Validate; import org.threeten.bp.LocalDate; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.financial.analytics.model.FutureOptionExpiries; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.convention.expirycalc.ExchangeTradedInstrumentExpiryCalculator; import com.opengamma.id.ExternalId; import com.opengamma.util.ArgumentChecker; /** * Provider of equity Future Instrument ID's. */ public class BloombergEquityFuturePriceCurveInstrumentProvider implements FuturePriceCurveInstrumentProvider<Number> { /** * Gets the expiryRules. * @return the expiryRules */ public static Map<?, ?> getExpiryRules() { return EXPIRY_RULES; } private static final HashMap<String, FutureOptionExpiries> EXPIRY_RULES; static { //TODO: Need to check whether indexes can be supported EXPIRY_RULES = new HashMap<>(); // EXPIRY_RULES.put("NKY", FutureOptionExpiries.of(new NextExpiryAdjuster(2, DayOfWeek.THURSDAY))); // EXPIRY_RULES.put("NDX", FutureOptionExpiries.of(new NextExpiryAdjuster(3, DayOfWeek.THURSDAY))); //TODO // EXPIRY_RULES.put("RUT", FutureOptionExpiries.of(new NextExpiryAdjuster(3, DayOfWeek.THURSDAY))); //TODO // EXPIRY_RULES.put("DJX", FutureOptionExpiries.of(new NextExpiryAdjuster(3, DayOfWeek.THURSDAY))); // EXPIRY_RULES.put("SPX", FutureOptionExpiries.of(new NextExpiryAdjuster(3, DayOfWeek.THURSDAY))); // EXPIRY_RULES.put("VIX", FutureOptionExpiries.of(new NextExpiryAdjuster(3, DayOfWeek.THURSDAY, -30))); // check this // EXPIRY_RULES.put("UKX", FutureOptionExpiries.of(new NextExpiryAdjuster(3, DayOfWeek.THURSDAY))); EXPIRY_RULES.put("DEFAULT", FutureOptionExpiries.EQUITY_FUTURE); //TODO DAX, EUROSTOXX 50 (SX5E) } private static final Calendar WEEKDAYS = new MondayToFridayCalendar("MTWThF"); private final String _futurePrefix; private final String _postfix; private final String _dataFieldName; private final String _tickerScheme; private final String _exchange; /** * @param futurePrefix e.g. "AAPL=" * @param postfix generally, "Equity" * @param dataFieldName expecting MarketDataRequirementNames.MARKET_VALUE * @param tickerScheme expecting BLOOMBERG_TICKER_WEAK or BLOOMBERG_TICKER * @param exchange the exchange code e.g. OC */ public BloombergEquityFuturePriceCurveInstrumentProvider(final String futurePrefix, final String postfix, final String dataFieldName, final String tickerScheme, final String exchange) { Validate.notNull(futurePrefix, "future option prefix"); Validate.notNull(postfix, "postfix"); Validate.notNull(dataFieldName, "data field name"); Validate.notNull(tickerScheme, "tickerScheme was null. Try BLOOMBERG_TICKER_WEAK or BLOOMBERG_TICKER"); _futurePrefix = futurePrefix; _postfix = postfix; _dataFieldName = dataFieldName; _tickerScheme = tickerScheme; _exchange = exchange; } /** If a 4th argument is not provided, constructor uses BLOOMBERG_TICKER_WEAK as its ExternalScheme * @param futurePrefix e.g. "AAPL=" * @param postfix generally, "Equity" * @param dataFieldName expecting MarketDataRequirementNames.MARKET_VALUE * @param exchange e.g. "OC" */ public BloombergEquityFuturePriceCurveInstrumentProvider(final String futurePrefix, final String postfix, final String dataFieldName, final String exchange) { Validate.notNull(futurePrefix, "future option prefix"); Validate.notNull(postfix, "postfix"); Validate.notNull(dataFieldName, "data field name"); _futurePrefix = futurePrefix; _postfix = postfix; _dataFieldName = dataFieldName; _tickerScheme = "BLOOMBERG_TICKER_WEAK"; _exchange = exchange; } @Override public ExternalId getInstrument(final Number futureNumber) { throw new OpenGammaRuntimeException("Provider needs a curve date to create interest rate future identifier from futureNumber"); } @Override /** * Provides an ExternalID for Bloomberg ticker, * given a reference date and an integer offset, the n'th subsequent option <p> * The format is prefix + postfix <p> * e.g. AAPL=G3 OC Equity * <p> * @param futureOptionNumber n'th future following curve date, not null * @param curveDate date of future validity; valuation date, not null * @return the id of the Bloomberg ticker */ public ExternalId getInstrument(final Number futureNumber, final LocalDate curveDate) { ArgumentChecker.notNull(futureNumber, "futureOptionNumber"); ArgumentChecker.notNull(curveDate, "curve date"); final StringBuffer ticker = new StringBuffer(); ticker.append(getFuturePrefix()); final ExchangeTradedInstrumentExpiryCalculator expiryRule = getExpiryRuleCalculator(); final LocalDate expiryDate = expiryRule.getExpiryDate(futureNumber.intValue(), curveDate, WEEKDAYS); final String expiryCode = BloombergFutureUtils.getShortExpiryCode(expiryDate); ticker.append(expiryCode); ticker.append(" "); if (getExchange() != null) { ticker.append(getExchange()); ticker.append(" "); } ticker.append(getPostfix()); return ExternalId.of(getTickerScheme(), ticker.toString()); } @Override public ExchangeTradedInstrumentExpiryCalculator getExpiryRuleCalculator() { ExchangeTradedInstrumentExpiryCalculator expiryRule = EXPIRY_RULES.get(getFuturePrefix()); if (expiryRule == null) { expiryRule = EXPIRY_RULES.get("DEFAULT"); } return expiryRule; } public String getFuturePrefix() { return _futurePrefix; } public String getPostfix() { return _postfix; } @Override public String getTickerScheme() { return _tickerScheme; } @Override public String getDataFieldName() { return _dataFieldName; } /** * Gets the exchange. * @return the exchange */ public String getExchange() { return _exchange; } @Override public int hashCode() { return getFuturePrefix().hashCode() + getPostfix().hashCode() + getDataFieldName().hashCode() + getExchange().hashCode(); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (!(obj instanceof BloombergEquityFuturePriceCurveInstrumentProvider)) { return false; } final BloombergEquityFuturePriceCurveInstrumentProvider other = (BloombergEquityFuturePriceCurveInstrumentProvider) obj; return getFuturePrefix().equals(other.getFuturePrefix()) && getPostfix().equals(other.getPostfix()) && getDataFieldName().equals(other.getDataFieldName()) && getExchange().equals(other.getExchange()); } }