/**
* Copyright (C) 2011 - 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.Collections;
import java.util.Map;
import com.opengamma.core.config.impl.ConfigItem;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.financial.analytics.model.InstrumentTypeProperties;
import com.opengamma.financial.analytics.volatility.surface.BloombergFXOptionVolatilitySurfaceInstrumentProvider.FXVolQuoteType;
import com.opengamma.master.config.ConfigMaster;
import com.opengamma.master.config.ConfigMasterUtils;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.UnorderedCurrencyPair;
import com.opengamma.util.time.Tenor;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
* Populates the {@link ConfigMaster} with FX option volatility surface definitions and specifications. The
* surfaces are quoted in ATM / risk-reversal / butterfly form and uses Bloomberg tickers.
*/
public class FXOptionVolatilitySurfaceConfigPopulator {
/** The separator */
private static final String SEPARATOR = "_";
/** The tenors */
private static final Tenor[] EXPIRIES = new Tenor[] {Tenor.ofDays(7), Tenor.ofDays(14), Tenor.ofDays(21), Tenor.ofMonths(1),
Tenor.ofMonths(3), Tenor.ofMonths(6), Tenor.ofMonths(9), Tenor.ofYears(1),
Tenor.ofYears(5), Tenor.ofYears(10)};
/** The y-axis */
@SuppressWarnings("unchecked")
private static final Pair<Number, FXVolQuoteType>[] YS = new Pair[] {Pairs.of(25, FXVolQuoteType.BUTTERFLY), Pairs.of(25, FXVolQuoteType.RISK_REVERSAL),
Pairs.of(15, FXVolQuoteType.BUTTERFLY), Pairs.of(15, FXVolQuoteType.RISK_REVERSAL),
Pairs.of(0, FXVolQuoteType.ATM)};
/**
* @param configMaster The configuration master, not null
*/
public FXOptionVolatilitySurfaceConfigPopulator(final ConfigMaster configMaster) {
ArgumentChecker.notNull(configMaster, "configuration master");
populateVolatilitySurfaceConfigMaster(configMaster);
}
/**
* Populates the configuration master with a single EUR/USD surface definition and specification called DEFAULT.
* @param configMaster The configuration master, not null
* @return The populated configuration master
*/
public static ConfigMaster populateVolatilitySurfaceConfigMaster(final ConfigMaster configMaster) {
return populateVolatilitySurfaceConfigMaster(configMaster, Collections.singletonMap(UnorderedCurrencyPair.of(Currency.EUR, Currency.USD), "DEFAULT"));
}
/**
* Populates the configuration master with surfaces.
* @param configMaster The configuration master, not null
* @param pairsAndNames A map of currency pairs to surface names, not null
* @return The populated configuration master
*/
public static ConfigMaster populateVolatilitySurfaceConfigMaster(final ConfigMaster configMaster, final Map<UnorderedCurrencyPair, String> pairsAndNames) {
ArgumentChecker.notNull(configMaster, "configuration master");
ArgumentChecker.notNull(pairsAndNames, "pairs and names");
for (final Map.Entry<UnorderedCurrencyPair, String> entry : pairsAndNames.entrySet()) {
populateVolatilitySurfaceSpecifications(configMaster, entry.getKey(), entry.getValue());
populateVolatilitySurfaceDefinitions(configMaster, entry.getKey(), entry.getValue());
}
return configMaster;
}
private static void populateVolatilitySurfaceDefinitions(final ConfigMaster configMaster, final UnorderedCurrencyPair target, final String name) {
final String fullName = name + SEPARATOR + target.toString() + SEPARATOR + InstrumentTypeProperties.FOREX;
final VolatilitySurfaceDefinition<Tenor, Pair<Number, FXVolQuoteType>> volSurfaceDefinition = new VolatilitySurfaceDefinition<>(fullName, target, EXPIRIES, YS);
ConfigMasterUtils.storeByName(configMaster, makeConfig(volSurfaceDefinition));
}
private static void populateVolatilitySurfaceSpecifications(final ConfigMaster configMaster, final UnorderedCurrencyPair target, final String name) {
final SurfaceInstrumentProvider<Tenor, Pair<Number, FXVolQuoteType>> surfaceInstrumentProvider = new BloombergFXOptionVolatilitySurfaceInstrumentProvider(target.toString(), "Curncy",
MarketDataRequirementNames.MARKET_VALUE, ExternalSchemes.BLOOMBERG_TICKER_WEAK.getName());
final String fullName = name + SEPARATOR + target.toString() + SEPARATOR + InstrumentTypeProperties.FOREX;
final VolatilitySurfaceSpecification spec = new VolatilitySurfaceSpecification(fullName, target, SurfaceAndCubeQuoteType.MARKET_STRANGLE_RISK_REVERSAL, surfaceInstrumentProvider);
ConfigMasterUtils.storeByName(configMaster, makeConfig(spec));
}
private static ConfigItem<VolatilitySurfaceDefinition<Tenor, Pair<Number, FXVolQuoteType>>> makeConfig(final VolatilitySurfaceDefinition<Tenor, Pair<Number, FXVolQuoteType>> definition) {
final ConfigItem<VolatilitySurfaceDefinition<Tenor, Pair<Number, FXVolQuoteType>>> config = ConfigItem.of(definition);
config.setName(definition.getName());
return config;
}
private static ConfigItem<VolatilitySurfaceSpecification> makeConfig(final VolatilitySurfaceSpecification specification) {
final ConfigItem<VolatilitySurfaceSpecification> config = ConfigItem.of(specification);
config.setName(specification.getName());
return config;
}
}