/usr/include/ql/instruments/creditdefaultswap.hpp is in libquantlib0-dev 1.4-2+b1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2008, 2009 Jose Aparicio
Copyright (C) 2008 Roland Lichters
Copyright (C) 2008 StatPro Italia srl
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
/*! \file creditdefaultswap.hpp
\brief Credit default swap
*/
#ifndef quantlib_credit_default_swap_hpp
#define quantlib_credit_default_swap_hpp
#include <ql/instrument.hpp>
#include <ql/cashflow.hpp>
#include <ql/default.hpp>
#include <ql/termstructures/defaulttermstructure.hpp>
#include <ql/time/schedule.hpp>
namespace QuantLib {
class YieldTermStructure;
class Claim;
//! Credit default swap
/*! \note This instrument currently assumes that the issuer did
not default until today's date.
\warning if <tt>Settings::includeReferenceDateCashFlows()</tt>
is set to <tt>true</tt>, payments occurring at the
settlement date of the swap might be included in the
NPV and therefore affect the fair-spread
calculation. This might not be what you want.
\ingroup instruments
*/
class CreditDefaultSwap : public Instrument {
public:
class arguments;
class results;
class engine;
//! \name Constructors
//@{
//! CDS quoted as running-spread only
/*! @param side Whether the protection is bought or sold.
@param notional Notional value
@param spread Running spread in fractional units.
@param schedule Coupon schedule.
@param paymentConvention Business-day convention for
payment-date adjustment.
@param dayCounter Day-count convention for accrual.
@param settlesAccrual Whether or not the accrued coupon is
due in the event of a default.
@param paysAtDefaultTime If set to true, any payments
triggered by a default event are
due at default time. If set to
false, they are due at the end of
the accrual period.
@param protectionStart The first date where a default
event will trigger the contract.
*/
CreditDefaultSwap(Protection::Side side,
Real notional,
Rate spread,
const Schedule& schedule,
BusinessDayConvention paymentConvention,
const DayCounter& dayCounter,
bool settlesAccrual = true,
bool paysAtDefaultTime = true,
const Date& protectionStart = Date(),
const boost::shared_ptr<Claim>& =
boost::shared_ptr<Claim>());
//! CDS quoted as upfront and running spread
/*! @param side Whether the protection is bought or sold.
@param notional Notional value
@param upfront Upfront in fractional units.
@param spread Running spread in fractional units.
@param schedule Coupon schedule.
@param paymentConvention Business-day convention for
payment-date adjustment.
@param dayCounter Day-count convention for accrual.
@param settlesAccrual Whether or not the accrued coupon is
due in the event of a default.
@param paysAtDefaultTime If set to true, any payments
triggered by a default event are
due at default time. If set to
false, they are due at the end of
the accrual period.
@param protectionStart The first date where a default
event will trigger the contract.
@param upfrontDate Settlement date for the upfront payment.
*/
CreditDefaultSwap(Protection::Side side,
Real notional,
Rate upfront,
Rate spread,
const Schedule& schedule,
BusinessDayConvention paymentConvention,
const DayCounter& dayCounter,
bool settlesAccrual = true,
bool paysAtDefaultTime = true,
const Date& protectionStart = Date(),
const Date& upfrontDate = Date(),
const boost::shared_ptr<Claim>& =
boost::shared_ptr<Claim>());
//@}
//! \name Instrument interface
//@{
bool isExpired() const;
void setupArguments(PricingEngine::arguments*) const;
void fetchResults(const PricingEngine::results*) const;
//@}
//! \name Inspectors
//@{
Protection::Side side() const;
Real notional() const;
Rate runningSpread() const;
boost::optional<Rate> upfront() const;
bool settlesAccrual() const;
bool paysAtDefaultTime() const;
const Leg& coupons() const;
//! The first date for which defaults will trigger the contract
const Date& protectionStartDate() const;
//! The last date for which defaults will trigger the contract
const Date& protectionEndDate() const;
//@}
//! \name Results
//@{
/*! Returns the upfront spread that, given the running spread
and the quoted recovery rate, will make the instrument
have an NPV of 0.
*/
Rate fairUpfront() const;
/*! Returns the running spread that, given the quoted recovery
rate, will make the running-only CDS have an NPV of 0.
\note This calculation does not take any upfront into
account, even if one was given.
*/
Rate fairSpread() const;
/*! Returns the variation of the fixed-leg value given a
one-basis-point change in the running spread.
*/
Real couponLegBPS() const;
Real upfrontBPS() const;
Real couponLegNPV() const;
Real defaultLegNPV() const;
Real upfrontNPV() const;
//! Implied hazard rate calculation
/*! \note This method performs the calculation with the
instrument characteristics. It will coincide with
the ISDA calculation if your object has the standard
characteristics. Notably:
- The calendar should have no bank holidays, just
weekends.
- The yield curve should be LIBOR piecewise constant
in fwd rates, with a discount factor of 1 on the
calculation date, which coincides with the trade
date.
- Convention should be Following for yield curve and
contract cashflows.
- The CDS should pay accrued and mature on standard
IMM dates, settle on trade date +1 and upfront
settle on trade date +3.
*/
Rate impliedHazardRate(Real targetNPV,
const Handle<YieldTermStructure>& discountCurve,
const DayCounter& dayCounter,
Real recoveryRate = 0.4,
Real accuracy = 1.0e-6) const;
//! Conventional/standard upfront-to-spread conversion
/*! Under a standard ISDA model and a set of standardised
instrument characteristics, it is the running only quoted
spread that will make a CDS contract have an NPV of 0 when
quoted for that running only spread. Refer to: "ISDA
Standard CDS converter specification." May 2009.
The conventional recovery rate to apply in the calculation
is as specified by ISDA, not necessarily equal to the
market-quoted one. It is typically 0.4 for SeniorSec and
0.2 for subordinate.
\note The conversion employs a flat hazard rate. As a result,
you will not recover the market quotes.
\note This method performs the calculation with the
instrument characteristics. It will coincide with
the ISDA calculation if your object has the standard
characteristics. Notably:
- The calendar should have no bank holidays, just
weekends.
- The yield curve should be LIBOR piecewise constant
in fwd rates, with a discount factor of 1 on the
calculation date, which coincides with the trade
date.
- Convention should be Following for yield curve and
contract cashflows.
- The CDS should pay accrued and mature on standard
IMM dates, settle on trade date +1 and upfront
settle on trade date +3.
*/
Rate conventionalSpread(Real conventionalRecovery,
const Handle<YieldTermStructure>& discountCurve,
const DayCounter& dayCounter) const;
//@}
protected:
//! \name Instrument interface
//@{
void setupExpired() const;
//@}
// data members
Protection::Side side_;
Real notional_;
boost::optional<Rate> upfront_;
Rate runningSpread_;
bool settlesAccrual_, paysAtDefaultTime_;
boost::shared_ptr<Claim> claim_;
Leg leg_;
boost::shared_ptr<CashFlow> upfrontPayment_;
Date protectionStart_;
// results
mutable Rate fairUpfront_;
mutable Rate fairSpread_;
mutable Real couponLegBPS_, couponLegNPV_;
mutable Real upfrontBPS_, upfrontNPV_;
mutable Real defaultLegNPV_;
};
class CreditDefaultSwap::arguments
: public virtual PricingEngine::arguments {
public:
arguments();
Protection::Side side;
Real notional;
boost::optional<Rate> upfront;
Rate spread;
Leg leg;
boost::shared_ptr<CashFlow> upfrontPayment;
bool settlesAccrual;
bool paysAtDefaultTime;
boost::shared_ptr<Claim> claim;
Date protectionStart;
void validate() const;
};
class CreditDefaultSwap::results : public Instrument::results {
public:
Rate fairSpread;
Rate fairUpfront;
Real couponLegBPS;
Real couponLegNPV;
Real defaultLegNPV;
Real upfrontBPS;
Real upfrontNPV;
void reset();
};
class CreditDefaultSwap::engine
: public GenericEngine<CreditDefaultSwap::arguments,
CreditDefaultSwap::results> {};
}
#endif
|