Package com.opengamma.analytics.financial.credit.creditdefaultswap.pricing.vanilla.isdanew

Source Code of com.opengamma.analytics.financial.credit.creditdefaultswap.pricing.vanilla.isdanew.CDSPaperExamples

/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.credit.creditdefaultswap.pricing.vanilla.isdanew;

import static com.opengamma.analytics.financial.credit.creditdefaultswap.pricing.vanilla.isdanew.IMMDateLogic.getIMMDateSet;
import static com.opengamma.analytics.financial.credit.creditdefaultswap.pricing.vanilla.isdanew.IMMDateLogic.getNextIMMDate;
import static com.opengamma.financial.convention.businessday.BusinessDayDateUtils.addWorkDays;

import java.util.Arrays;

import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import org.threeten.bp.Month;
import org.threeten.bp.Period;
import org.threeten.bp.format.DateTimeFormatter;

import com.opengamma.analytics.financial.credit.PriceType;
import com.opengamma.analytics.financial.credit.creditdefaultswap.pricing.vanilla.isdanew.ISDACompliantCreditCurveBuilder.ArbitrageHandling;
import com.opengamma.analytics.financial.model.BumpType;
import com.opengamma.analytics.math.linearalgebra.LUDecompositionCommons;
import com.opengamma.analytics.math.linearalgebra.LUDecompositionResult;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.analytics.math.matrix.MatrixAlgebra;
import com.opengamma.analytics.math.matrix.OGMatrixAlgebra;
import com.opengamma.util.ArgumentChecker;

/**
*
*/
public class CDSPaperExamples extends ISDABaseTest {
  private static final MatrixAlgebra MA = new OGMatrixAlgebra();
  private static final DateTimeFormatter DATE_FORMATT = DateTimeFormatter.ofPattern("dd-MMM-yy");

  private static final PointsUpFrontConverter PUF_CONVERTER = new PointsUpFrontConverter(true);
  private static final AnalyticCDSPricer PRICER = new AnalyticCDSPricer(true);
  private static final SpreadSensitivityCalculator SPREAD_SENCE_CAL = new SpreadSensitivityCalculator(true);
  private static final CDSAnalyticFactory CDS_FACTORY = new CDSAnalyticFactory(0.4);

  private static final LocalDate TODAY = LocalDate.of(2011, Month.JUNE, 13);
  private static final LocalDate NEXT_IMM = getNextIMMDate(TODAY);

  private static final LocalDate TRADE_DATE = LocalDate.of(2011, Month.JUNE, 14);
  private static final LocalDate STEPIN = TRADE_DATE.plusDays(1);
  private static final LocalDate CASH_SETTLE_DATE = addWorkDays(TRADE_DATE, 3, DEFAULT_CALENDAR); // 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(EFFECTIVE_DATE);
  private static final LocalDate[] PILLAR_DATES = getIMMDateSet(NEXT_IMM, TENORS);
  private static final LocalDate[] IMM_DATES = getIMMDateSet(NEXT_IMM, 41);
  private static final LocalDate[] MATURITIES_6M_STEP;
  private static final LocalDate[] MATURITIES_1Y_STEP;

  //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(TRADE_DATE, 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.007926718, 0.007926718, 0.012239372, 0.016978579, 0.019270856, 0.02086048 };
  private static final CDSAnalytic[] PILLAR_CDSS;
  private static final ISDACompliantCreditCurve CREDIT_CURVE;

