/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.ircurve.calcconfig; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import com.opengamma.core.config.impl.ConfigItem; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.financial.analytics.ircurve.StripInstrumentType; import com.opengamma.financial.analytics.model.curve.interestrate.MultiYieldCurvePropertiesAndDefaults; import com.opengamma.master.config.ConfigMaster; import com.opengamma.master.config.ConfigMasterUtils; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * */ public class MultiCurveCalculationConfigPopulator { public MultiCurveCalculationConfigPopulator(final ConfigMaster configMaster) { ArgumentChecker.notNull(configMaster, "config master"); populateConfigMaster(configMaster); } private static void populateConfigMaster(final ConfigMaster configMaster) { final String discountingCurveName = "Discounting"; final String forward3MCurveName = "Forward3M"; final String forward6MCurveName = "Forward6M"; final String forward3MFutCurveName = "Forward3MFut"; final MultiCurveCalculationConfig defaultUSDConfig = new MultiCurveCalculationConfig("DefaultTwoCurveUSDConfig", new String[] {discountingCurveName, forward3MCurveName}, ComputationTargetSpecification.of(Currency.USD), MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING, getTwoCurveUSDInstrumentConfig(discountingCurveName, forward3MCurveName)); final MultiCurveCalculationConfig defaultGBPConfig = new MultiCurveCalculationConfig("DefaultTwoCurveGBPConfig", new String[] {discountingCurveName, forward6MCurveName}, ComputationTargetSpecification.of(Currency.GBP), MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING, getTwoCurveGBPInstrumentConfig(discountingCurveName, forward6MCurveName)); final MultiCurveCalculationConfig defaultEURConfig = new MultiCurveCalculationConfig("DefaultTwoCurveEURConfig", new String[] {discountingCurveName, forward6MCurveName}, ComputationTargetSpecification.of(Currency.EUR), MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING, getTwoCurveEURInstrumentConfig(discountingCurveName, forward6MCurveName)); final MultiCurveCalculationConfig defaultJPYConfig = new MultiCurveCalculationConfig("DefaultTwoCurveJPYConfig", new String[] {discountingCurveName, forward6MCurveName}, ComputationTargetSpecification.of(Currency.JPY), MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING, getTwoCurveJPYInstrumentConfig(discountingCurveName, forward6MCurveName)); final MultiCurveCalculationConfig defaultCHFConfig = new MultiCurveCalculationConfig("DefaultTwoCurveCHFConfig", new String[] {discountingCurveName, forward6MCurveName}, ComputationTargetSpecification.of(Currency.CHF), MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING, getTwoCurveCHFInstrumentConfig(discountingCurveName, forward6MCurveName)); final MultiCurveCalculationConfig eurOIS3M6M = new MultiCurveCalculationConfig("EUR-OIS-3M-6M", new String[] {discountingCurveName, forward3MCurveName, forward6MCurveName}, ComputationTargetSpecification.of(Currency.EUR), MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING, getEUROISInstrumentConfig1(discountingCurveName, forward3MCurveName, forward6MCurveName)); final MultiCurveCalculationConfig eurOIS3MFut6M = new MultiCurveCalculationConfig("EUR-OIS-3MFut-6M", new String[] {discountingCurveName, forward3MFutCurveName, forward6MCurveName}, ComputationTargetSpecification.of(Currency.EUR), MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING, getEUROISFutInstrumentConfig1(discountingCurveName, forward3MFutCurveName, forward6MCurveName)); ConfigMasterUtils.storeByName(configMaster, makeConfig(defaultUSDConfig)); ConfigMasterUtils.storeByName(configMaster, makeConfig(defaultGBPConfig)); ConfigMasterUtils.storeByName(configMaster, makeConfig(defaultEURConfig)); ConfigMasterUtils.storeByName(configMaster, makeConfig(defaultJPYConfig)); ConfigMasterUtils.storeByName(configMaster, makeConfig(defaultCHFConfig)); ConfigMasterUtils.storeByName(configMaster, makeConfig(getAUDThreeCurveConfig())); ConfigMasterUtils.storeByName(configMaster, makeConfig(getAUDDiscountingCurveConfig())); ConfigMasterUtils.storeByName(configMaster, makeConfig(getAUDForwardCurvesConfig())); ConfigMasterUtils.storeByName(configMaster, makeConfig(getSingleAUDCurveConfig())); ConfigMasterUtils.storeByName(configMaster, makeConfig(eurOIS3M6M)); ConfigMasterUtils.storeByName(configMaster, makeConfig(eurOIS3MFut6M)); } private static ConfigItem<MultiCurveCalculationConfig> makeConfig(final MultiCurveCalculationConfig curveConfig) { final ConfigItem<MultiCurveCalculationConfig> config = ConfigItem.of(curveConfig); config.setName(curveConfig.getCalculationConfigName()); return config; } private static LinkedHashMap<String, CurveInstrumentConfig> getTwoCurveUSDInstrumentConfig(final String discountingCurveName, final String forward3MCurveName) { final String[] discountingOnly = new String[] {discountingCurveName}; final String[] forward3MOnly = new String[] {forward3MCurveName}; final String[] discountingForward3M = new String[] {discountingCurveName, forward3MCurveName}; final String[] discountingDiscounting = new String[] {discountingCurveName, discountingCurveName}; final LinkedHashMap<String, CurveInstrumentConfig> result = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, discountingOnly); discountingConfig.put(StripInstrumentType.OIS_SWAP, discountingDiscounting); final Map<StripInstrumentType, String[]> forward3MConfig = new HashMap<>(); forward3MConfig.put(StripInstrumentType.LIBOR, forward3MOnly); forward3MConfig.put(StripInstrumentType.FRA_3M, discountingForward3M); forward3MConfig.put(StripInstrumentType.SWAP_3M, discountingForward3M); result.put(discountingCurveName, new CurveInstrumentConfig(discountingConfig)); result.put(forward3MCurveName, new CurveInstrumentConfig(forward3MConfig)); return result; } private static LinkedHashMap<String, CurveInstrumentConfig> getEUROISInstrumentConfig1(final String discountingCurveName, final String forward3MCurveName, final String forward6MCurveName) { final String[] discountingOnly = new String[] {discountingCurveName}; final String[] forward3MOnly = new String[] {forward3MCurveName}; final String[] forward6MOnly = new String[] {forward6MCurveName}; final String[] discountingForward3M = new String[] {discountingCurveName, forward3MCurveName}; final String[] discountingForward6M = new String[] {discountingCurveName, forward6MCurveName}; final String[] discountingDiscounting = new String[] {discountingCurveName, discountingCurveName}; final LinkedHashMap<String, CurveInstrumentConfig> result = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, discountingOnly); discountingConfig.put(StripInstrumentType.OIS_SWAP, discountingDiscounting); final Map<StripInstrumentType, String[]> forward3MConfig = new HashMap<>(); forward3MConfig.put(StripInstrumentType.EURIBOR, forward3MOnly); forward3MConfig.put(StripInstrumentType.FRA_3M, discountingForward3M); forward3MConfig.put(StripInstrumentType.SWAP_3M, discountingForward3M); final Map<StripInstrumentType, String[]> forward6MConfig = new HashMap<>(); forward6MConfig.put(StripInstrumentType.EURIBOR, forward6MOnly); forward6MConfig.put(StripInstrumentType.FRA_6M, discountingForward6M); forward6MConfig.put(StripInstrumentType.SWAP_6M, discountingForward6M); result.put(discountingCurveName, new CurveInstrumentConfig(discountingConfig)); result.put(forward3MCurveName, new CurveInstrumentConfig(forward3MConfig)); result.put(forward6MCurveName, new CurveInstrumentConfig(forward6MConfig)); return result; } private static LinkedHashMap<String, CurveInstrumentConfig> getEUROISFutInstrumentConfig1(final String discountingCurveName, final String forward3MCurveName, final String forward6MCurveName) { final String[] discountingOnly = new String[] {discountingCurveName}; final String[] forward3MOnly = new String[] {forward3MCurveName}; final String[] forward6MOnly = new String[] {forward6MCurveName}; final String[] discountingForward3M = new String[] {discountingCurveName, forward3MCurveName}; final String[] discountingForward6M = new String[] {discountingCurveName, forward6MCurveName}; final String[] discountingDiscounting = new String[] {discountingCurveName, discountingCurveName}; final LinkedHashMap<String, CurveInstrumentConfig> result = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, discountingOnly); discountingConfig.put(StripInstrumentType.OIS_SWAP, discountingDiscounting); final Map<StripInstrumentType, String[]> forward3MConfig = new HashMap<>(); forward3MConfig.put(StripInstrumentType.EURIBOR, forward3MOnly); forward3MConfig.put(StripInstrumentType.FRA_3M, discountingForward3M); forward3MConfig.put(StripInstrumentType.FUTURE, discountingForward3M); forward3MConfig.put(StripInstrumentType.SWAP_3M, discountingForward3M); final Map<StripInstrumentType, String[]> forward6MConfig = new HashMap<>(); forward6MConfig.put(StripInstrumentType.EURIBOR, forward6MOnly); forward6MConfig.put(StripInstrumentType.FRA_6M, discountingForward6M); forward6MConfig.put(StripInstrumentType.SWAP_6M, discountingForward6M); result.put(discountingCurveName, new CurveInstrumentConfig(discountingConfig)); result.put(forward3MCurveName, new CurveInstrumentConfig(forward3MConfig)); result.put(forward6MCurveName, new CurveInstrumentConfig(forward6MConfig)); return result; } private static LinkedHashMap<String, CurveInstrumentConfig> getTwoCurveGBPInstrumentConfig(final String discountingCurveName, final String forward6MCurveName) { final String[] discountingOnly = new String[] {discountingCurveName}; final String[] forward6MOnly = new String[] {forward6MCurveName}; final String[] discountingForward6M = new String[] {discountingCurveName, forward6MCurveName}; final String[] discountingDiscounting = new String[] {discountingCurveName, discountingCurveName}; final LinkedHashMap<String, CurveInstrumentConfig> result = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, discountingOnly); discountingConfig.put(StripInstrumentType.OIS_SWAP, discountingDiscounting); final Map<StripInstrumentType, String[]> forward6MConfig = new HashMap<>(); forward6MConfig.put(StripInstrumentType.LIBOR, forward6MOnly); forward6MConfig.put(StripInstrumentType.FRA_6M, discountingForward6M); forward6MConfig.put(StripInstrumentType.SWAP_6M, discountingForward6M); result.put(discountingCurveName, new CurveInstrumentConfig(discountingConfig)); result.put(forward6MCurveName, new CurveInstrumentConfig(forward6MConfig)); return result; } private static LinkedHashMap<String, CurveInstrumentConfig> getTwoCurveEURInstrumentConfig(final String discountingCurveName, final String forward6MCurveName) { final String[] discountingOnly = new String[] {discountingCurveName}; final String[] forward6MOnly = new String[] {forward6MCurveName}; final String[] discountingForward6M = new String[] {discountingCurveName, forward6MCurveName}; final String[] discountingDiscounting = new String[] {discountingCurveName, discountingCurveName}; final LinkedHashMap<String, CurveInstrumentConfig> result = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, discountingOnly); discountingConfig.put(StripInstrumentType.OIS_SWAP, discountingDiscounting); final Map<StripInstrumentType, String[]> forward6MConfig = new HashMap<>(); forward6MConfig.put(StripInstrumentType.EURIBOR, forward6MOnly); forward6MConfig.put(StripInstrumentType.FRA_6M, discountingForward6M); forward6MConfig.put(StripInstrumentType.SWAP_6M, discountingForward6M); result.put(discountingCurveName, new CurveInstrumentConfig(discountingConfig)); result.put(forward6MCurveName, new CurveInstrumentConfig(forward6MConfig)); return result; } private static LinkedHashMap<String, CurveInstrumentConfig> getTwoCurveJPYInstrumentConfig(final String discountingCurveName, final String forward6MCurveName) { final String[] discountingOnly = new String[] {discountingCurveName}; final String[] forward6MOnly = new String[] {forward6MCurveName}; final String[] discountingForward6M = new String[] {discountingCurveName, forward6MCurveName}; final String[] discountingDiscounting = new String[] {discountingCurveName, discountingCurveName}; final LinkedHashMap<String, CurveInstrumentConfig> result = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, discountingOnly); discountingConfig.put(StripInstrumentType.OIS_SWAP, discountingDiscounting); final Map<StripInstrumentType, String[]> forward3MConfig = new HashMap<>(); forward3MConfig.put(StripInstrumentType.LIBOR, forward6MOnly); forward3MConfig.put(StripInstrumentType.FRA_6M, discountingForward6M); forward3MConfig.put(StripInstrumentType.SWAP_6M, discountingForward6M); result.put(discountingCurveName, new CurveInstrumentConfig(discountingConfig)); result.put(forward6MCurveName, new CurveInstrumentConfig(forward3MConfig)); return result; } private static LinkedHashMap<String, CurveInstrumentConfig> getTwoCurveCHFInstrumentConfig(final String discountingCurveName, final String forward6MCurveName) { final String[] discountingOnly = new String[] {discountingCurveName}; final String[] forward6MOnly = new String[] {forward6MCurveName}; final String[] discountingForward6M = new String[] {discountingCurveName, forward6MCurveName}; final String[] discountingDiscounting = new String[] {discountingCurveName, discountingCurveName}; final LinkedHashMap<String, CurveInstrumentConfig> result = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, discountingOnly); discountingConfig.put(StripInstrumentType.OIS_SWAP, discountingDiscounting); final Map<StripInstrumentType, String[]> forward3MConfig = new HashMap<>(); forward3MConfig.put(StripInstrumentType.LIBOR, forward6MOnly); forward3MConfig.put(StripInstrumentType.FRA_6M, discountingForward6M); forward3MConfig.put(StripInstrumentType.SWAP_6M, discountingForward6M); result.put(discountingCurveName, new CurveInstrumentConfig(discountingConfig)); result.put(forward6MCurveName, new CurveInstrumentConfig(forward3MConfig)); return result; } private static MultiCurveCalculationConfig getAUDThreeCurveConfig() { final String[] yieldCurveNames = new String[] {"Discounting", "ForwardBasis3M", "ForwardBasis6M"}; final Currency target = Currency.AUD; final String calculationMethod = MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING; final LinkedHashMap<String, CurveInstrumentConfig> curveExposuresForInstruments = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, new String[] {"Discounting"}); discountingConfig.put(StripInstrumentType.OIS_SWAP, new String[] {"Discounting", "Discounting"}); final Map<StripInstrumentType, String[]> forwardBasis3MConfig = new HashMap<>(); forwardBasis3MConfig.put(StripInstrumentType.BASIS_SWAP, new String[] {"Discounting", "ForwardBasis3M", "ForwardBasis6M"}); forwardBasis3MConfig.put(StripInstrumentType.SWAP_3M, new String[] {"Discounting", "ForwardBasis3M"}); forwardBasis3MConfig.put(StripInstrumentType.LIBOR, new String[] {"ForwardBasis3M"}); final Map<StripInstrumentType, String[]> forwardBasis6MConfig = new HashMap<>(); forwardBasis6MConfig.put(StripInstrumentType.BASIS_SWAP, new String[] {"Discounting", "ForwardBasis3M", "ForwardBasis6M"}); forwardBasis6MConfig.put(StripInstrumentType.SWAP_6M, new String[] {"Discounting", "ForwardBasis6M"}); forwardBasis6MConfig.put(StripInstrumentType.LIBOR, new String[] {"ForwardBasis6M"}); curveExposuresForInstruments.put("Discounting", new CurveInstrumentConfig(discountingConfig)); curveExposuresForInstruments.put("ForwardBasis3M", new CurveInstrumentConfig(forwardBasis3MConfig)); curveExposuresForInstruments.put("ForwardBasis6M", new CurveInstrumentConfig(forwardBasis6MConfig)); return new MultiCurveCalculationConfig("DefaultThreeCurveAUDConfig", yieldCurveNames, ComputationTargetSpecification.of(target), calculationMethod, curveExposuresForInstruments); } private static MultiCurveCalculationConfig getAUDDiscountingCurveConfig() { final String[] yieldCurveNames = new String[] {"Discounting"}; final Currency target = Currency.AUD; final String calculationMethod = MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING; final LinkedHashMap<String, CurveInstrumentConfig> curveExposuresForInstruments = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> discountingConfig = new HashMap<>(); discountingConfig.put(StripInstrumentType.CASH, new String[] {"Discounting"}); discountingConfig.put(StripInstrumentType.OIS_SWAP, new String[] {"Discounting", "Discounting"}); curveExposuresForInstruments.put("Discounting", new CurveInstrumentConfig(discountingConfig)); return new MultiCurveCalculationConfig("DiscountingAUDConfig", yieldCurveNames, ComputationTargetSpecification.of(target), calculationMethod, curveExposuresForInstruments); } private static MultiCurveCalculationConfig getAUDForwardCurvesConfig() { final String[] yieldCurveNames = new String[] {"ForwardBasis3M", "ForwardBasis6M"}; final Currency target = Currency.AUD; final String calculationMethod = MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING; final LinkedHashMap<String, CurveInstrumentConfig> curveExposuresForInstruments = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> forwardBasis3MConfig = new HashMap<>(); forwardBasis3MConfig.put(StripInstrumentType.BASIS_SWAP, new String[] {"Discounting", "ForwardBasis3M", "ForwardBasis6M"}); forwardBasis3MConfig.put(StripInstrumentType.SWAP_3M, new String[] {"Discounting", "ForwardBasis3M"}); forwardBasis3MConfig.put(StripInstrumentType.LIBOR, new String[] {"ForwardBasis3M"}); final Map<StripInstrumentType, String[]> forwardBasis6MConfig = new HashMap<>(); forwardBasis6MConfig.put(StripInstrumentType.BASIS_SWAP, new String[] {"Discounting", "ForwardBasis3M", "ForwardBasis6M"}); forwardBasis6MConfig.put(StripInstrumentType.SWAP_6M, new String[] {"Discounting", "ForwardBasis6M"}); forwardBasis6MConfig.put(StripInstrumentType.LIBOR, new String[] {"ForwardBasis6M"}); curveExposuresForInstruments.put("ForwardBasis3M", new CurveInstrumentConfig(forwardBasis3MConfig)); curveExposuresForInstruments.put("ForwardBasis6M", new CurveInstrumentConfig(forwardBasis6MConfig)); final LinkedHashMap<String, String[]> exogenousConfigAndCurveNames = new LinkedHashMap<>(); exogenousConfigAndCurveNames.put("DiscountingAUDConfig", new String[] {"Discounting"}); return new MultiCurveCalculationConfig("ForwardFromDiscountingAUDConfig", yieldCurveNames, ComputationTargetSpecification.of(target), calculationMethod, curveExposuresForInstruments, exogenousConfigAndCurveNames); } private static MultiCurveCalculationConfig getSingleAUDCurveConfig() { final String[] yieldCurveNames = new String[] {"Single"}; final String[] twoCurveNames = new String[] {"Single", "Single"}; final Currency target = Currency.AUD; final String calculationMethod = MultiYieldCurvePropertiesAndDefaults.PAR_RATE_STRING; final LinkedHashMap<String, CurveInstrumentConfig> curveExposuresForInstruments = new LinkedHashMap<>(); final Map<StripInstrumentType, String[]> singleConfig = new HashMap<>(); singleConfig.put(StripInstrumentType.FUTURE, twoCurveNames); singleConfig.put(StripInstrumentType.CASH, yieldCurveNames); singleConfig.put(StripInstrumentType.SWAP_3M, twoCurveNames); singleConfig.put(StripInstrumentType.SWAP_6M, twoCurveNames); curveExposuresForInstruments.put("Single", new CurveInstrumentConfig(singleConfig)); return new MultiCurveCalculationConfig("SingleAUDConfig", yieldCurveNames, ComputationTargetSpecification.of(target), calculationMethod, curveExposuresForInstruments); } }