/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.pricer.impl.credit.isda;
import static com.opengamma.strata.pricer.impl.credit.isda.ImmDateLogic.getIMMDateSet;
import static com.opengamma.strata.pricer.impl.credit.isda.ImmDateLogic.getNextIMMDate;
import static org.testng.AssertJUnit.assertEquals;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import org.testng.annotations.Test;
import com.opengamma.strata.pricer.impl.credit.isda.IsdaCompliantCreditCurveBuilder.ArbitrageHandling;
/**
* Test.
*/
@Test
public class IsdaFixTest extends IsdaBaseTest {
private static final LocalDate TODAY = LocalDate.of(2011, Month.JUNE, 13);
private static final LocalDate EFFECTIVE_DATE = LocalDate.of(2011, Month.JUNE, 14); // AKA stepin date
private static final LocalDate CASH_SETTLE_DATE = LocalDate.of(2011, Month.JUNE, 16); // AKA valuation date
private static final LocalDate STARTDATE = LocalDate.of(2011, Month.MARCH, 20);
private static final Period[] TENORS = new Period[] {Period.ofMonths(6), Period.ofYears(1), Period.ofYears(3), Period.ofYears(5), Period.ofYears(7), Period.ofYears(10) };
private static final LocalDate NEXT_IMM = getNextIMMDate(TODAY);
private static final LocalDate[] PILLAR_DATES = getIMMDateSet(NEXT_IMM, TENORS);
private static final LocalDate[] MATURITIES = getIMMDateSet(NEXT_IMM, 41);
//yield curve
private static final LocalDate SPOT_DATE = LocalDate.of(2011, Month.JUNE, 15);
private static final String[] YIELD_CURVE_POINTS = new String[] {"1M", "2M", "3M", "6M", "9M", "1Y", "2Y", "3Y", "4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "11Y", "12Y", "15Y", "20Y", "25Y", "30Y" };
private static final String[] YIELD_CURVE_INSTRUMENTS = new String[] {"M", "M", "M", "M", "M", "M", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S" };
private static final double[] YIELD_CURVE_RATES = new double[] {0.00445, 0.009488, 0.012337, 0.017762, 0.01935, 0.020838, 0.01652, 0.02018, 0.023033, 0.02525, 0.02696, 0.02825, 0.02931, 0.03017,
0.03092, 0.0316, 0.03231, 0.03367, 0.03419, 0.03411, 0.03412 };
private static final IsdaCompliantYieldCurve YIELD_CURVE = makeYieldCurve(TODAY, SPOT_DATE, YIELD_CURVE_POINTS, YIELD_CURVE_INSTRUMENTS, YIELD_CURVE_RATES, ACT360, D30360, Period.ofYears(1));
private static final double COUPON = 0.01;
private static final double[] SPREADS = new double[] {0.008863157, 0.008863157, 0.013304469, 0.017149007, 0.018390364, 0.019472189 };
//expected - from ISDA c with fix
private static final double[] EXPECTED_UPFRONT_CHARGE = new double[] {-0.00241075106526235, -0.00269899615991187, -0.00298238427878267, -0.00326282361599637, -0.00354331987012609,
-0.00214761317825186, -0.000780370416529379, 0.000559049539387898, 0.00191612369893203, 0.00326113246893948, 0.00457374473904669, 0.00585461493530264, 0.0071473732885757, 0.0102187194344682,
0.0132019892156819, 0.016100015995287, 0.0190120462912064, 0.0218700573302236, 0.0246447451707703, 0.0273685378129013, 0.0300724366917735, 0.0324352888163721, 0.0347298107220322,
0.0369581573599116, 0.0391958505369267, 0.0413914714774095, 0.0435234698837631, 0.0455936907497847, 0.0476723136393884, 0.0498368066543075, 0.0519373036905721, 0.0539758894867396,
0.0560213423936182, 0.0580273438957959, 0.0599740156744084, 0.0618839928096648, 0.0637794893777406, 0.0656377709642745, 0.0674405858573872, 0.0691898860799818, 0.0709445474586503 };
public void test() {
final IsdaCompliantCreditCurveBuilder curveBuilder = new FastCreditCurveBuilder(MARKIT_FIX, ArbitrageHandling.ZeroHazardRate);
final AnalyticCdsPricer pricer = new AnalyticCdsPricer(MARKIT_FIX);
final int nPillars = PILLAR_DATES.length;
final CdsAnalytic[] pillarCDSS = new CdsAnalytic[nPillars];
for (int i = 0; i < nPillars; i++) {
pillarCDSS[i] = new CdsAnalytic(TODAY, EFFECTIVE_DATE, CASH_SETTLE_DATE, STARTDATE, PILLAR_DATES[i], PAY_ACC_ON_DEFAULT, PAYMENT_INTERVAL, STUB, PROCTECTION_START, RECOVERY_RATE);
}
final IsdaCompliantCreditCurve creditCurve = curveBuilder.calibrateCreditCurve(pillarCDSS, SPREADS, YIELD_CURVE);
final int nMat = MATURITIES.length;
for (int i = 0; i < nMat; i++) {
final CdsAnalytic cds = new CdsAnalytic(TODAY, EFFECTIVE_DATE, CASH_SETTLE_DATE, STARTDATE, MATURITIES[i], PAY_ACC_ON_DEFAULT, PAYMENT_INTERVAL, STUB, PROCTECTION_START, RECOVERY_RATE);
final double dPV = pricer.pv(cds, YIELD_CURVE, creditCurve, COUPON, CdsPriceType.DIRTY);
assertEquals(MATURITIES[i].toString(), EXPECTED_UPFRONT_CHARGE[i], dPV, 1e-15);
}
}
}