  static {
    final ISDACompliantCreditCurveBuilder curveBuilder = new FastCreditCurveBuilder(true, ArbitrageHandling.ZeroHazardRate);

    final int nPillars = PILLAR_DATES.length;
    PILLAR_CDSS = new CDSAnalytic[nPillars];
    for (int i = 0; i < nPillars; i++) {
      PILLAR_CDSS[i] = new CDSAnalytic(TRADE_DATE, STEPIN, CASH_SETTLE_DATE, STARTDATE, PILLAR_DATES[i], PAY_ACC_ON_DEFAULT, PAYMENT_INTERVAL, STUB, PROCTECTION_START, RECOVERY_RATE);
    }

    CREDIT_CURVE = curveBuilder.calibrateCreditCurve(PILLAR_CDSS, SPREADS, YIELD_CURVE);

    final int n = IMM_DATES.length;
    final LocalDate[] temp = new LocalDate[n];
    int count = 0;
    for (int i = 0; i < n; i = i + 2) {
      temp[count++] = IMM_DATES[i];
    }
    MATURITIES_6M_STEP = new LocalDate[count];
    System.arraycopy(temp, 0, MATURITIES_6M_STEP, 0, count);

    count = 0;
    for (int i = 0; i < n; i = i + 4) {
      temp[count++] = IMM_DATES[i];
    }
    MATURITIES_1Y_STEP = new LocalDate[count];
    System.arraycopy(temp, 0, MATURITIES_1Y_STEP, 0, count);
  }

  @Test(enabled = false)
  public void test() {

    final AnalyticCDSPricer pricer = new AnalyticCDSPricer(true);

    final int nMat = IMM_DATES.length;
    for (int i = 0; i < nMat; i++) {
      final CDSAnalytic cds = new CDSAnalytic(TRADE_DATE, STEPIN, CASH_SETTLE_DATE, STARTDATE, IMM_DATES[i], PAY_ACC_ON_DEFAULT, PAYMENT_INTERVAL, STUB, PROCTECTION_START, RECOVERY_RATE);
      final double dPV = pricer.pv(cds, YIELD_CURVE, CREDIT_CURVE, COUPON, PriceType.DIRTY);
      final double proLeg = pricer.protectionLeg(cds, YIELD_CURVE, CREDIT_CURVE);

      System.out.println(IMM_DATES[i] + "\t" + dPV + "\t" + proLeg);
      //   assertEquals(MATURITIES[i].toString(), EXPECTED_UPFRONT_CHARGE[i], dPV, 1e-15);
    }

  }

  /**
   * Plots price against hazard rate
   */
  @Test(enabled = false)
  public void funcTest() {
    final CDSAnalyticFactory factory = new CDSAnalyticFactory(1.0);
    final CDSAnalytic cds = factory.makeIMMCDS(TRADE_DATE, Period.ofYears(5));
    for (int i = 0; i < 100; i++) {
      final double lambda = 0.8 * i / 100.;
      final ISDACompliantCreditCurve cc = new ISDACompliantCreditCurve(5.0, lambda);
      final double price = PRICER_CORRECT.pv(cds, YIELD_CURVE, cc, 0.05);
      System.out.println(lambda + "\t" + price);
    }
  }

  @Test(enabled = false)
  public void spreadVsPUF() {
    final CDSAnalyticFactory factory = new CDSAnalyticFactory(0.4);
    final CDSAnalytic cds = factory.makeIMMCDS(TRADE_DATE, Period.ofYears(10));

    for (int i = 0; i < 100; i++) {
      final double qs = i * 10;
      final double puf0 = PUF_CONVERTER.toPointsUpFront(cds, new QuotedSpread(0.0, qs * ONE_BP), YIELD_CURVE).getPointsUpFront();
      final double puf100 = PUF_CONVERTER.toPointsUpFront(cds, new QuotedSpread(0.01, qs * ONE_BP), YIELD_CURVE).getPointsUpFront();
      final double puf500 = PUF_CONVERTER.toPointsUpFront(cds, new QuotedSpread(0.05, qs * ONE_BP), YIELD_CURVE).getPointsUpFront();
      System.out.println(qs + "\t" + puf0 + "\t" + puf100 + "\t" + puf500);
    }

  }

