/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.calc.marketdata;
import java.util.List;
import com.google.common.collect.ImmutableList;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.calc.runner.CalculationTasks;
import com.opengamma.strata.data.MarketData;
import com.opengamma.strata.data.scenario.ScenarioMarketData;
/**
* Component that provides the ability to source and calibrate market data.
* <p>
* This component is used to create market data within Strata.
* Each method receives a set of requirements defining the market data that is required.
* This is typically obtained from {@link CalculationTasks#requirements(ReferenceData)}.
* <p>
* Given the requirements, the factory will determine whether any raw market data is needed.
* This may use the {@link MarketDataConfig} to provide additional information.
* <p>
* If raw market data is required, the {@link ObservableDataProvider} and {@link TimeSeriesProvider}
* will be invoked to supply it. Applications can implement these to supply data from an external source.
* Alternatively, the raw market data can be passed into each method using the {@code suppliedData} parameter.
* <p>
* Once the raw data is obtained, the factory will determine whether it needs to be calibrated,
* which may also involve additional information from the {@link MarketDataConfig}.
* <p>
* Two types of output can be built.
* The {@code create} method is used to obtain and calibrate a single set of market data.
* By contrast, the {@code createMultiScenario} methods are used to create data with multiple
* scenarios based on a {@link ScenarioDefinition}.
*/
public interface MarketDataFactory {
/**
* Obtains an instance of the factory based on providers of market data and time-series.
* <p>
* The market data functions are used to build the market data.
*
* @param observableDataProvider the provider of observable market data
* @param timeSeriesProvider the provider of time-series
* @param functions the functions that create the market data
* @return the market data factory
*/
public static MarketDataFactory of(
ObservableDataProvider observableDataProvider,
TimeSeriesProvider timeSeriesProvider,
MarketDataFunction<?, ?>... functions) {
return new DefaultMarketDataFactory(observableDataProvider, timeSeriesProvider, ImmutableList.copyOf(functions));
}
/**
* Obtains an instance of the factory based on providers of market data and time-series.
* <p>
* The market data functions are used to build the market data.
*
* @param observableDataProvider the provider of observable market data
* @param timeSeriesProvider the provider of time-series
* @param functions the functions that create the market data
* @return the market data factory
*/
@SuppressWarnings("unchecked")
public static DefaultMarketDataFactory of(
ObservableDataProvider observableDataProvider,
TimeSeriesProvider timeSeriesProvider,
List<MarketDataFunction<?, ?>> functions) {
return new DefaultMarketDataFactory(observableDataProvider, timeSeriesProvider, functions);
}
//-------------------------------------------------------------------------
/**
* Builds a set of market data.
* <p>
* This builds market data based on the specified requirements and configuration.
* If some market data is known, it can be supplied using the {@link MarketData} interface.
* Only data not already present in the {@code suppliedData} will be built.
*
* @param requirements the market data required for the calculations
* @param marketDataConfig configuration needed to build non-observable market data, for example curves or surfaces
* @param suppliedData market data supplied by the user
* @param refData the reference data
* @return the market data required by the calculations plus details of any data that could not be built
*/
public abstract BuiltMarketData create(
MarketDataRequirements requirements,
MarketDataConfig marketDataConfig,
MarketData suppliedData,
ReferenceData refData);
//-------------------------------------------------------------------------
/**
* Builds the market data required for performing calculations for a set of scenarios.
* <p>
* This builds market data based on the specified requirements and configuration.
* If some market data is known, it can be supplied using the {@link MarketData} interface.
* Only data not already present in the {@code suppliedData} will be built.
* The scenario definition will be applied, potentially generating multiple sets of market data.
* <p>
* If the scenario definition contains perturbations that apply to the inputs used to build market data,
* the data must be built by this method, not provided in {@code suppliedData}.
* <p>
* For example, if a perturbation is defined that shocks the par rates used to build a curve, the curve
* must not be provided in {@code suppliedData}. The factory will only build the curve using the par rates
* if it is not found in {@code suppliedData}.
*
* @param requirements the market data required for the calculations
* @param marketDataConfig configuration needed to build non-observable market data, for example curves or surfaces
* @param suppliedData the base market data used to derive the data for each scenario
* @param refData the reference data
* @param scenarioDefinition defines how the market data for each scenario is derived from the base data
* @return the market data required by the calculations
*/
public abstract BuiltScenarioMarketData createMultiScenario(
MarketDataRequirements requirements,
MarketDataConfig marketDataConfig,
MarketData suppliedData,
ReferenceData refData,
ScenarioDefinition scenarioDefinition);
/**
* Builds the market data required for performing calculations for a set of scenarios.
* <p>
* This builds market data based on the specified requirements and configuration.
* If some market data is known, it can be supplied using the {@link ScenarioMarketData} interface.
* Only data not already present in the {@code suppliedData} will be built.
* The scenario definition will be applied, potentially generating multiple sets of market data.
* The number of scenarios in the supplied data must match that of the scenario definition.
* <p>
* If the scenario definition contains perturbations that apply to the inputs used to build market data,
* the data must be built by this method, not provided in {@code suppliedData}.
* <p>
* For example, if a perturbation is defined that shocks the par rates used to build a curve, the curve
* must not be provided in {@code suppliedData}. The factory will only build the curve using the par rates
* if it is not found in {@code suppliedData}.
*
* @param requirements the market data required for the calculations
* @param marketDataConfig configuration needed to build non-observable market data, for example curves or surfaces
* @param suppliedData the base market data used to derive the data for each scenario
* @param refData the reference data
* @param scenarioDefinition defines how the market data for each scenario is derived from the base data
* @return the market data required by the calculations
*/
public abstract BuiltScenarioMarketData createMultiScenario(
MarketDataRequirements requirements,
MarketDataConfig marketDataConfig,
ScenarioMarketData suppliedData,
ReferenceData refData,
ScenarioDefinition scenarioDefinition);
}