/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.ircurve; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.threeten.bp.LocalDate; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.analytics.math.interpolation.CombinedInterpolatorExtrapolatorFactory; import com.opengamma.analytics.math.interpolation.Interpolator1D; import com.opengamma.core.config.ConfigSource; import com.opengamma.id.ExternalId; import com.opengamma.id.VersionCorrection; /** * */ public class ConfigDBInterpolatedYieldCurveSpecificationBuilder implements InterpolatedYieldCurveSpecificationBuilder { private final ConfigSource _configSource; public ConfigDBInterpolatedYieldCurveSpecificationBuilder(final ConfigSource configSource) { _configSource = configSource; } // This is factored out into a method so it's easier to remove if we want to disable caching. private CurveSpecificationBuilderConfiguration getBuilderConfig(final Map<String, CurveSpecificationBuilderConfiguration> cache, final String conventionName, final VersionCorrection version) { CurveSpecificationBuilderConfiguration builderSpecDoc = cache.get(conventionName); if (builderSpecDoc != null) { return builderSpecDoc; } builderSpecDoc = _configSource.getSingle(CurveSpecificationBuilderConfiguration.class, conventionName, version); if (builderSpecDoc != null) { cache.put(conventionName, builderSpecDoc); } return builderSpecDoc; } @Override public InterpolatedYieldCurveSpecification buildCurve(final LocalDate curveDate, final YieldCurveDefinition curveDefinition, final VersionCorrection version) { try { final Map<String, CurveSpecificationBuilderConfiguration> cache = new HashMap<>(); final Collection<FixedIncomeStripWithIdentifier> securities = new ArrayList<>(); for (final FixedIncomeStrip strip : curveDefinition.getStrips()) { final String conventionName = strip.getConventionName() + "_" + curveDefinition.getCurrency().getCode(); final CurveSpecificationBuilderConfiguration builderConfig = getBuilderConfig(cache, conventionName, version); if (builderConfig == null) { throw new OpenGammaRuntimeException("Could not get specification builder configuration for curve=" + curveDefinition.getName() + ", currency=" + curveDefinition.getCurrency() + ", strip=" + strip); } ExternalId identifier; switch (strip.getInstrumentType()) { case CASH: identifier = builderConfig.getCashSecurity(curveDate, strip.getCurveNodePointTime()); break; case FRA_3M: identifier = builderConfig.getFRA3MSecurity(curveDate, strip.getCurveNodePointTime()); break; case FRA_6M: identifier = builderConfig.getFRA6MSecurity(curveDate, strip.getCurveNodePointTime()); break; case FRA: // assume that all old FRAs are 3m - shouldn't be used but just for consistency identifier = builderConfig.getFRA3MSecurity(curveDate, strip.getCurveNodePointTime()); break; case FUTURE: identifier = builderConfig.getFutureSecurity(curveDate, strip.getCurveNodePointTime(), strip.getNumberOfFuturesAfterTenor()); break; case LIBOR: //TODO is this right? It seems that we should have a generic IBOR strip. We will need to think about how we deal with *ibor providers identifier = builderConfig.getLiborSecurity(curveDate, strip.getCurveNodePointTime()); break; case EURIBOR: identifier = builderConfig.getEuriborSecurity(curveDate, strip.getCurveNodePointTime()); break; case CDOR: identifier = builderConfig.getCDORSecurity(curveDate, strip.getCurveNodePointTime()); break; case CIBOR: identifier = builderConfig.getCiborSecurity(curveDate, strip.getCurveNodePointTime()); break; case STIBOR: identifier = builderConfig.getStiborSecurity(curveDate, strip.getCurveNodePointTime()); break; case SWAP_3M: identifier = builderConfig.getSwap3MSecurity(curveDate, strip.getCurveNodePointTime()); break; case SWAP_6M: identifier = builderConfig.getSwap6MSecurity(curveDate, strip.getCurveNodePointTime()); break; case SWAP_12M: identifier = builderConfig.getSwap12MSecurity(curveDate, strip.getCurveNodePointTime()); break; case SWAP_28D: identifier = builderConfig.getSwap28DSecurity(curveDate, strip.getCurveNodePointTime()); break; case SWAP: // assume that all old swaps are 3m - shouldn't be used but just for consistency identifier = builderConfig.getSwap3MSecurity(curveDate, strip.getCurveNodePointTime()); break; case BASIS_SWAP: identifier = builderConfig.getBasisSwapSecurity(curveDate, strip); break; case TENOR_SWAP: identifier = builderConfig.getTenorSwapSecurity(curveDate, strip.getCurveNodePointTime()); break; case OIS_SWAP: identifier = builderConfig.getOISSwapSecurity(curveDate, strip.getCurveNodePointTime()); break; case SIMPLE_ZERO_DEPOSIT: identifier = builderConfig.getSimpleZeroDepositSecurity(curveDate, strip.getCurveNodePointTime()); break; case PERIODIC_ZERO_DEPOSIT: identifier = builderConfig.getPeriodicZeroDepositSecurity(curveDate, strip.getCurveNodePointTime(), strip.getPeriodsPerYear()); break; case CONTINUOUS_ZERO_DEPOSIT: identifier = builderConfig.getContinuousZeroDepositSecurity(curveDate, strip.getCurveNodePointTime()); break; default: throw new OpenGammaRuntimeException("Unhandled type of instrument in curve definition " + strip.getInstrumentType()); } securities.add(new FixedIncomeStripWithIdentifier(strip, identifier)); } final String interpolatorName = curveDefinition.getInterpolatorName(); final String leftExtrapolatorName = curveDefinition.getLeftExtrapolatorName(); final String rightExtrapolatorName = curveDefinition.getRightExtrapolatorName(); final boolean interpolateYield = curveDefinition.isInterpolateYields(); final Interpolator1D interpolator = CombinedInterpolatorExtrapolatorFactory.getInterpolator(interpolatorName, leftExtrapolatorName, rightExtrapolatorName); return new InterpolatedYieldCurveSpecification(curveDate, curveDefinition.getName(), curveDefinition.getCurrency(), interpolator, interpolateYield, securities, curveDefinition.getRegionId()); } catch (final OpenGammaRuntimeException e) { throw new OpenGammaRuntimeException("Error constructing " + curveDefinition.getName() + "_" + curveDefinition.getCurrency().getCode() + ": " + e.getMessage()); } } }