  @Test(enabled = false)
  public void parRateSensitivityTest() {
    final DateTimeFormatter formatt = DateTimeFormatter.ofPattern("dd-MMM-yy");
    final StringBuilder out = new StringBuilder();
    final AnalyticCDSPricer pricer = new AnalyticCDSPricer(true);
    final CDSAnalyticFactory factory = new CDSAnalyticFactory(0.4);
    final int nPillars = PILLAR_DATES.length;
    out.append("\\begin{tabular}{");
    for (int i = 0; i < nPillars + 1; i++) {
      out.append("c|");
    }
    out.append("}\n");
    out.append("\\cline{2-" + (nPillars + 1) + "}\n");
    out.append("& \\multicolumn{" + nPillars + "}{c|}{Curve Nodes}\\\\\n");
    out.append("\\hline\n");
    out.append("\\multicolumn{1}{|c|}{CDS Maturity}");
    for (int i = 0; i < nPillars; i++) {
      out.append("& " + TENORS[i].toString());
    }
    out.append("\\\\\n");
    out.append("\\hline\n");

    for (int i = 0; i < IMM_DATES.length; i = i + 2) {
      final LocalDate mat = IMM_DATES[i];
      out.append("\\multicolumn{1}{|c|}{" + mat.toString(formatt) + "}");
      final CDSAnalytic cds = factory.makeCDS(TRADE_DATE, STARTDATE, mat);
      for (int j = 0; j < nPillars; j++) {
        final double sense = pricer.parSpreadCreditSensitivity(cds, YIELD_CURVE, CREDIT_CURVE, j);
        out.append(String.format("& %.4f", sense));

      }
      out.append("\\\\\n");
    }
    out.append("\\hline\n");
    out.append("\\end{tabular}\n");

    System.out.print(out);
  }

  @Test(enabled = false)
  public void pvSensitivityTest() {
    final double coupon = 0.01;
    final DateTimeFormatter formatt = DateTimeFormatter.ofPattern("dd-MMM-yy");
    final StringBuilder out = new StringBuilder();
    final AnalyticCDSPricer pricer = new AnalyticCDSPricer(true);
    final CDSAnalyticFactory factory = new CDSAnalyticFactory(0.4);
    final int nPillars = PILLAR_DATES.length;
    out.append("\\begin{tabular}{");
    for (int i = 0; i < nPillars + 1; i++) {
      out.append("c|");
    }
    out.append("}\n");
    out.append("\\cline{2-" + (nPillars + 1) + "}\n");
    out.append("& \\multicolumn{" + nPillars + "}{c|}{Curve Nodes}\\\\\n");
    out.append("\\hline\n");
    out.append("\\multicolumn{1}{|c|}{CDS Maturity}");
    for (int i = 0; i < nPillars; i++) {
      out.append("& " + TENORS[i].toString());
    }
    out.append("\\\\\n");
    out.append("\\hline\n");

    for (int i = 0; i < nPillars; i++) {
      final LocalDate mat = PILLAR_DATES[i];
      out.append("\\multicolumn{1}{|c|}{" + mat.toString(formatt) + "}");
      final CDSAnalytic cds = factory.makeCDS(TRADE_DATE, STARTDATE, mat);
      for (int j = 0; j < nPillars; j++) {
        final double sense = pricer.pvCreditSensitivity(cds, YIELD_CURVE, CREDIT_CURVE, coupon, j);
        out.append(String.format("& %.5f", sense));

      }
      out.append("\\\\\n");
    }
    out.append("\\hline\n");
    out.append("\\end{tabular}\n");

    System.out.print(out);
  }

