/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.pnl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.InitializingBean;
import com.opengamma.analytics.financial.schedule.ScheduleCalculatorFactory;
import com.opengamma.analytics.financial.schedule.TimeSeriesSamplingFunctionFactory;
import com.opengamma.analytics.financial.timeseries.returns.TimeSeriesReturnCalculatorFactory;
import com.opengamma.analytics.math.interpolation.Interpolator1DFactory;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean;
import com.opengamma.engine.function.config.FunctionConfiguration;
import com.opengamma.engine.function.config.FunctionConfigurationSource;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.financial.analytics.MissingInputsFunction;
import com.opengamma.financial.property.AggregationDefaultPropertyFunction;
import com.opengamma.master.historicaltimeseries.impl.HistoricalTimeSeriesRatingFieldNames;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.tuple.Pair;
/**
* Function repository configuration source for the functions contained in this package.
*/
public class PNLFunctions extends AbstractFunctionConfigurationBean {
/**
* Default instance of a repository configuration source exposing the functions from this package.
*
* @return the configuration source exposing functions from this package
*/
public static FunctionConfigurationSource instance() {
return new PNLFunctions().getObjectCreating();
}
public static FunctionConfigurationSource deprecated() {
return new DeprecatedFunctions().getObjectCreating();
}
/**
* Function repository configuration source for the deprecated functions contained in this package.
*/
public static class DeprecatedFunctions extends AbstractFunctionConfigurationBean {
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(YieldCurveNodePnLFunctionDeprecated.class));
}
}
/**
* Function repository configuration source for the configurable functions contained in this package.
*/
public static class Calculators extends AbstractFunctionConfigurationBean {
private String _htsResolutionKey = HistoricalTimeSeriesRatingFieldNames.DEFAULT_CONFIG_NAME;
private String _mark2MarketField;
private String _costOfCarryField;
private String _valueFieldName = MarketDataRequirementNames.MARKET_VALUE;
public void setHtsResolutionKey(final String htsResolutionKey) {
_htsResolutionKey = htsResolutionKey;
}
public String getHtsResolutionKey() {
return _htsResolutionKey;
}
public void setMark2MarketField(final String mark2MarketField) {
_mark2MarketField = mark2MarketField;
}
public String getMark2MarketField() {
return _mark2MarketField;
}
public void setCostOfCarryField(final String costOfCarryField) {
_costOfCarryField = costOfCarryField;
}
public String getCostOfCarryField() {
return _costOfCarryField;
}
public void setValueFieldName(final String valueFieldName) {
_valueFieldName = valueFieldName;
}
public String getValueFieldName() {
return _valueFieldName;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getHtsResolutionKey(), "htsResolutionKey");
ArgumentChecker.notNullInjected(getMark2MarketField(), "mark2MarketField");
ArgumentChecker.notNullInjected(getCostOfCarryField(), "costOfCarryField");
ArgumentChecker.notNullInjected(getValueFieldName(), "valueFieldName");
super.afterPropertiesSet();
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(TradeExchangeTradedPnLFunction.class, getHtsResolutionKey(), getMark2MarketField(), getCostOfCarryField()));
functions.add(functionConfiguration(TradeExchangeTradedDailyPnLFunction.class, getHtsResolutionKey(), getMark2MarketField(), getCostOfCarryField()));
functions.add(functionConfiguration(PositionExchangeTradedDailyPnLFunction.class, getHtsResolutionKey(), getMark2MarketField(), getCostOfCarryField()));
functions.add(functionConfiguration(SecurityPriceSeriesFunction.class, getHtsResolutionKey(), getValueFieldName()));
functions.add(functionConfiguration(SimpleFuturePnLFunction.class, getHtsResolutionKey()));
functions.add(functionConfiguration(SimpleFXFuturePnLFunction.class, getHtsResolutionKey()));
functions.add(functionConfiguration(ValueGreekSensitivityPnLFunction.class, getHtsResolutionKey()));
functions.add(functionConfiguration(MarkToMarketPnLFunction.class, getValueFieldName(), getCostOfCarryField()));
functions.add(functionConfiguration(HistoricalValuationPnLFunction.class));
functions.add(functionConfiguration(VolatilityWeightedHistoricalValuationPnLFunction.class));
}
}
/**
* Function repository configuration source for the default functions contained in this package.
*/
public static class Defaults extends AbstractFunctionConfigurationBean {
/**
* Per currency information.
*/
public static class CurrencyInfo implements InitializingBean {
private String _curveConfiguration;
private String _discountingCurve;
private String _surfaceName;
public void setCurveConfiguration(final String curveConfiguration) {
_curveConfiguration = curveConfiguration;
}
public String getCurveConfiguration() {
return _curveConfiguration;
}
public void setDiscountingCurve(final String discountingCurve) {
_discountingCurve = discountingCurve;
}
public String getDiscountingCurve() {
return _discountingCurve;
}
public void setSurfaceName(final String surfaceName) {
_surfaceName = surfaceName;
}
public String getSurfaceName() {
return _surfaceName;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getCurveConfiguration(), "curveConfiguration");
ArgumentChecker.notNullInjected(getDiscountingCurve(), "discountingCurve");
}
}
/**
* Per currency-pair information.
*/
public static class CurrencyPairInfo implements InitializingBean {
private String _surfaceName;
public void setSurfaceName(final String surfaceName) {
_surfaceName = surfaceName;
}
public String getSurfaceName() {
return _surfaceName;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getSurfaceName(), "surfaceName");
}
}
private final Map<String, CurrencyInfo> _perCurrencyInfo = new HashMap<String, CurrencyInfo>();
private final Map<Pair<String, String>, CurrencyPairInfo> _perCurrencyPairInfo = new HashMap<Pair<String, String>, CurrencyPairInfo>();
private String _curveName;
private String _payCurveName;
private String _receiveCurveName;
private String _returnCalculatorName = TimeSeriesReturnCalculatorFactory.SIMPLE_NET_LENIENT;
@Deprecated
private String _samplingPeriodName = "P2Y";
private String _start = "-P2Y";
private String _end = "Now";
private String _scheduleName = ScheduleCalculatorFactory.DAILY;
private String _samplingCalculatorName = TimeSeriesSamplingFunctionFactory.PREVIOUS_AND_FIRST_VALUE_PADDING;
private String _interpolator = Interpolator1DFactory.DOUBLE_QUADRATIC;
private String _leftExtrapolator = Interpolator1DFactory.LINEAR_EXTRAPOLATOR;
private String _rightExtrapolator = Interpolator1DFactory.LINEAR_EXTRAPOLATOR;
public void setPerCurrencyInfo(final Map<String, CurrencyInfo> perCurrencyInfo) {
_perCurrencyInfo.clear();
_perCurrencyInfo.putAll(perCurrencyInfo);
}
public Map<String, CurrencyInfo> getPerCurrencyInfo() {
return _perCurrencyInfo;
}
public void setCurrencyInfo(final String currency, final CurrencyInfo info) {
_perCurrencyInfo.put(currency, info);
}
public CurrencyInfo getCurrencyInfo(final String currency) {
return _perCurrencyInfo.get(currency);
}
public void setPerCurrencyPairInfo(final Map<Pair<String, String>, CurrencyPairInfo> perCurrencyPairInfo) {
_perCurrencyPairInfo.clear();
_perCurrencyPairInfo.putAll(perCurrencyPairInfo);
}
public Map<Pair<String, String>, CurrencyPairInfo> getPerCurrencyPairInfo() {
return _perCurrencyPairInfo;
}
public void setCurrencyPairInfo(final Pair<String, String> currencyPair, final CurrencyPairInfo info) {
_perCurrencyPairInfo.put(currencyPair, info);
}
public CurrencyPairInfo getCurrencyPairInfo(final Pair<String, String> currencyPair) {
return _perCurrencyPairInfo.get(currencyPair);
}
public void setCurveName(final String curveName) {
_curveName = curveName;
}
public String getCurveName() {
return _curveName;
}
public void setPayCurveName(final String payCurveName) {
_payCurveName = payCurveName;
}
public String getPayCurveName() {
return _payCurveName;
}
public void setReceiveCurveName(final String receiveCurveName) {
_receiveCurveName = receiveCurveName;
}
public String getReceiveCurveName() {
return _receiveCurveName;
}
public void setReturnCalculatorName(final String returnCalculatorName) {
_returnCalculatorName = returnCalculatorName;
}
public String getReturnCalculatorName() {
return _returnCalculatorName;
}
/**
*
* @param samplingPeriodName the sampling period name
* @deprecated use start and end instead
*/
@Deprecated
public void setSamplingPeriodName(final String samplingPeriodName) {
_samplingPeriodName = samplingPeriodName;
}
/**
*
* @return the sampling period name
* @deprecated use start and end instead
*/
@Deprecated
public String getSamplingPeriodName() {
return _samplingPeriodName;
}
public String getStart() {
return _start;
}
public void setStart(final String start) {
_start = start;
}
public String getEnd() {
return _end;
}
public void setEnd(final String end) {
_end = end;
}
public void setScheduleName(final String scheduleName) {
_scheduleName = scheduleName;
}
public String getScheduleName() {
return _scheduleName;
}
public void setSamplingCalculatorName(final String samplingCalculatorName) {
_samplingCalculatorName = samplingCalculatorName;
}
public String getSamplingCalculatorName() {
return _samplingCalculatorName;
}
public void setInterpolator(final String interpolator) {
_interpolator = interpolator;
}
public String getInterpolator() {
return _interpolator;
}
public void setLeftExtrapolator(final String leftExtrapolator) {
_leftExtrapolator = leftExtrapolator;
}
public String getLeftExtrapolator() {
return _leftExtrapolator;
}
public void setRightExtrapolator(final String rightExtrapolator) {
_rightExtrapolator = rightExtrapolator;
}
public String getRightExtrapolator() {
return _rightExtrapolator;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getReturnCalculatorName(), "returnCalculatorName");
ArgumentChecker.notNullInjected(getSamplingPeriodName(), "samplingPeriodName");
ArgumentChecker.notNullInjected(getStart(), "start");
ArgumentChecker.notNullInjected(getEnd(), "end");
ArgumentChecker.notNullInjected(getScheduleName(), "scheduleName");
ArgumentChecker.notNullInjected(getSamplingCalculatorName(), "samplingCalculatorName");
ArgumentChecker.notNullInjected(getInterpolator(), "interpolator");
ArgumentChecker.notNullInjected(getLeftExtrapolator(), "leftExtrapolator");
ArgumentChecker.notNullInjected(getRightExtrapolator(), "rightExtrapolator");
super.afterPropertiesSet();
}
protected void addBondFutureOptionBlackYieldCurveNodePnLDefaults(final List<FunctionConfiguration> functions) {
int i = 0;
for (final CurrencyInfo e : getPerCurrencyInfo().values()) {
if (e.getSurfaceName() != null) {
i++;
}
}
final String[] args = new String[3 + i * 3];
i = 0;
args[i++] = getSamplingPeriodName();
args[i++] = getScheduleName();
args[i++] = getSamplingCalculatorName();
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
if (e.getValue().getSurfaceName() != null) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
args[i++] = e.getValue().getSurfaceName();
}
}
functions.add(functionConfiguration(BondFutureOptionBlackYieldCurveNodePnLDefaults.class, args));
}
protected void addCreditInstrumetCS01PnLDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[3];
args[0] = getSamplingPeriodName();
args[1] = getScheduleName();
args[2] = getSamplingCalculatorName();
functions.add(functionConfiguration(CreditInstrumentCS01PnLDefaults.class, args));
}
protected void addFXForwardPnLDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[4 + getPerCurrencyInfo().size() * 3];
int i = 0;
args[i++] = getStart();
args[i++] = getEnd();
args[i++] = getScheduleName();
args[i++] = getSamplingCalculatorName();
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
args[i++] = e.getValue().getDiscountingCurve();
}
functions.add(functionConfiguration(FXForwardPnLDefaults.class, args));
}
protected void addFXOptionBlackPnLCurveDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[getPerCurrencyInfo().size() * 3];
int i = 0;
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
args[i++] = e.getValue().getDiscountingCurve();
}
functions.add(functionConfiguration(FXOptionBlackPnLCurveDefaults.class, args));
}
protected void addFXOptionBlackPnLSurfaceDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[3 + getPerCurrencyPairInfo().size() * 3];
int i = 0;
args[i++] = getInterpolator();
args[i++] = getLeftExtrapolator();
args[i++] = getRightExtrapolator();
for (final Map.Entry<Pair<String, String>, CurrencyPairInfo> e : getPerCurrencyPairInfo().entrySet()) {
args[i++] = e.getKey().getFirst();
args[i++] = e.getKey().getSecond();
args[i++] = e.getValue().getSurfaceName();
}
functions.add(functionConfiguration(FXOptionBlackPnLSurfaceDefaults.class, args));
}
protected void addInterestRateFutureOptionBlackYieldCurveNodePnLDefaults(final List<FunctionConfiguration> functions) {
int i = 0;
for (final CurrencyInfo e : getPerCurrencyInfo().values()) {
if (e.getSurfaceName() != null) {
i++;
}
}
final String[] args = new String[3 + i * 3];
i = 0;
args[i++] = getSamplingPeriodName();
args[i++] = getScheduleName();
args[i++] = getSamplingCalculatorName();
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
if (e.getValue().getSurfaceName() != null) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
args[i++] = e.getValue().getSurfaceName();
}
}
functions.add(functionConfiguration(InterestRateFutureOptionBlackYieldCurveNodePnLDefaults.class, args));
}
protected void addInterestRateFutureYieldCurveNodePnLDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[3 + getPerCurrencyInfo().size() * 2];
int i = 0;
args[i++] = getSamplingPeriodName();
args[i++] = getScheduleName();
args[i++] = getSamplingCalculatorName();
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
}
functions.add(functionConfiguration(InterestRateFutureYieldCurveNodePnLDefaults.class, args));
}
protected void addSwaptionBlackYieldCurveNodePnLDefaults(final List<FunctionConfiguration> functions) {
int i = 0;
for (final CurrencyInfo e : getPerCurrencyInfo().values()) {
if (e.getSurfaceName() != null) {
i++;
}
}
final String[] args = new String[3 + i * 3];
i = 0;
args[i++] = getSamplingPeriodName();
args[i++] = getScheduleName();
args[i++] = getSamplingCalculatorName();
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
if (e.getValue().getSurfaceName() != null) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
args[i++] = e.getValue().getSurfaceName();
}
}
functions.add(functionConfiguration(SwaptionBlackYieldCurveNodePnLDefaults.class, args));
}
protected void addYieldCurveNodePnLDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[3 + getPerCurrencyInfo().size() * 2];
int i = 0;
args[i++] = getSamplingPeriodName();
args[i++] = getScheduleName();
args[i++] = getSamplingCalculatorName();
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
}
functions.add(functionConfiguration(YieldCurveNodePnLDefaults.class, args));
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(EquityPnLDefaultPropertiesFunction.class, getSamplingPeriodName(), getScheduleName(), getSamplingCalculatorName(),
getReturnCalculatorName()));
functions.add(functionConfiguration(FXOptionBlackPnLDefaults.class, getSamplingPeriodName(), getScheduleName(), getSamplingCalculatorName()));
functions.add(functionConfiguration(PositionPnLDefaults.class, getSamplingPeriodName(), getScheduleName(), getSamplingCalculatorName()));
functions.add(functionConfiguration(SecurityPriceSeriesDefaultPropertiesFunction.class, getSamplingPeriodName(), getScheduleName(),
getSamplingCalculatorName()));
if (getCurveName() != null) {
functions.add(functionConfiguration(SimpleFuturePnLDefaultPropertiesFunction.class, getCurveName(), getSamplingPeriodName(), getScheduleName(),
getSamplingCalculatorName()));
}
if ((getPayCurveName() != null) && (getReceiveCurveName() != null)) {
functions.add(functionConfiguration(SimpleFXFuturePnLDefaultPropertiesFunction.class, getPayCurveName(), getReceiveCurveName(), getSamplingPeriodName(), getScheduleName(),
getSamplingCalculatorName()));
}
functions.add(functionConfiguration(ValueGreekSensitivityPnLDefaultPropertiesFunction.class, getSamplingPeriodName(), getScheduleName(),
getSamplingCalculatorName(), getReturnCalculatorName()));
if (!getPerCurrencyInfo().isEmpty()) {
addBondFutureOptionBlackYieldCurveNodePnLDefaults(functions);
addFXForwardPnLDefaults(functions);
addFXOptionBlackPnLCurveDefaults(functions);
addInterestRateFutureOptionBlackYieldCurveNodePnLDefaults(functions);
addInterestRateFutureYieldCurveNodePnLDefaults(functions);
addSwaptionBlackYieldCurveNodePnLDefaults(functions);
addYieldCurveNodePnLDefaults(functions);
}
if (!getPerCurrencyPairInfo().isEmpty()) {
addFXOptionBlackPnLSurfaceDefaults(functions);
}
addCreditInstrumetCS01PnLDefaults(functions);
}
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(BondFutureOptionBlackYieldCurveNodePnLFunction.class));
functions.add(functionConfiguration(CreditDefaultSwapIndexCS01PnLFunction.class));
functions.add(functionConfiguration(CreditDefaultSwapOptionCS01PnLFunction.class));
functions.add(functionConfiguration(CreditInstrumentCS01PnLFunction.class));
functions.add(functionConfiguration(EquityPnLFunction.class));
functions.add(functionConfiguration(FXForwardCurrencyExposurePnLFunction.class));
functions.add(functionConfiguration(FXForwardYieldCurvesPnLFunction.class));
functions.add(functionConfiguration(FXForwardYieldCurvePnLFunction.class));
functions.add(functionConfiguration(FXForwardYieldCurveNodePnLFunction.class));
functions.add(functionConfiguration(FXOptionBlackDeltaPnLFunction.class));
functions.add(functionConfiguration(FXOptionBlackVegaPnLFunction.class));
functions.add(functionConfiguration(InterestRateFutureOptionBlackYieldCurveNodePnLFunction.class));
functions.add(functionConfiguration(InterestRateFutureYieldCurveNodePnLFunction.class));
functions.add(functionConfiguration(PortfolioExchangeTradedDailyPnLFunction.Impl.class));
functions.add(functionConfiguration(PortfolioExchangeTradedPnLFunction.class));
functions.add(functionConfiguration(PositionExchangeTradedPnLFunction.class));
functions.add(functionConfiguration(PositionPnLFunction.class));
functions.add(functionConfiguration(SwaptionBlackYieldCurveNodePnLFunction.class));
functions.add(functionConfiguration(YieldCurveNodePnLFunction.class));
functions.add(functionConfiguration(AggregationDefaultPropertyFunction.class, ValueRequirementNames.DAILY_PNL, MissingInputsFunction.AGGREGATION_STYLE_FULL));
functions.add(functionConfiguration(PnLPeriodTranslationFunction.class, ValueRequirementNames.PNL_SERIES));
functions.add(functionConfiguration(PnLPeriodTranslationFunction.class, ValueRequirementNames.YIELD_CURVE_PNL_SERIES));
functions.add(functionConfiguration(PnLPeriodTranslationFunction.class, ValueRequirementNames.CURVE_PNL_SERIES));
}
}