@Test public void Test() { final boolean print = false; if (print) { System.out.println("AnalyticCDV01Test set print =false before push"); } final double dealSpread = DEAL_SPREAD / 10000; final double[] mrkSpreads = new double[NUM_MARKET_CDS]; for (int i = 0; i < NUM_MARKET_CDS; i++) { mrkSpreads[i] = PAR_SPREADS[i] / 10000; } final ISDACompliantCreditCurve creditCurve = BUILDER.calibrateCreditCurve(MARKET_CDS, mrkSpreads, YIELD_CURVE); final int n = creditCurve.getNumberOfKnots(); final double[][] jacA = new double[n][n]; for (int j = 0; j < n; j++) { final CDSAnalytic cds = MARKET_CDS[j]; for (int i = 0; i < n; i++) { final double dDdH = PRICER.parSpreadCreditSensitivity(cds, YIELD_CURVE, creditCurve, i); jacA[i][j] = dDdH; } } final DoubleMatrix2D jac = new DoubleMatrix2D(jacA); if (print) { System.out.println(jac); System.out.println(); } final double[] temp = new double[n]; for (int i = 0; i < n; i++) { temp[i] = PRICER.pvCreditSensitivity(CDS, YIELD_CURVE, creditCurve, dealSpread, i); } final DoubleMatrix1D dVdH = new DoubleMatrix1D(temp); if (print) { System.out.println(dVdH); System.out.println(); } final LUDecompositionCommons decomp = new LUDecompositionCommons(); final LUDecompositionResult res = decomp.evaluate(jac); final DoubleMatrix1D dVdS = res.solve(dVdH); // compare with bump and reprice final SpreadSensitivityCalculator bumpCal = new SpreadSensitivityCalculator(); final double[] fd = bumpCal.bucketedCS01FromParSpreads( CDS, dealSpread, YIELD_CURVE, MARKET_CDS, mrkSpreads, 1e-7, BumpType.ADDITIVE); final DoubleMatrix1D fd_dVdS = new DoubleMatrix1D(fd); if (print) { System.out.println(dVdS); System.out.println(fd_dVdS); } for (int i = 0; i < n; i++) { assertEquals( fd_dVdS.getEntry(i), dVdS.getEntry(i), 1e-6); // the fd is only forward difference - so accuracy is not great } }
private double[] priceDiff( final CDSAnalytic cds, final ISDACompliantCreditCurve creditCurve, final double coupon, final ISDACompliantYieldCurve[] bumpedYC, final ISDACompliantYieldCurve baseYC) { final double basePV = _pricer.pv(cds, baseYC, creditCurve, coupon, PriceType.DIRTY); final int n = bumpedYC.length; final double[] res = new double[n]; for (int i = 0; i < n; i++) { final double pv = _pricer.pv(cds, bumpedYC[i], creditCurve, coupon, PriceType.DIRTY); res[i] = pv - basePV; } return res; }
@Test 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, PriceType.DIRTY); // System.out.println(MATURITIES[i] + "\t" + dPV); assertEquals(MATURITIES[i].toString(), EXPECTED_UPFRONT_CHARGE[i], dPV, 1e-15); } }
private double priceDiff( final CDSAnalytic cds, final ISDACompliantCreditCurve creditCurve, final double coupon, final ISDACompliantYieldCurve yc1, final ISDACompliantYieldCurve yc2) { final double pv1 = _pricer.pv(cds, yc1, creditCurve, coupon, PriceType.DIRTY); final double pv2 = _pricer.pv(cds, yc2, creditCurve, coupon, PriceType.DIRTY); return pv1 - pv2; }