  @Test(enabled = false)
  public void hedgingTest1() {
    final double coupon = 0.01;
    final DateTimeFormatter formatt = DateTimeFormatter.ofPattern("dd-MMM-yy");
    final StringBuilder out = new StringBuilder();

    final CDSAnalyticFactory factory = new CDSAnalyticFactory(0.4);
    final int nPillars = PILLAR_DATES.length;
    final double[][] res = new double[nPillars][nPillars];
    for (int i = 0; i < nPillars; i++) {
      final LocalDate mat = PILLAR_DATES[i];
      final CDSAnalytic cds = factory.makeCDS(TRADE_DATE, STARTDATE, mat);
      for (int j = 0; j < nPillars; j++) {
        final double sense = PRICER.pvCreditSensitivity(cds, YIELD_CURVE, CREDIT_CURVE, coupon, j);
        res[j][i] = sense;
      }
    }
    final DoubleMatrix2D jacT = new DoubleMatrix2D(res);
    //  System.out.println(jacT.toString());
    final LUDecompositionCommons decomp = new LUDecompositionCommons();
    final LUDecompositionResult luRes = decomp.evaluate(jacT);

    out.append("\\begin{tabular}{");
    for (int i = 0; i < nPillars + 1; i++) {
      out.append("c|");
    }
    out.append("}\n");
    out.append("\\cline{2-" + (nPillars + 1) + "}\n");
    out.append("& \\multicolumn{" + nPillars + "}{c|}{Hedge Instrument Maturity}\\\\\n");
    out.append("\\hline\n");
    out.append("\\multicolumn{1}{|c|}{CDS Maturity}");
    for (int i = 0; i < nPillars; i++) {
      out.append("& " + TENORS[i].toString());
    }
    out.append("\\\\\n");
    out.append("\\hline\n");

    for (int i = 0; i < IMM_DATES.length; i = i + 2) {
      final LocalDate mat = IMM_DATES[i];
      out.append("\\multicolumn{1}{|c|}{" + mat.toString(formatt) + "}");
      final CDSAnalytic cds = factory.makeCDS(TRADE_DATE, STARTDATE, mat);

      final double[] temp = new double[nPillars];
      for (int j = 0; j < nPillars; j++) {
        final double sense = PRICER.pvCreditSensitivity(cds, YIELD_CURVE, CREDIT_CURVE, coupon, j);
        temp[j] = sense;
      }
      final DoubleMatrix1D vLambda = new DoubleMatrix1D(temp);
      //     System.out.println(vLambda);

      final DoubleMatrix1D w = luRes.solve(vLambda);
      for (int j = 0; j < nPillars; j++) {
        out.append(String.format("& %.5f", w.getEntry(j)));
      }

      out.append("\\\\\n");
    }
    out.append("\\hline\n");
    out.append("\\end{tabular}\n");
    System.out.print(out);
  }

  @SuppressWarnings("unused")
  @Test(enabled = false)
  public void hedgingTest2() {

    final double coupon = 0.01;
    final AnalyticCDSPricer pricer = new AnalyticCDSPricer(true);
    final CDSAnalyticFactory factory = new CDSAnalyticFactory(0.4);
    final LocalDate mat = LocalDate.of(2015, Month.JUNE, 20);
    final LocalDate mat1 = LocalDate.of(2014, Month.JUNE, 20);
    final LocalDate mat2 = LocalDate.of(2016, Month.JUNE, 20);
    final double[] notional = new double[] {1.0, -0.47556, -0.52474 };

    final CDSAnalytic[] cdsPort = new CDSAnalytic[3];
    cdsPort[0] = factory.makeCDS(TRADE_DATE, STARTDATE, mat);
    cdsPort[1] = factory.makeCDS(TRADE_DATE, STARTDATE, mat1);
    cdsPort[2] = factory.makeCDS(TRADE_DATE, STARTDATE, mat2);
    final double basePV = pricer.pv(cdsPort[0], YIELD_CURVE, CREDIT_CURVE, coupon);
    double basePVH = 0;
    for (int i = 0; i < 3; i++) {
      basePVH += notional[i] * pricer.pv(cdsPort[i], YIELD_CURVE, CREDIT_CURVE, coupon);
    }

    for (int k = 0; k < 101; k++) {
      final double bump = -100 + 2.0 * k;
      final ISDACompliantCreditCurve cc = bumpCurve(CREDIT_CURVE, bump * ONE_BP);
      final ISDACompliantCreditCurve ccTilt = tiltCurve(CREDIT_CURVE, bump * ONE_BP);
      final double pv = pricer.pv(cdsPort[0], YIELD_CURVE, cc, coupon);
      double pvH = 0;
      double pvTilt = 0;
      for (int i = 0; i < 3; i++) {
        pvH += notional[i] * pricer.pv(cdsPort[i], YIELD_CURVE, cc, coupon);
        pvTilt += notional[i] * pricer.pv(cdsPort[i], YIELD_CURVE, ccTilt, coupon);
      }
      System.out.println(bump + "\t" + (pvH - basePVH) * 1e7 + "\t" + (pvTilt - basePVH) * 1e7);
    }
  }

