/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.interestrate.curve;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.ObjectUtils;
import com.opengamma.analytics.math.curve.DoublesCurve;
import com.opengamma.analytics.math.curve.InterpolatedDoublesCurve;
import com.opengamma.analytics.math.interpolation.Interpolator1D;
import com.opengamma.util.ArgumentChecker;
/**
* The implementation of a YieldAndDiscount curve where the curve is stored with maturities and zero-coupon continuously-compounded rates.
*/
public class YieldCurve extends YieldAndDiscountCurve {
/**
* The curve storing the required data in the zero-coupon continuously compounded convention.
*/
private final DoublesCurve _curve;
/**
* @param name The curve name.
* @param yieldCurve Curve containing continuously-compounded rates against maturities. Rates are unitless (eg 0.02 for two percent) and maturities are in years.
*/
public YieldCurve(final String name, final DoublesCurve yieldCurve) {
super(name);
ArgumentChecker.notNull(yieldCurve, "Curve");
_curve = yieldCurve;
}
/**
* Builder from a DoublesCurve using the name of the DoublesCurve as the name of the YieldCurve.
* @param yieldCurve The underlying curve based on yields (continuously-compounded).
* @return The yield curve.
*/
public static YieldCurve from(final DoublesCurve yieldCurve) {
ArgumentChecker.notNull(yieldCurve, "Curve");
return new YieldCurve(yieldCurve.getName(), yieldCurve);
}
/**
* Builder of an interpolated yield (continuously compounded) curve from discount factors.
* @param nodePoints The node points for the interpolated curve.
* @param discountFactors The discount factors at the node points.
* @param interpolator The yield (cc) interpolator.
* @param name The curve name.
* @return The yield curve.
*/
public static YieldCurve fromDiscountFactorInterpolated(final double[] nodePoints, final double[] discountFactors, final Interpolator1D interpolator, final String name) {
final int nbDF = discountFactors.length;
ArgumentChecker.isTrue(nodePoints.length == nbDF, "Yields array of incorrect length");
final double[] yields = new double[nbDF];
for (int loopy = 0; loopy < nbDF; loopy++) {
yields[loopy] = -Math.log(discountFactors[loopy]) / nodePoints[loopy];
}
final InterpolatedDoublesCurve curve = new InterpolatedDoublesCurve(nodePoints, yields, interpolator, false);
return new YieldCurve(name, curve);
}
@Override
public double getInterestRate(final Double t) {
return getCurve().getYValue(t);
}
@Override
public double getForwardRate(final double t) {
final DoublesCurve curve = getCurve();
return curve.getYValue(t) + t * curve.getDyDx(t);
}
@Override
public double[] getInterestRateParameterSensitivity(final double t) {
return ArrayUtils.toPrimitive(_curve.getYValueParameterSensitivity(t));
}
@Override
public int getNumberOfParameters() {
return _curve.size();
}
@Override
public List<String> getUnderlyingCurvesNames() {
return new ArrayList<>();
}
/**
* Gets the underlying curve.
* @return The curve.
*/
public DoublesCurve getCurve() {
return _curve;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + _curve.hashCode();
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final YieldCurve other = (YieldCurve) obj;
return ObjectUtils.equals(_curve, other._curve);
}
@Override
public String toString() {
return "YieldCurve [_curve=" + _curve + "]";
}
}