31 std::vector<Real> defaultProbability,
32 std::vector<Size> sector,
33 std::vector<Real> relativeDefaultVariance,
36 : exposure_(
std::move(exposure)),
pd_(
std::move(defaultProbability)),
37 sector_(
std::move(sector)), relativeDefaultVariance_(
std::move(relativeDefaultVariance)),
45 <<
") must be equal to number of pds ("
46 <<
pd_.size() <<
")");
48 "number of exposures ("
50 <<
") must be equal to number of exposure sectors ("
56 <<
") must be a square matrix");
59 "number of relative default variances ("
61 <<
" must be equal to number of sectors (" <<
n_ <<
")");
66 for (
Size i = 0; i <
m_; ++i) {
68 << i <<
" is negative ("
73 <<
") is out of range 0..."
98 Real p2 = sum >= p ? sum : 1.0;
102 return l1 + (p - p1) / (p2 - p1) * (l2 - l1);
107 std::vector<Real> sectorPdSum_, sectorSpecTerms_;
109 sectorPdSum_ = std::vector<Real>(
n_, 0.0);
112 sectorSpecTerms_ = std::vector<Real>(
n_, 0.0);
116 std::vector<Real> pdAdj(
m_, 0.0);
120 unsigned long maxNu_ = 0;
124 std::map<unsigned long, Real, std::less<> > epsNuC_;
126 std::map<unsigned long, Real, std::less<> >::iterator iter;
128 for (
Size k = 0; k <
m_; ++k) {
129 auto exUnit = (
unsigned long)(std::floor(0.5 +
exposure_[k] /
unit_));
137 Real el = exUnit * pdAdj[k];
139 iter = epsNuC_.find(exUnit);
140 if (iter == epsNuC_.end()) {
141 epsNuC_.insert(std::pair<unsigned long, Real>(exUnit, el));
143 (*iter).second += el;
152 for (
Size k = 0; k <
m_; ++k) {
159 for (
Size i = 0; i <
n_; ++i) {
164 for (
Size j = 0; j <
n_; ++j) {
166 sectorSpecTerms_[i] +=
178 for (
Size i = 0; i <
n_; ++i) {
182 for (
Size j = 0; j <
n_; ++j) {
193 for (
Size k = 0; k <
m_; ++k) {
199 for (
Size i = 0; i <
n_; ++i)
204 for (
Size k = 0; k <
m_; ++k) {
211 Real sigmaC_ = pdSum_ * sqrt(matchUl_ / (
el_ *
el_));
212 Real alphaC_ = pdSum_ * pdSum_ / (sigmaC_ * sigmaC_);
213 Real betaC_ = sigmaC_ * sigmaC_ / pdSum_;
214 Real pC_ = betaC_ / (1.0 + betaC_);
219 loss_.push_back(std::pow(1.0 - pC_, alphaC_));
225 for (
unsigned long j = 0;
226 j <= std::min<unsigned long>(maxNu_ - 1,
n); ++j) {
227 iter = epsNuC_.find(j + 1);
228 if (iter != epsNuC_.end()) {
229 res += (*iter).second *
loss_[
n - j] * alphaC_;
231 res += (*iter).second / ((
Real)(j + 1)) *
235 loss_.push_back(res * pC_ / (pdSum_ * ((
Real)(
n + 1))));
std::vector< Real > loss_
unsigned long upperIndex_
const std::vector< Real > exposure_
std::vector< Real > sectorEl_
CreditRiskPlus(std::vector< Real > exposure, std::vector< Real > defaultProbability, std::vector< Size > sector, std::vector< Real > relativeDefaultVariance, Matrix correlation, Real unit)
const Matrix correlation_
std::vector< Real > sectorExposure_
const std::vector< Real > relativeDefaultVariance_
Real lossQuantile(Real p)
const std::vector< Real > pd_
const std::vector< Size > sector_
std::vector< Real > marginalLoss_
std::vector< Real > sectorUl_
Matrix used in linear algebra.
Extended CreditRisk+ Model.
#define QL_REQUIRE(condition, message)
throw an error if the given pre-condition is not verified
std::size_t Size
size of a container
#define QL_DEPRECATED_DISABLE_WARNING
#define QL_DEPRECATED_ENABLE_WARNING