  /**
   * The sensitivity of the PV of a set of CDSs to the par spreads of the CDSs used to construct the credit curve.
   *  The last column shows the sensitivity of all the spreads moving in parallel. The (priced) CDSs all have a coupon of 100bps.
   *  All CDSs have a recovery rate of 40\% and the Trade date is 13-Jun-2011.
   */
  @Test(enabled = false)
  public void analCS01test() {

    final int nMat = MATURITIES_6M_STEP.length;
    final double[] coupons = new double[nMat];
    Arrays.fill(coupons, COUPON);
    final CDSAnalytic[] cds = CDS_FACTORY.makeCDS(TRADE_DATE, STARTDATE, MATURITIES_6M_STEP);
    final double[][] analCS01 = SPREAD_SENCE_CAL.analyticCS01FromCreditCurve(cds, coupons, PILLAR_CDSS, YIELD_CURVE, CREDIT_CURVE);

    final int nPillars = PILLAR_DATES.length;
    final String[] columnHeadings = new String[nPillars + 1];
    for (int i = 0; i < nPillars; i++) {
      columnHeadings[i] = TENORS[i].toString();
    }
    columnHeadings[nPillars] = "Total";

    final String[] rowHeadings = new String[nMat];
    final double[][] data = new double[nMat][nPillars + 1];
    for (int i = 0; i < nMat; i++) {
      rowHeadings[i] = MATURITIES_6M_STEP[i].toString(DATE_FORMATT);
      System.arraycopy(analCS01[i], 0, data[i], 0, nPillars);
      double sum = 0;
      for (int j = 0; j < nPillars; j++) {
        sum += analCS01[i][j];
      }
      data[i][nPillars] = sum;
    }

    System.out.println(dumpLatexTable("Tenors", "CDS Maturities", columnHeadings, rowHeadings, data, 4));
  }

  @Test(enabled = false)
  void analVFDCS01Test() {
    final LocalDate mat = LocalDate.of(2019, Month.JUNE, 20);
    final CDSAnalytic cds = CDS_FACTORY.makeCDS(TRADE_DATE, STARTDATE, mat);
    final double[] analCS01 = SPREAD_SENCE_CAL.analyticCS01FromCreditCurve(cds, COUPON, PILLAR_CDSS, YIELD_CURVE, CREDIT_CURVE);
    final double pCS01 = SPREAD_SENCE_CAL.parallelCS01FromParSpreads(cds, COUPON, YIELD_CURVE, PILLAR_CDSS, SPREADS, ONE_BP, BumpType.ADDITIVE);
    final double[] bCS01 = SPREAD_SENCE_CAL.bucketedCS01FromCreditCurve(cds, COUPON, PILLAR_CDSS, YIELD_CURVE, CREDIT_CURVE, ONE_BP);

    final int nPillars = PILLAR_DATES.length;
    final String[] columnHeadings = new String[nPillars + 2];

    final double[][] data = new double[2][nPillars + 2];
    double sumA = 0;
    double sumFD = 0;
    for (int i = 0; i < nPillars; i++) {
      columnHeadings[i] = TENORS[i].toString();
      data[0][i] = analCS01[i];
      sumA += analCS01[i];
      data[1][i] = bCS01[i];
      sumFD += bCS01[i];
    }
    data[0][nPillars] = sumA;
    data[0][nPillars + 1] = sumA;
    data[1][nPillars] = sumFD;
    data[1][nPillars + 1] = pCS01;
    columnHeadings[nPillars] = "Sum";
    columnHeadings[nPillars + 1] = "Parallel";
    final String[] rowHeadings = new String[] {"Analytic", "Forward FD" };
    System.out.println(dumpLatexTable("Tenors", "Calculation Method", columnHeadings, rowHeadings, data, 5));
  }

