/** * 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 org.testng.annotations.Test; import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class YieldSensitivityCalculatorTest { private static YieldSensitivityCalculator YSC = YieldSensitivityCalculator.getInstance(); private static final Currency CUR = Currency.EUR; @Test(expectedExceptions = IllegalArgumentException.class) public void testNullAnnuity1() { YSC.calculateYield((AnnuityCouponFixed) null, 1.0); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullAnnuity2() { YSC.calculatePriceForYield((AnnuityCouponFixed) null, 0.05); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullAnnuity3() { YSC.calculateNthOrderSensitivity((AnnuityCouponFixed) null, 1.0, 3); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullAnnuity4() { YSC.calculateNthOrderSensitivityFromYield((AnnuityCouponFixed) null, 0.04, 1); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNegativeOrder() { YSC.calculateNthOrderSensitivity(new AnnuityCouponFixed(new CouponFixed[] {new CouponFixed(CUR, 2, 2, 0.4)}), 1, -1); } @Test public void testSinglePaymentYield() { final int n = 10; final double pv = 0.875; final CouponFixed[] payments = new CouponFixed[n]; // final PaymentFixed[] payments = new PaymentFixed[n]; final double tau = 0.5; for (int i = 0; i < n - 1; i++) { payments[i] = new CouponFixed(CUR, (i + 1) * tau, tau, 0.0); } payments[n - 1] = new CouponFixed(CUR, n * tau, tau, 2.0); final AnnuityCouponFixed annuity = new AnnuityCouponFixed(payments); final double yield = YieldSensitivityCalculator.getInstance().calculateYield(annuity, pv); assertEquals(Math.log(2.0 * tau / pv) / 10.0 / tau, yield, 1e-8); } @Test public void testSinglePaymentSensitivity() { final int n = 10; final double pv = 0.78945; final CouponFixed[] payments = new CouponFixed[n]; final double tau = 0.5; for (int i = 0; i < n - 1; i++) { payments[i] = new CouponFixed(CUR, (i + 1) * tau, tau, 0.0); } payments[n - 1] = new CouponFixed(CUR, n * tau, tau, 2.0); final AnnuityCouponFixed annuity = new AnnuityCouponFixed(payments); for (int order = 1; order < 5; order++) { final double sense = YieldSensitivityCalculator.getInstance().calculateNthOrderSensitivity(annuity, pv, order); assertEquals(Math.pow(tau * n, order) * pv, sense, 1e-8); } } @Test public void testSinglePaymentSensitivityFromYield() { final int n = 10; final double yield = 0.06; final CouponFixed[] payments = new CouponFixed[n]; final double tau = 0.5; for (int i = 0; i < n - 1; i++) { payments[i] = new CouponFixed(CUR, (i + 1) * tau, tau, 0.0); } payments[n - 1] = new CouponFixed(CUR, n * tau, tau, 2.0); final AnnuityCouponFixed annuity = new AnnuityCouponFixed(payments); final double pv = YieldSensitivityCalculator.getInstance().calculatePriceForYield(annuity, yield); for (int order = 1; order < 5; order++) { final double sense = YieldSensitivityCalculator.getInstance().calculateNthOrderSensitivityFromYield(annuity, yield, order); assertEquals(Math.pow(tau * n, order) * pv, sense, 1e-8); } } }