/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.volatility.surface.black.defaultproperties; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.InitializingBean; import com.opengamma.analytics.financial.model.volatility.smile.fitting.interpolation.WeightingFunctionFactory; import com.opengamma.analytics.financial.model.volatility.smile.function.VolatilityFunctionFactory; import com.opengamma.analytics.math.interpolation.Interpolator1DFactory; import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean; import com.opengamma.engine.function.config.FunctionConfiguration; import com.opengamma.financial.analytics.model.curve.forward.ForwardCurveValuePropertyNames; import com.opengamma.financial.analytics.model.volatility.surface.black.BlackVolatilitySurfacePropertyNamesAndValues; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.Pair; /** * Function repository configuration source for the functions contained in this package. */ public class DefaultPropertiesFunctions extends AbstractFunctionConfigurationBean { /** * Currency specific data. */ public static class CurrencyInfo implements InitializingBean { private String _curveName; private String _curveCalculationMethod = ForwardCurveValuePropertyNames.PROPERTY_YIELD_CURVE_IMPLIED_METHOD; private String _surfaceName; public String getCurveName() { return _curveName; } public void setCurveName(final String curveName) { _curveName = curveName; } public String getCurveCalculationMethod() { return _curveCalculationMethod; } public void setCurveCalculationMethod(final String curveCalculationMethod) { _curveCalculationMethod = curveCalculationMethod; } public String getSurfaceName() { return _surfaceName; } public void setSurfaceName(final String surfaceName) { _surfaceName = surfaceName; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getCurveName(), "curveName"); ArgumentChecker.notNullInjected(getCurveCalculationMethod(), "curveCalculationMethod"); ArgumentChecker.notNullInjected(getSurfaceName(), "surfaceName"); } } /** * Currency-pair specific data. */ public static class CurrencyPairInfo implements InitializingBean { private String _curveName; private String _curveCalculationMethod = ForwardCurveValuePropertyNames.PROPERTY_YIELD_CURVE_IMPLIED_METHOD; private String _surfaceName; public void setCurveName(final String curveName) { _curveName = curveName; } public String getCurveName() { return _curveName; } public void setCurveCalculationMethod(final String curveCalculationMethod) { _curveCalculationMethod = curveCalculationMethod; } public String getCurveCalculationMethod() { return _curveCalculationMethod; } public void setSurfaceName(final String surfaceName) { _surfaceName = surfaceName; } public String getSurfaceName() { return _surfaceName; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getCurveName(), "curveName"); ArgumentChecker.notNullInjected(getCurveCalculationMethod(), "curveCalculationMethod"); ArgumentChecker.notNullInjected(getSurfaceName(), "surfaceName"); } } private final Map<String, CurrencyInfo> _perCurrencyInfo = new HashMap<>(); private final Map<Pair<String, String>, CurrencyPairInfo> _perCurrencyPairInfo = new HashMap<>(); private String _timeAxis = BlackVolatilitySurfacePropertyNamesAndValues.LOG_TIME; private String _yAxis = BlackVolatilitySurfacePropertyNamesAndValues.LOG_Y; private String _volatilityTransform = BlackVolatilitySurfacePropertyNamesAndValues.INTEGRATED_VARIANCE; private String _timeInterpolator = Interpolator1DFactory.DOUBLE_QUADRATIC; private String _timeLeftExtrapolator = Interpolator1DFactory.LINEAR_EXTRAPOLATOR; private String _timeRightExtrapolator = Interpolator1DFactory.LINEAR_EXTRAPOLATOR; private String _sabrModel = VolatilityFunctionFactory.HAGAN; private String _weightingFunction = WeightingFunctionFactory.SINE_WEIGHTING_FUNCTION_NAME; private boolean _useExternalBeta /*= false*/; private double _externalBeta = 0.5; private String _splineInterpolator = Interpolator1DFactory.DOUBLE_QUADRATIC; private String _splineLeftExtrapolator = Interpolator1DFactory.LINEAR_EXTRAPOLATOR; private String _splineRightExtrapolator = Interpolator1DFactory.LINEAR_EXTRAPOLATOR; private String _splineExtrapolatorFailBehaviour = BlackVolatilitySurfacePropertyNamesAndValues.FLAT_SPLINE_EXTRAPOLATOR_FAILURE; 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 String getTimeAxis() { return _timeAxis; } public void setTimeAxis(final String timeAxis) { _timeAxis = timeAxis; } public String getYAxis() { return _yAxis; } public void setYAxis(final String yAxis) { _yAxis = yAxis; } public String getVolatilityTransform() { return _volatilityTransform; } public void setVolatilityTransform(final String volatilityTransform) { _volatilityTransform = volatilityTransform; } public String getTimeInterpolator() { return _timeInterpolator; } public void setTimeInterpolator(final String timeInterpolator) { _timeInterpolator = timeInterpolator; } public String getTimeLeftExtrapolator() { return _timeLeftExtrapolator; } public void setTimeLeftExtrapolator(final String timeLeftExtrapolator) { _timeLeftExtrapolator = timeLeftExtrapolator; } public String getTimeRightExtrapolator() { return _timeRightExtrapolator; } public void setTimeRightExtrapolator(final String timeRightExtrapolator) { _timeRightExtrapolator = timeRightExtrapolator; } public String getSabrModel() { return _sabrModel; } public void setSabrModel(final String sabrModel) { _sabrModel = sabrModel; } public String getWeightingFunction() { return _weightingFunction; } public void setWeightingFunction(final String weightingFunction) { _weightingFunction = weightingFunction; } public boolean isUseExternalBeta() { return _useExternalBeta; } public void setUseExternalBeta(final boolean useExternalBeta) { _useExternalBeta = useExternalBeta; } public double getExternalBeta() { return _externalBeta; } public void setExternalBeta(final double externalBeta) { _externalBeta = externalBeta; } public String getSplineInterpolator() { return _splineInterpolator; } public void setSplineInterpolator(final String splineInterpolator) { _splineInterpolator = splineInterpolator; } public String getSplineLeftExtrapolator() { return _splineLeftExtrapolator; } public void setSplineLeftExtrapolator(final String splineLeftExtrapolator) { _splineLeftExtrapolator = splineLeftExtrapolator; } public String getSplineRightExtrapolator() { return _splineRightExtrapolator; } public void setSplineRightExtrapolator(final String splineRightExtrapolator) { _splineRightExtrapolator = splineRightExtrapolator; } public String getSplineExtrapolatorFailBehaviour() { return _splineExtrapolatorFailBehaviour; } public void setSplineExtrapolatorFailBehaviour(final String splineExtrapolatorFailBehaviour) { _splineExtrapolatorFailBehaviour = splineExtrapolatorFailBehaviour; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getTimeAxis(), "timeAxis"); ArgumentChecker.notNullInjected(getYAxis(), "yAxis"); ArgumentChecker.notNullInjected(getVolatilityTransform(), "volatilityTransform"); ArgumentChecker.notNullInjected(getTimeInterpolator(), "timeInterpolator"); ArgumentChecker.notNullInjected(getTimeLeftExtrapolator(), "timeLeftExtrapolator"); ArgumentChecker.notNullInjected(getTimeRightExtrapolator(), "timeRightExtrapolator"); ArgumentChecker.notNullInjected(getSabrModel(), "sabrModel"); ArgumentChecker.notNullInjected(getWeightingFunction(), "weightingFunction"); ArgumentChecker.notNullInjected(getSplineInterpolator(), "splineInterpolator"); ArgumentChecker.notNullInjected(getSplineLeftExtrapolator(), "splineLeftExtrapolator"); ArgumentChecker.notNullInjected(getSplineRightExtrapolator(), "splineRightExtrapolator"); ArgumentChecker.notNullInjected(getSplineExtrapolatorFailBehaviour(), "splineExtrapolatorFailBehaviour"); super.afterPropertiesSet(); } protected void addCommodityBlackDefaults(final List<FunctionConfiguration> functions) { final String[] args = new String[getPerCurrencyInfo().size() * 4]; int i = 0; for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) { args[i++] = e.getKey(); args[i++] = e.getValue().getCurveName(); args[i++] = e.getValue().getCurveCalculationMethod(); args[i++] = e.getValue().getSurfaceName(); } functions.add(functionConfiguration(CommodityBlackVolatilitySurfacePrimitiveDefaults.class, args)); functions.add(functionConfiguration(CommodityBlackVolatilitySurfaceSecurityDefaults.class, args)); functions.add(functionConfiguration(CommodityBlackVolatilitySurfaceTradeDefaults.class, args)); } protected void addFXOptionBlackDefaults(final List<FunctionConfiguration> functions) { final String[] args = new String[getPerCurrencyPairInfo().size() * 4]; int i = 0; for (final Map.Entry<Pair<String, String>, CurrencyPairInfo> e : getPerCurrencyPairInfo().entrySet()) { args[i++] = (e.getKey().getFirst().compareTo(e.getKey().getSecond()) < 0) ? e.getKey().getFirst() + e.getKey().getSecond() : e.getKey().getSecond() + e.getKey().getFirst(); args[i++] = e.getValue().getCurveName(); args[i++] = e.getValue().getCurveCalculationMethod(); args[i++] = e.getValue().getSurfaceName(); } functions.add(functionConfiguration(FXBlackVolatilitySurfacePrimitiveDefaults.class, args)); functions.add(functionConfiguration(FXBlackVolatilitySurfaceSecurityDefaults.class, args)); functions.add(functionConfiguration(FXBlackVolatilitySurfaceTradeDefaults.class, args)); } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { functions.add(functionConfiguration(BlackVolatilitySurfaceMixedLogNormalDefaults.class, getTimeAxis(), getYAxis(), getVolatilityTransform(), getTimeInterpolator(), getTimeLeftExtrapolator(), getTimeRightExtrapolator(), getWeightingFunction())); functions.add(functionConfiguration(BlackVolatilitySurfaceSABRDefaults.class, getTimeAxis(), getYAxis(), getVolatilityTransform(), getTimeInterpolator(), getTimeLeftExtrapolator(), getTimeRightExtrapolator(), getSabrModel(), getWeightingFunction(), isUseExternalBeta() ? "true" : "false", Double.toString(getExternalBeta()))); functions.add(functionConfiguration(BlackVolatilitySurfaceSplineDefaults.class, getTimeAxis(), getYAxis(), getVolatilityTransform(), getTimeInterpolator(), getTimeLeftExtrapolator(), getTimeRightExtrapolator(), getSplineInterpolator(), getSplineLeftExtrapolator(), getSplineRightExtrapolator(), getSplineExtrapolatorFailBehaviour())); if (!getPerCurrencyInfo().isEmpty()) { addCommodityBlackDefaults(functions); } if (!getPerCurrencyPairInfo().isEmpty()) { addFXOptionBlackDefaults(functions); } } }