  @Test(enabled = false)
  public void spreadHedgeTest() {
    final LUDecompositionCommons decomp = new LUDecompositionCommons();
    final int nPillars = PILLAR_CDSS.length;
    final double[] coupons = new double[nPillars];
    Arrays.fill(coupons, COUPON);
    final double[][] temp = SPREAD_SENCE_CAL.analyticCS01FromCreditCurve(PILLAR_CDSS, coupons, PILLAR_CDSS, YIELD_CURVE, CREDIT_CURVE);
    final DoubleMatrix2D jacT = MA.getTranspose(new DoubleMatrix2D(temp));
    //System.out.println(jac);
    final LUDecompositionResult decRes = decomp.evaluate(jacT);

    final int nMat = MATURITIES_6M_STEP.length;

    final double[][] res = new double[nMat][];
    final CDSAnalytic[] cds = CDS_FACTORY.makeCDS(TRADE_DATE, STARTDATE, MATURITIES_6M_STEP);
    for (int i = 0; i < nMat; i++) {
      final double[] vs = SPREAD_SENCE_CAL.analyticCS01FromCreditCurve(cds[i], COUPON, PILLAR_CDSS, YIELD_CURVE, CREDIT_CURVE);
      res[i] = decRes.solve(vs);
    }
    final DoubleMatrix2D hedge = new DoubleMatrix2D(res);
    System.out.println(hedge);
  }

  @Test(enabled = false)
  public void parallelCS01Test() {
    final PointsUpFrontConverter puf_con = new PointsUpFrontConverter(true);
    final ISDACompliantCreditCurveBuilder curveBuilder = new FastCreditCurveBuilder(true, ArbitrageHandling.ZeroHazardRate);
    final LocalDate mat = LocalDate.of(2019, Month.JUNE, 20);
    final CDSAnalytic cds = CDS_FACTORY.makeCDS(TRADE_DATE, STARTDATE, mat);

    final QuotedSpread quote = new QuotedSpread(COUPON, 135 * ONE_BP);
    final double cs01FD = SPREAD_SENCE_CAL.parallelCS01(cds, quote, YIELD_CURVE, COUPON);
    final ISDACompliantCreditCurve cc = curveBuilder.calibrateCreditCurve(cds, quote, YIELD_CURVE);
    final PointsUpFront puf = puf_con.toPointsUpFront(cds, quote, YIELD_CURVE);
    System.out.println(puf.getPointsUpFront());
    final ISDACompliantCreditCurve cc2 = curveBuilder.calibrateCreditCurve(cds, COUPON, YIELD_CURVE, puf.getPointsUpFront());

    final double cs01Anal = PRICER_CORRECT.pvCreditSensitivity(cds, YIELD_CURVE, cc, COUPON, 0) / PRICER_CORRECT.parSpreadCreditSensitivity(cds, YIELD_CURVE, cc, 0);
    final double cs01Anal2 = PRICER_CORRECT.pvCreditSensitivity(cds, YIELD_CURVE, cc2, COUPON, 0) / PRICER_CORRECT.parSpreadCreditSensitivity(cds, YIELD_CURVE, cc2, 0);
    System.out.println(cs01FD + "\t" + cs01Anal + "\t" + cs01Anal2);

    final double eps = 1e-5;
    final PointsUpFront pufUp = puf_con.toPointsUpFront(cds, new QuotedSpread(COUPON, quote.getQuotedSpread() + eps), YIELD_CURVE);
    final PointsUpFront pufDown = puf_con.toPointsUpFront(cds, new QuotedSpread(COUPON, quote.getQuotedSpread() - eps), YIELD_CURVE);
    final double res = (pufUp.getPointsUpFront() - pufDown.getPointsUpFront()) / 2 / eps;
    System.out.println(res);
  }

