/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.annuity;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.interestrate.PresentValueCurveSensitivityCalculator;
import com.opengamma.analytics.financial.interestrate.YieldCurveBundle;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve;
import com.opengamma.analytics.math.curve.ConstantDoublesCurve;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.tuple.DoublesPair;
/**
* @deprecated This class tests deprecated functionality
*/
@Deprecated
@Test(groups = TestGroup.UNIT)
public class ZSpreadCalculatorTest {
private static final ZSpreadCalculator CALCULATOR = ZSpreadCalculator.getInstance();
private static final Annuity<CouponFixed> PAYMENTS;
private static final YieldCurveBundle CURVES;
private static final String CURVE_NAME = "A";
private static final double YIELD = 0.04;
private static final Currency CUR = Currency.EUR;
static {
final int n = 5;
final CouponFixed[] rateAtYield = new CouponFixed[n];
CURVES = new YieldCurveBundle(new String[] {CURVE_NAME }, new YieldCurve[] {YieldCurve.from(ConstantDoublesCurve.from(YIELD)) });
for (int i = 0; i < n; i++) {
rateAtYield[i] = new CouponFixed(CUR, 0.5 * (i + 1), CURVE_NAME, 0.5, YIELD);
}
PAYMENTS = new Annuity<>(rateAtYield);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullAnnuity1() {
CALCULATOR.calculatePriceForZSpread(null, CURVES, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullAnnuity2() {
CALCULATOR.calculatePriceSensitivityToCurve(null, CURVES, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullAnnuity3() {
CALCULATOR.calculatePriceSensitivityToZSpread(null, CURVES, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullAnnuity4() {
CALCULATOR.calculateZSpread(null, CURVES, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullAnnuity5() {
CALCULATOR.calculateZSpreadSensitivityToCurve(null, CURVES, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves1() {
CALCULATOR.calculatePriceForZSpread(PAYMENTS, null, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves2() {
CALCULATOR.calculatePriceSensitivityToCurve(PAYMENTS, null, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves3() {
CALCULATOR.calculatePriceSensitivityToZSpread(PAYMENTS, null, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves4() {
CALCULATOR.calculateZSpread(PAYMENTS, null, 0.04);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves5() {
CALCULATOR.calculateZSpreadSensitivityToCurve(PAYMENTS, null, 0.04);
}
@Test
public void testZeroSpread() {
final YieldAndDiscountCurve curve = CURVES.getCurve(CURVE_NAME);
double price = 0;
for (int i = 0; i < 5; i++) {
price += curve.getDiscountFactor(0.5 * (i + 1));
}
price *= YIELD / 2;
assertEquals(0, CALCULATOR.calculateZSpread(PAYMENTS, CURVES, price), 1e-12);
assertEquals(CALCULATOR.calculatePriceForZSpread(PAYMENTS, CURVES, 0), price, 1e-12);
}
@Test
public void testSensitivities() {
double zSpread = 0.06;
final double dPdZ = CALCULATOR.calculatePriceSensitivityToZSpread(PAYMENTS, CURVES, zSpread);
final Map<String, List<DoublesPair>> dZdC = CALCULATOR.calculateZSpreadSensitivityToCurve(PAYMENTS, CURVES, zSpread);
Map<String, List<DoublesPair>> dPdC = CALCULATOR.calculatePriceSensitivityToCurve(PAYMENTS, CURVES, zSpread);
assertEquals(dZdC.size(), dPdC.size());
Iterator<Entry<String, List<DoublesPair>>> iter1 = dZdC.entrySet().iterator();
Iterator<Entry<String, List<DoublesPair>>> iter2 = dPdC.entrySet().iterator();
while (iter1.hasNext()) {
final Entry<String, List<DoublesPair>> e1 = iter1.next();
final Entry<String, List<DoublesPair>> e2 = iter2.next();
assertEquals(e1.getKey(), CURVE_NAME);
assertEquals(e2.getKey(), CURVE_NAME);
final List<DoublesPair> pairs1 = e1.getValue();
final List<DoublesPair> pairs2 = e2.getValue();
assertEquals(pairs1.size(), 5);
assertEquals(pairs2.size(), 5);
for (int i = 0; i < 5; i++) {
assertEquals(pairs1.get(i).first, 0.5 * (i + 1), 1e-15);
assertEquals(pairs2.get(i).first, 0.5 * (i + 1), 1e-15);
assertEquals(-pairs2.get(i).second / pairs1.get(i).second, dPdZ, 1e-15);
}
}
zSpread = 0.0;
dPdC = CALCULATOR.calculatePriceSensitivityToCurve(PAYMENTS, CURVES, zSpread);
final Map<String, List<DoublesPair>> pvSensitivity = PAYMENTS.accept(PresentValueCurveSensitivityCalculator.getInstance(), CURVES);
assertEquals(pvSensitivity.size(), dPdC.size());
iter1 = dPdC.entrySet().iterator();
iter2 = pvSensitivity.entrySet().iterator();
while (iter1.hasNext()) {
final Entry<String, List<DoublesPair>> e1 = iter1.next();
final Entry<String, List<DoublesPair>> e2 = iter2.next();
assertEquals(e1.getKey(), CURVE_NAME);
assertEquals(e2.getKey(), CURVE_NAME);
final List<DoublesPair> pairs1 = e1.getValue();
final List<DoublesPair> pairs2 = e2.getValue();
assertEquals(pairs1.size(), 5);
assertEquals(pairs2.size(), 5);
for (int i = 0; i < 5; i++) {
assertEquals(pairs1.get(i).first, 0.5 * (i + 1), 1e-15);
assertEquals(pairs2.get(i).first, 0.5 * (i + 1), 1e-15);
assertEquals(pairs2.get(i).second, pairs1.get(i).second, 1e-15);
}
}
}
}