/usr/include/ql/instruments/creditdefaultswap.hpp is in libquantlib0-dev 1.12-1.
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 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 | /* -*- 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.
\warning conventionalSpread (and impliedHazardRate) by default
use the mid-point engine, which is not ISDA conform.
\ingroup instruments
*/
class CreditDefaultSwap : public Instrument {
public:
class arguments;
class results;
class engine;
enum PricingModel {
Midpoint,
ISDA
};
//! \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.
Typically T+1 Notice there is no default
lookback period and protection start here.
In the way it determines the dirty amount it
is more like the trade execution date.
@param lastPeriodDayCounter Day-count convention for accrual in last period
@param rebatesAccrual The protection seller pays the accrued
scheduled current coupon at the start
of the contract. The rebate date is not
provided but computed to be two days after
protection start.
*/
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>(),
const DayCounter& lastPeriodDayCounter = DayCounter(),
const bool rebatesAccrual = true);
//! 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.
Typically T+1 Notice there is no default
lookback period and protection start here.
In the way it determines the dirty amount it
is more like the trade execution date.
@param upfrontDate Settlement date for the upfront and accrual
rebate (if any) payments.
Typically T+3, this is also the default
value.
@param lastPeriodDayCounter Day-count convention for accrual in last period
@param rebatesAccrual The protection seller pays the accrued
scheduled current coupon at the start
of the contract. The rebate date is not
provided but computed to be two days after
protection start.
*/
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>(),
const DayCounter& lastPeriodDayCounter = DayCounter(),
const bool rebatesAccrual = true);
//@}
//! \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;
bool rebatesAccrual() const {return accrualRebate_ != NULL;}
//@}
//! \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;
Real accrualRebateNPV() 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-8,
PricingModel model = Midpoint) 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,
PricingModel model = Midpoint) 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_;
boost::shared_ptr<CashFlow> accrualRebate_;
Date protectionStart_;
Date maturity_;
// results
mutable Rate fairUpfront_;
mutable Rate fairSpread_;
mutable Real couponLegBPS_, couponLegNPV_;
mutable Real upfrontBPS_, upfrontNPV_;
mutable Real defaultLegNPV_;
mutable Real accrualRebateNPV_;
};
class CreditDefaultSwap::arguments
: public virtual PricingEngine::arguments {
public:
arguments();
Protection::Side side;
Real notional;
boost::optional<Rate> upfront;
Rate spread;
Leg leg;
// if not initialized by constructors means theres no flows.
boost::shared_ptr<CashFlow> upfrontPayment;
boost::shared_ptr<CashFlow> accrualRebate;
bool settlesAccrual;
bool paysAtDefaultTime;
boost::shared_ptr<Claim> claim;
Date protectionStart;
Date maturity;
void validate() const;
};
class CreditDefaultSwap::results : public Instrument::results {
public:
Rate fairSpread;
Rate fairUpfront;
Real couponLegBPS;
Real couponLegNPV;
Real defaultLegNPV;
Real upfrontBPS;
Real upfrontNPV;
Real accrualRebateNPV;
void reset();
};
class CreditDefaultSwap::engine
: public GenericEngine<CreditDefaultSwap::arguments,
CreditDefaultSwap::results> {};
}
#endif
|