  @Test(enabled = false)
  public void flatHazardTest() {
    final ISDACompliantCreditCurve flat = new ISDACompliantCreditCurve(1.0, 0.01);
    final int nMat = IMM_DATES.length;
    final CDSAnalytic[] cds = CDS_FACTORY.makeCDS(TRADE_DATE, STARTDATE, IMM_DATES);
    for (int i = 0; i < nMat; i++) {
      final double t = ACT365.getDayCountFraction(TRADE_DATE, IMM_DATES[i]);
      final double s = PRICER_CORRECT.parSpread(cds[i], YIELD_CURVE, flat);
      System.out.println(t + "\t" + s * TEN_THOUSAND);
    }
  }

  @Test(enabled = false)
  public void bucketedCS01() {
    final PointsUpFrontConverter puf_con = new PointsUpFrontConverter(true);
    final int nMat = MATURITIES_1Y_STEP.length;
    final int nPillars = PILLAR_CDSS.length;
    final CDSAnalytic[] cds = CDS_FACTORY.makeCDS(TRADE_DATE, STARTDATE, MATURITIES_1Y_STEP);
    for (int j = 0; j < nPillars; j++) {
      System.out.print("\t" + TENORS[j]);
    }
    System.out.print("\n");
    for (int i = 0; i < nMat; i++) {
      final double puf = PRICER_CORRECT.pv(cds[i], YIELD_CURVE, CREDIT_CURVE, COUPON);
      final double qs = puf_con.pufToQuotedSpread(cds[i], COUPON, YIELD_CURVE, puf);
      final double[] spreads = new double[nPillars];
      Arrays.fill(spreads, qs);
      //      final double[] bCS01 = SPREAD_SENCE_CAL.bucketedCS01FromParSpreads(cds[i], COUPON, YIELD_CURVE, PILLAR_CDSS, spreads, ONE_BP, BumpType.ADDITIVE);
      //      final double pCS01 = SPREAD_SENCE_CAL.parallelCS01FromParSpreads(cds[i], COUPON, YIELD_CURVE, PILLAR_CDSS, spreads, ONE_BP, BumpType.ADDITIVE);
      final double[] bCS01 = SPREAD_SENCE_CAL.bucketedCS01FromQuotedSpreads(cds[i], COUPON, YIELD_CURVE, PILLAR_CDSS, SPREADS, ONE_BP, BumpType.ADDITIVE);
      final double pCS01 = SPREAD_SENCE_CAL.parallelCS01FromQuotedSpread(cds[i], COUPON, YIELD_CURVE, cds[i], qs, ONE_BP, BumpType.ADDITIVE);
      System.out.print(MATURITIES_1Y_STEP[i]);
      double sum = 0;
      for (int j = 0; j < nPillars; j++) {
        sum += bCS01[j];
        System.out.print("\t" + bCS01[j]);
      }
      System.out.print("\t" + sum + "\t" + pCS01);
      System.out.print("\n");
    }
  }

