Beispiel #1
0
        public PremiumLegElement(double protectionStart, CdsCoupon coupon, YieldTermStructure yieldCurve, int creditCurveKnot, double[] knots, AccrualOnDefaultFormulae formula) : base(coupon, yieldCurve, creditCurveKnot)
        {
            _coupon = coupon;

            _creditCurveKnot = creditCurveKnot;
            _formula         = formula;
            if (formula == AccrualOnDefaultFormulae.ORIGINAL_ISDA)
            {
                _omega = 1.0 / 730;
            }
            else
            {
                _omega = 0.0;
            }

            _knots = DoublesScheduleGenerator.truncateSetInclusive(Math.Max(_coupon.getEffStart(), protectionStart), _coupon.getEffEnd(), knots);
            _n     = _knots.Length;
            _rt    = new double[_n];
            _p     = new double[_n];
            for (int i = 0; i < _n; i++)
            {
                _rt[i] = yieldCurve.getRT_(_knots[i]);
                _p[i]  = Math.Exp(-_rt[i]);
            }
        }
Beispiel #2
0
 /**
  * Construct a credit curve builder that uses the specified accrual-on-default formula
  * @param formula The accrual on default formulae. <b>Note</b> The MarkitFix is erroneous
  */
 public FastCreditCurveBuilder(AccrualOnDefaultFormulae formula)
 {
     if (formula == AccrualOnDefaultFormulae.ORIGINAL_ISDA)
     {
         _omega = HALFDAY;
     }
     else
     {
         _omega = 0.0;
     }
 }
 public AnalyticalCdsPricer(AccrualOnDefaultFormulae formula)
 {
     _formula = formula;
     if (_formula == AccrualOnDefaultFormulae.ORIGINAL_ISDA)
     {
         _omega = HALFDAY;
     }
     else
     {
         _omega = 0.0;
     }
 }
 /**
  * Constructor specifying formula used in pricer and credit curve builder.
  *
  * @param formula The formula
  */
 public HedgeRatioCalculator(AccrualOnDefaultFormulae formula)
 {
     _pricer  = new AnalyticalCdsPricer(formula);
     _builder = new FastCreditCurveBuilder(formula);
 }
        public CreditCurveCalibrator(MultiCdsAnalytic multiCDS, YieldTermStructure yieldCurve, AccrualOnDefaultFormulae formula)
        {
            _nCDS        = multiCDS.getNumMaturities();
            _t           = new double[_nCDS];
            _lgd         = new double[_nCDS];
            _unitAccured = new double[_nCDS];
            for (int i = 0; i < _nCDS; i++)
            {
                _t[i]           = multiCDS.getProtectionEnd(i);
                _lgd[i]         = multiCDS.getLGD();
                _unitAccured[i] = multiCDS.getAccruedPremiumPerUnitSpread(i);
            }
            _valuationDF = Math.Exp(-yieldCurve.getRT_(multiCDS.getCashSettleTime()));

            //This is the global set of knots - it will be truncated down for the various leg elements
            //TODO this will not match ISDA C for forward starting (i.e. accStart > tradeDate) CDS, and will give different answers
            //if the Markit 'fix' is used in that case
            double[] knots = DoublesScheduleGenerator.getIntegrationsPoints(
                multiCDS.getEffectiveProtectionStart(), _t[_nCDS - 1], yieldCurve.t.ToArray(), _t.ToArray());

            //The protection leg
            _protElems = new ProtectionLegElement[_nCDS];
            for (int i = 0; i < _nCDS; i++)
            {
                _protElems[i] = new ProtectionLegElement(
                    i == 0 ? multiCDS.getEffectiveProtectionStart() : _t[i - 1], _t[i], yieldCurve, i, knots);
            }

            _cds2CouponsMap      = new int[_nCDS][];
            _cdsCouponsUpdateMap = new int[_nCDS][];
            _knot2CouponsMap     = new int[_nCDS][];

            List <CdsCoupon> allCoupons = new List <CdsCoupon>(_nCDS + multiCDS.getTotalPayments() - 1);

            allCoupons.AddRange(multiCDS.getStandardCoupons().ToList());
            allCoupons.Add(multiCDS.getTerminalCoupon(_nCDS - 1));
            int[] temp = new int[multiCDS.getTotalPayments()];
            for (int i = 0; i < multiCDS.getTotalPayments(); i++)
            {
                temp[i] = i;
            }
            _cds2CouponsMap[_nCDS - 1] = temp;

            //complete the list of unique coupons and fill out the cds2CouponsMap
            for (int i = 0; i < _nCDS - 1; i++)
            {
                CdsCoupon c         = multiCDS.getTerminalCoupon(i);
                int       nPayments = Math.Max(0, multiCDS.getPaymentIndexForMaturity(i)) + 1;
                _cds2CouponsMap[i] = new int[nPayments];
                for (int jj = 0; jj < nPayments - 1; jj++)
                {
                    _cds2CouponsMap[i][jj] = jj;
                }
                //because of business-day adjustment, a terminal coupon can be identical to a standard coupon,
                //in which case it is not added again
                int index = allCoupons.IndexOf(c);
                if (index == -1)
                {
                    index = allCoupons.Count;
                    allCoupons.Add(c);
                }
                _cds2CouponsMap[i][nPayments - 1] = index;
            }

            //loop over the coupons to populate the couponUpdateMap
            _nCoupons = allCoupons.Count;
            int[] sizes = new int[_nCDS];
            int[] map   = new int[_nCoupons];
            for (int i = 0; i < _nCoupons; i++)
            {
                CdsCoupon c     = allCoupons[i];
                int       index = Array.BinarySearch(_t, c.getEffEnd());
                if (index < 0)
                {
                    index = -(index + 1);
                }
                sizes[index]++;
                map[i] = index;
            }

            //make the protection leg elements

            if (multiCDS.isPayAccOnDefault())
            {
                _premElems = new PremiumLegElement[_nCoupons];
                for (int i = 0; i < _nCoupons; i++)
                {
                    _premElems[i] = new PremiumLegElement(multiCDS.getEffectiveProtectionStart(), allCoupons[i], yieldCurve, map[i],
                                                          knots, formula);
                }
            }
            else
            {
                _premElems = new CouponOnlyElement[_nCoupons];
                for (int i = 0; i < _nCoupons; i++)
                {
                    _premElems[i] = new CouponOnlyElement(allCoupons[i], yieldCurve, map[i]);
                }
            }

            //sort a map from coupon to curve node, to a map from curve node to coupons
            for (int i = 0; i < _nCDS; i++)
            {
                _knot2CouponsMap[i] = new int[sizes[i]];
            }
            int[] indexes = new int[_nCDS];
            for (int i = 0; i < _nCoupons; i++)
            {
                int index = map[i];
                _knot2CouponsMap[index][indexes[index]++] = i;
            }

            //the cdsCouponsUpdateMap is the intersection of the cds2CouponsMap and knot2CouponsMap
            for (int i = 0; i < _nCDS; i++)
            {
                _cdsCouponsUpdateMap[i] = intersection(_knot2CouponsMap[i], _cds2CouponsMap[i]);
            }
        }
        public CreditCurveCalibrator(CDS[] cds, YieldTermStructure yieldCurve, AccrualOnDefaultFormulae formula)
        {
            _nCDS = cds.Length;
            Boolean payAccOnDefault = cds[0].isPayAccOnDefault();
            double  accStart        = cds[0].getAccStart();
            double  effectProtStart = cds[0].getEffectiveProtectionStart();
            double  cashSettleTime  = cds[0].getCashSettleTime();

            _t    = new double[_nCDS];
            _t[0] = cds[0].getProtectionEnd();
            //Check all the CDSs match
            for (int i = 1; i < _nCDS; i++)
            {
                _t[i] = cds[i].getProtectionEnd();
            }

            _valuationDF = Math.Exp(-yieldCurve.getRT_(cashSettleTime));
            _lgd         = new double[_nCDS];
            _unitAccured = new double[_nCDS];
            for (int i = 0; i < _nCDS; i++)
            {
                _lgd[i]         = cds[i].getLGD();
                _unitAccured[i] = cds[i].getAccruedYearFraction();
            }

            //This is the global set of knots - it will be truncated down for the various leg elements
            //TODO this will not match ISDA C for forward starting (i.e. accStart > tradeDate) CDS, and will give different answers
            //if the Markit 'fix' is used in that case

            double[] knots = DoublesScheduleGenerator.
                             getIntegrationsPoints(effectProtStart, _t[_nCDS - 1], yieldCurve.t.ToArray(), _t);

            //The protection leg
            _protElems = new ProtectionLegElement[_nCDS];
            for (int i = 0; i < _nCDS; i++)
            {
                _protElems[i] = new ProtectionLegElement(i == 0 ? effectProtStart : _t[i - 1], _t[i], yieldCurve, i, knots);
            }

            _cds2CouponsMap      = new int[_nCDS][];
            _cdsCouponsUpdateMap = new int[_nCDS][];
            _knot2CouponsMap     = new int[_nCDS][];

            int nPaymentsFinalCDS       = cds[_nCDS - 1].getNumPayments();
            List <CdsCoupon> allCoupons = new List <CdsCoupon>(_nCDS + nPaymentsFinalCDS - 1);

            allCoupons.AddRange(cds[_nCDS - 1].getCoupons());
            int[] temp = new int[nPaymentsFinalCDS];
            for (int i = 0; i < nPaymentsFinalCDS; i++)
            {
                temp[i] = i;
            }
            _cds2CouponsMap[_nCDS - 1] = temp;

            //complete the list of unique coupons and fill out the cds2CouponsMap
            for (int i = 0; i < _nCDS - 1; i++)
            {
                CdsCoupon[] c         = cds[i].getCoupons();
                int         nPayments = c.Length;
                _cds2CouponsMap[i] = new int[nPayments];
                for (int k = 0; k < nPayments; k++)
                {
                    int index = -1;
                    for (int j = 0; j < allCoupons.Count; j++)
                    {
                        if (allCoupons[j].Equals(c[k]))
                        {
                            index = j;
                            break;
                        }
                    }
                    if (index == -1)
                    {
                        index = allCoupons.Count;
                        allCoupons.Add(c[k]);
                    }
                    _cds2CouponsMap[i][k] = index;
                }
            }

            //loop over the coupons to populate the couponUpdateMap
            _nCoupons = allCoupons.Count;
            int[] sizes = new int[_nCDS];
            int[] map   = new int[_nCoupons];
            for (int i = 0; i < _nCoupons; i++)
            {
                CdsCoupon c     = allCoupons[i];
                int       index = Array.BinarySearch(_t, c.getEffEnd());
                if (index < 0)
                {
                    index = -(index + 1);
                }
                sizes[index]++;
                map[i] = index;
            }

            //make the protection leg elements

            if (payAccOnDefault)
            {
                _premElems = new PremiumLegElement[_nCoupons];
                for (int i = 0; i < _nCoupons; i++)
                {
                    _premElems[i] = new PremiumLegElement(effectProtStart, allCoupons[i], yieldCurve, map[i], knots, formula);
                }
            }
            else
            {
                _premElems = new CouponOnlyElement[_nCoupons];
                for (int i = 0; i < _nCoupons; i++)
                {
                    _premElems[i] = new CouponOnlyElement(allCoupons[i], yieldCurve, map[i]);
                }
            }

            //sort a map from coupon to curve node, to a map from curve node to coupons
            for (int i = 0; i < _nCDS; i++)
            {
                _knot2CouponsMap[i] = new int[sizes[i]];
            }
            int[] indexes = new int[_nCDS];
            for (int i = 0; i < _nCoupons; i++)
            {
                int index = map[i];
                _knot2CouponsMap[index][indexes[index]++] = i;
            }

            //the cdsCouponsUpdateMap is the intersection of the cds2CouponsMap and knot2CouponsMap
            for (int i = 0; i < _nCDS; i++)
            {
                _cdsCouponsUpdateMap[i] = intersection(_knot2CouponsMap[i], _cds2CouponsMap[i]);
            }
        }
 public AnalyticSpreadSensitivityCalculator(AccrualOnDefaultFormulae formula)
 {
     _curveBuilder = new FastCreditCurveBuilder(formula);
     _pricer       = new AnalyticalCdsPricer(formula);
 }
Beispiel #8
0
 protected IsdaCompliantCreditCurveBuilder(AccrualOnDefaultFormulae formula, ArbitrageHandling arbHandling)
 {
     _arbHandling = arbHandling;
     _formula     = formula;
 }
Beispiel #9
0
 protected IsdaCompliantCreditCurveBuilder(AccrualOnDefaultFormulae formula)
 {
     _arbHandling = DEFAULT_ARBITRAGE_HANDLING;
     _formula     = formula;
 }
Beispiel #10
0
 protected IsdaCompliantCreditCurveBuilder()
 {
     _arbHandling = DEFAULT_ARBITRAGE_HANDLING;
     _formula     = DEFAULT_FORMULA;
 }
Beispiel #11
0
 public CdsRiskFactors(AccrualOnDefaultFormulae formula)
 {
     _pricer = new AnalyticalCdsPricer(formula);
 }