00001 #pragma once
00002 #ifndef creditCurve_h
00003 #define creditCurve_h
00004
00005 #include "../common/types.h"
00006 #include "../common/date.h"
00007 #include "../PartB/yieldCurve.h"
00008 #include <string.h>
00009 #include <math.h>
00010 #include <valarray>
00011
00012 using namespace std;
00013
00014 #define CC_MAX_NUM_SPREADS 30
00015
00016
00017 #define CC_DEFAULT_RECOVERY_RATE 0.40
00018 #define CC_DEFAULT_FREQUENCY Annual
00019 #define CC_DEFAULT_CURRENCY USD
00020 #define CC_DEFAULT_NAME "creditCurve"
00021
00022 enum CreditSpreadType {
00023
00024 Absolute,
00025
00026 Relative
00027 };
00028
00030 class CreditSpreadPoint {
00031 public:
00033 CreditSpreadPoint(void);
00034
00040 CreditSpreadPoint(Real r, Real T, CreditSpreadType t);
00041
00043 ~CreditSpreadPoint(void);
00044
00045 static char *TypeAsString(CreditSpreadType t);
00046
00048 Real getRate() { return _rate; }
00049
00050 Real getMaturity() { return _maturity; }
00051
00052 CreditSpreadType getSpreadType() { return _spreadtype; }
00053
00054 void setRate(Real r) { _rate = r; };
00055
00056 void setMaturity(Real m) { _maturity = m; };
00057
00058 void setType(CreditSpreadType t) { _spreadtype = t; };
00059 private:
00060 Real _rate;
00061 Real _maturity;
00062 CreditSpreadType _spreadtype;
00063
00064 };
00065
00066 class creditCurve : public yieldCurve {
00067 public:
00068 friend ostream& operator << (ostream &os, const creditCurve& c);
00069 friend ostream& operator << (ostream &os, const creditCurve* c) {
00070 return os << *c;
00071 }
00072
00074 creditCurve(void);
00075
00084 creditCurve(
00085 valarray<yieldPoint> &yp,
00086 valarray<CreditSpreadPoint> &cp,
00087 char *name = CC_DEFAULT_NAME,
00088 Real recoveryRate = CC_DEFAULT_RECOVERY_RATE,
00089 Currency currency = CC_DEFAULT_CURRENCY,
00090 Frequency frequency = CC_DEFAULT_FREQUENCY);
00091
00092 creditCurve(
00093 yieldCurve &yc,
00094 valarray<CreditSpreadPoint> &cp,
00095 char *name = CC_DEFAULT_NAME,
00096 Real recoveryRate = CC_DEFAULT_RECOVERY_RATE,
00097 Currency currency = CC_DEFAULT_CURRENCY,
00098 Frequency frequency = CC_DEFAULT_FREQUENCY);
00099
00100 creditCurve(
00101 Real flatRate,
00102 Real flatSpread,
00103 char *name = CC_DEFAULT_NAME,
00104 Real recoveryRate = CC_DEFAULT_RECOVERY_RATE,
00105 Currency currency = CC_DEFAULT_CURRENCY,
00106 Frequency frequency = CC_DEFAULT_FREQUENCY);
00107
00108 creditCurve(
00109 yieldCurve &yc,
00110 Real flatSpread,
00111 char *name = CC_DEFAULT_NAME,
00112 Real recoveryRate = CC_DEFAULT_RECOVERY_RATE,
00113 Currency currency = CC_DEFAULT_CURRENCY,
00114 Frequency frequency = CC_DEFAULT_FREQUENCY);
00115
00116 creditCurve(const creditCurve &rhs);
00117
00118 creditCurve &
00119 operator=(const creditCurve &rhs);
00120
00121 virtual ~creditCurve(void);
00122
00123 yieldCurve *
00124 createSpreadCurve(
00125 yieldCurve &underlying,
00126 valarray<CreditSpreadPoint> &spreads);
00127
00128 yieldCurve *
00129 combineUnderlyingAndSpreads(
00130 yieldCurve &underlying,
00131 yieldCurve &spreadcurve);
00132
00133 void
00134 assignFlatSpread(Real r);
00135
00136 void
00137 resampleSpread();
00138
00139 virtual Real creditSpread(Real maturity) const {
00140 return (_combined->spotRate(maturity) -
00141 _underlying->spotRate(maturity));
00142 }
00143
00144 virtual Real creditSpread(Date maturityDate) const {
00145 return (_combined->spotRate(maturityDate) -
00146 _underlying->spotRate(maturityDate));
00147 }
00148
00149 virtual Real timeOfCurrentSpread(Real maturity) const;
00150 virtual Natural indexOfCurrentSpread(Real maturity) const;
00151 virtual Real timeOfPreviousSpread(Real maturity) const;
00152 virtual Natural indexOfPreviousSpread(Real maturity) const;
00153 virtual Real survivalProbability(Real maturity) const;
00154 virtual Real cumulativeDefaultProbability(Real maturity) const;
00155 virtual Real swapFees(Real maturity) const;
00156
00163 virtual Real defaultProbability(Real maturity) const;
00164
00172 virtual Real hazardRate(Real maturity) const {
00173 return defaultProbability(maturity);
00174 }
00175
00176 virtual Real spotRate(Real maturity) const {
00177 return _combined->spotRate(maturity);
00178 }
00179
00180 virtual Real spotRate(Date maturityDate) const {
00181 return _combined->spotRate(maturityDate);
00182 }
00183
00188 virtual Real
00189 discountFactor(Real maturity, interestComposition composition=Continuous) {
00190 return _combined->discountFactor(maturity, composition);
00191 }
00192
00198 virtual Real
00199 riskyDiscountFactor(Real maturity, interestComposition composition=Continuous);
00200
00205 virtual Real
00206 discountFactor(Date maturityDate, interestComposition composition=Continuous) {
00207 return _combined->discountFactor(maturityDate, composition);
00208 }
00209
00215 virtual Real
00216 forwardRate(Real forwardStart, Real effectiveLengthOfTheContractAfterStart,
00217 interestComposition composition=Continuous) {
00218 return _combined->forwardRate(forwardStart,
00219 effectiveLengthOfTheContractAfterStart,
00220 composition);
00221 }
00222
00228 virtual Real
00229 forwardRate(Date forwardStart, Date forwardEnd,
00230 interestComposition composition=Continuous) {
00231 return _combined->forwardRate(forwardStart, forwardEnd, composition);
00232 }
00233
00234 virtual valarray<Real> getMaturitiesInTheZCBCurve() const
00235 { return _combined->getMaturitiesInTheZCBCurve(); }
00236
00237 virtual char *getName() { return _combined->getName(); }
00238
00239 Real getRecoveryRate(void) const {return _recoveryRate;}
00240 Currency getCurrency(void) const {return _currency;}
00241 Frequency getFrequency(void) const {return _frequency;}
00242
00243 protected:
00244 yieldCurve *_underlying;
00245 yieldCurve *_combined;
00246
00247 yieldCurve *getUnderlying(void) const {return _underlying;}
00248 yieldCurve *getCombined(void) const {return _combined; }
00249 valarray<CreditSpreadPoint> getSpreads(void) const {return _spreads;}
00250 valarray<cachedval> getSurvivalProbability(void) const {return _survivalProbability;}
00251 valarray<cachedval> getDefaultProbability(void) const {return _defaultProbability;}
00252 valarray<cachedval> getSwapFees(void) const {return _swapFees;}
00253
00254
00255 private:
00256 valarray<CreditSpreadPoint> _spreads;
00257
00258
00259 mutable valarray<cachedval> _survivalProbability;
00260 mutable valarray<cachedval> _defaultProbability;
00261 mutable valarray<cachedval> _swapFees;
00262
00263 Real _recoveryRate;
00264 Currency _currency;
00265 Frequency _frequency;
00266
00267 void
00268 copyObj(const creditCurve &rhs);
00269 };
00270
00271 #endif