  @Test(enabled = false)
  public void yieldSenseTest() {
    final String[] ycPoints = new String[] {"1M", "3M", "6M", "1Y", "3Y", "5Y", "7Y", "10Y", "11Y", "12Y", "15Y", "20Y", "25Y", "30Y" };
    final String[] instuments = new String[] {"M", "M", "M", "M", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S" };
    final double[] 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 };
    final ISDACompliantYieldCurve yc = makeYieldCurve(TRADE_DATE, SPOT_DATE, ycPoints, instuments, rates, ACT360, D30360, Period.ofYears(1));

    final int nMat = MATURITIES_1Y_STEP.length;
    final int nYCPoints = ycPoints.length;
    final CDSAnalytic[] cds = CDS_FACTORY.makeCDS(TRADE_DATE, STARTDATE, MATURITIES_1Y_STEP);
    for (int j = 0; j < nYCPoints; j++) {
      System.out.print("\t" + ycPoints[j]);
    }
    System.out.print("\n");
    for (int i = 0; i < nMat; i++) {
      System.out.print(MATURITIES_1Y_STEP[i].toString(DATE_FORMATT));
      for (int j = 0; j < nYCPoints; j++) {
        final double sense = PRICER_CORRECT.pvYieldSensitivity(cds[i], yc, CREDIT_CURVE, COUPON, j);
        System.out.print("\t" + sense);
      }
      System.out.print("\n");
    }
  }

  private String dumpLatexTable(final String heading1, final String heading2, final String[] columnHeadings, final String[] rowHeadings, final double[][] data, final int dp) {

    ArgumentChecker.noNulls(columnHeadings, "columnHeadings");
    ArgumentChecker.noNulls(rowHeadings, "rowHeadings");
    ArgumentChecker.noNulls(data, "data");
    final int nColumns = columnHeadings.length;
    final int nRows = rowHeadings.length;
    ArgumentChecker.isTrue(nColumns == data[0].length, nColumns + "column headings, but data has " + data[0].length + " columns");
    ArgumentChecker.isTrue(nRows == data.length, nRows + "row headings, but data has " + data.length + " rows");

    final String format = "& %." + dp + "f";
    final StringBuilder out = new StringBuilder();

    out.append("\\begin{tabular}{");
    for (int i = 0; i < nColumns + 1; i++) {
      out.append("c|");
    }
    out.append("}\n");
    out.append("\\cline{2-" + (nColumns + 1) + "}\n");
    out.append("& \\multicolumn{" + nColumns + "}{c|}{" + heading1 + "}\\\\\n");
    out.append("\\hline\n");
    out.append("\\multicolumn{1}{|c|}{" + heading2 + "}");
    for (int i = 0; i < nColumns; i++) {
      out.append("& " + columnHeadings[i]);
    }
    out.append("\\\\\n");
    out.append("\\hline\n");

    for (int i = 0; i < nRows; i++) {
      out.append("\\multicolumn{1}{|c|}{" + rowHeadings[i] + "}");
      for (int j = 0; j < nColumns; j++) {
        out.append(String.format(format, data[i][j]));
      }
      out.append("\\\\\n");
    }
    out.append("\\hline\n");
    out.append("\\end{tabular}\n");

    return out.toString();
  }

  private ISDACompliantCreditCurve bumpCurve(final ISDACompliantCreditCurve curve, final double amount) {
    final double[] r = curve.getR();
    final int n = r.length;
    final double[] res = new double[n];
    for (int i = 0; i < n; i++) {
      res[i] = r[i] + amount;
    }
    return curve.withRates(res);
  }

  private ISDACompliantCreditCurve tiltCurve(final ISDACompliantCreditCurve curve, final double amount) {
    final double[] r = curve.getR();
    final int n = r.length;
    final double[] res = new double[n];
    for (int i = 0; i < n; i++) {
      res[i] = r[i] + (amount / (n / 2)) * (i - n / 2);
    }
    return curve.withRates(res);
  }
}
TOP

Related Classes of com.opengamma.analytics.financial.credit.creditdefaultswap.pricing.vanilla.isdanew.CDSPaperExamples

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.