/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.market.curve;
import java.util.List;
import com.opengamma.strata.basics.date.DayCount;
import com.opengamma.strata.basics.date.DayCounts;
import com.opengamma.strata.collect.ArgChecker;
import com.opengamma.strata.market.ValueType;
import com.opengamma.strata.market.param.ParameterMetadata;
/**
* Helper for creating common types of curves.
*/
public final class Curves {
/**
* Restricted constructor.
*/
private Curves() {
}
//-------------------------------------------------------------------------
/**
* Creates curve metadata for a curve providing zero rates.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata zeroRates(String name, DayCount dayCount) {
return zeroRates(CurveName.of(name), dayCount);
}
/**
* Creates curve metadata for a curve providing zero rates.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata zeroRates(CurveName name, DayCount dayCount) {
ArgChecker.notNull(name, "name");
ArgChecker.notNull(dayCount, "dayCount");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.ZERO_RATE)
.dayCount(dayCount)
.build();
}
/**
* Creates curve metadata for a curve providing zero rates.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @param parameterMetadata the parameter metadata
* @return the curve metadata
*/
@SuppressWarnings("unchecked")
public static CurveMetadata zeroRates(
CurveName name,
DayCount dayCount,
List<? extends ParameterMetadata> parameterMetadata) {
ArgChecker.notNull(name, "name");
ArgChecker.notNull(dayCount, "dayCount");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.ZERO_RATE)
.dayCount(dayCount)
.parameterMetadata((List<ParameterMetadata>) parameterMetadata)
.build();
}
//-------------------------------------------------------------------------
/**
* Creates curve metadata for a curve providing forward rates.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata forwardRates(String name, DayCount dayCount) {
return forwardRates(CurveName.of(name), dayCount);
}
/**
* Creates curve metadata for a curve providing forward rates.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata forwardRates(CurveName name, DayCount dayCount) {
ArgChecker.notNull(name, "name");
ArgChecker.notNull(dayCount, "dayCount");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.FORWARD_RATE)
.dayCount(dayCount)
.build();
}
/**
* Creates curve metadata for a curve providing forward rates.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @param parameterMetadata the parameter metadata
* @return the curve metadata
*/
@SuppressWarnings("unchecked")
public static CurveMetadata forwardRates(
CurveName name,
DayCount dayCount,
List<? extends ParameterMetadata> parameterMetadata) {
ArgChecker.notNull(name, "name");
ArgChecker.notNull(dayCount, "dayCount");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.FORWARD_RATE)
.dayCount(dayCount)
.parameterMetadata((List<ParameterMetadata>) parameterMetadata)
.build();
}
//-------------------------------------------------------------------------
/**
* Creates curve metadata for a curve providing discount factors.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata discountFactors(String name, DayCount dayCount) {
return discountFactors(CurveName.of(name), dayCount);
}
/**
* Creates curve metadata for a curve providing discount factors.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata discountFactors(CurveName name, DayCount dayCount) {
ArgChecker.notNull(name, "name");
ArgChecker.notNull(dayCount, "dayCount");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.DISCOUNT_FACTOR)
.dayCount(dayCount)
.build();
}
/**
* Creates curve metadata for a curve providing discount factors.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @param parameterMetadata the parameter metadata
* @return the curve metadata
*/
@SuppressWarnings("unchecked")
public static CurveMetadata discountFactors(
CurveName name,
DayCount dayCount,
List<? extends ParameterMetadata> parameterMetadata) {
ArgChecker.notNull(name, "name");
ArgChecker.notNull(dayCount, "dayCount");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.DISCOUNT_FACTOR)
.dayCount(dayCount)
.parameterMetadata((List<ParameterMetadata>) parameterMetadata)
.build();
}
//-------------------------------------------------------------------------
/**
* Creates curve metadata for a curve providing monthly prices, typically used in inflation.
* <p>
* The x-values represent months relative to an unspecified base month.
*
* @param name the curve name
* @return the curve metadata
*/
public static CurveMetadata prices(String name) {
return prices(CurveName.of(name));
}
/**
* Creates curve metadata for a curve providing monthly prices, typically used in inflation.
* <p>
* The x-values represent months relative to an unspecified base month.
*
* @param name the curve name
* @return the curve metadata
*/
public static CurveMetadata prices(CurveName name) {
ArgChecker.notNull(name, "name");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.MONTHS)
.yValueType(ValueType.PRICE_INDEX)
.build();
}
/**
* Creates curve metadata for a curve providing monthly prices, typically used in inflation.
* <p>
* The x-values represent months relative to an unspecified base month.
*
* @param name the curve name
* @param parameterMetadata the parameter metadata
* @return the curve metadata
*/
@SuppressWarnings("unchecked")
public static CurveMetadata prices(CurveName name, List<? extends ParameterMetadata> parameterMetadata) {
ArgChecker.notNull(name, "name");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.MONTHS)
.yValueType(ValueType.PRICE_INDEX)
.parameterMetadata((List<ParameterMetadata>) parameterMetadata)
.build();
}
//-------------------------------------------------------------------------
/**
* Creates curve metadata for an ISDA credit curve.
* <p>
* The x-values represent year fractions using 'Act/365F' as specified by the ISDA credit specification.
*
* @param name the curve name
* @param parameterMetadata the parameter metadata
* @return the curve metadata
*/
@SuppressWarnings("unchecked")
public static CurveMetadata isdaCredit(
CurveName name,
List<? extends ParameterMetadata> parameterMetadata) {
ArgChecker.notNull(name, "name");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.ISDA_CREDIT)
.dayCount(DayCounts.ACT_365F)
.parameterMetadata((List<ParameterMetadata>) parameterMetadata)
.build();
}
//-------------------------------------------------------------------------
/**
* Creates curve metadata for a curve providing Black volatility by expiry.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata blackVolatilityByExpiry(String name, DayCount dayCount) {
return blackVolatilityByExpiry(CurveName.of(name), dayCount);
}
/**
* Creates curve metadata for a curve providing Black volatility by expiry.
* <p>
* The x-values represent year fractions relative to an unspecified base date
* as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @return the curve metadata
*/
public static CurveMetadata blackVolatilityByExpiry(CurveName name, DayCount dayCount) {
ArgChecker.notNull(name, "name");
ArgChecker.notNull(dayCount, "dayCount");
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.BLACK_VOLATILITY)
.dayCount(dayCount)
.build();
}
//-------------------------------------------------------------------------
/**
* Creates metadata for a curve providing a SABR parameter.
* <p>
* The x-values represent time to expiry year fractions as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @param yType the y-value type, which must be one of the four SABR values
* @return the curve metadata
*/
public static CurveMetadata sabrParameterByExpiry(
String name,
DayCount dayCount,
ValueType yType) {
return sabrParameterByExpiry(CurveName.of(name), dayCount, yType);
}
/**
* Creates metadata for a curve providing a SABR parameter.
* <p>
* The x-values represent time to expiry year fractions as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @param yType the y-value type, which must be one of the four SABR values
* @return the curve metadata
*/
public static CurveMetadata sabrParameterByExpiry(
CurveName name,
DayCount dayCount,
ValueType yType) {
if (!yType.equals(ValueType.SABR_ALPHA) && !yType.equals(ValueType.SABR_BETA) &&
!yType.equals(ValueType.SABR_RHO) && !yType.equals(ValueType.SABR_NU)) {
throw new IllegalArgumentException("SABR y-value type must be SabrAlpha, SabrBeta, SabrRho or SabrNu");
}
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(yType)
.dayCount(dayCount)
.build();
}
/**
* Creates metadata for a curve providing a SABR parameter.
* <p>
* The x-values represent time to expiry year fractions as defined by the specified day count.
*
* @param name the curve name
* @param dayCount the day count
* @param yType the y-value type, which must be one of the four SABR values
* @param parameterMetadata the parameter metadata
* @return the curve metadata
*/
@SuppressWarnings("unchecked")
public static CurveMetadata sabrParameterByExpiry(
CurveName name,
DayCount dayCount,
ValueType yType,
List<? extends ParameterMetadata> parameterMetadata) {
if (!yType.equals(ValueType.SABR_ALPHA) && !yType.equals(ValueType.SABR_BETA) &&
!yType.equals(ValueType.SABR_RHO) && !yType.equals(ValueType.SABR_NU)) {
throw new IllegalArgumentException("SABR y-value type must be SabrAlpha, SabrBeta, SabrRho or SabrNu");
}
return DefaultCurveMetadata.builder()
.curveName(name)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(yType)
.dayCount(dayCount)
.parameterMetadata((List<ParameterMetadata>) parameterMetadata)
.build();
}
}