21#include <boost/accumulators/accumulators.hpp>
22#include <boost/accumulators/statistics/error_of_mean.hpp>
23#include <boost/accumulators/statistics/mean.hpp>
24#include <boost/accumulators/statistics/stats.hpp>
29using namespace boost::accumulators;
35 const QuantLib::ext::shared_ptr<Portfolio> portfolio,
const QuantLib::ext::shared_ptr<Market> market,
36 const string& configuration,
const string& baseCurrency,
const string& dvaName,
37 const string& fvaBorrowingCurve,
const string& fvaLendingCurve,
38 const bool applyDynamicInitialMargin,
39 const QuantLib::ext::shared_ptr<DynamicInitialMarginCalculator> dimCalculator,
40 const QuantLib::ext::shared_ptr<NPVCube> tradeExposureCube,
41 const QuantLib::ext::shared_ptr<NPVCube> nettingSetExposureCube,
42 const Size tradeEpeIndex,
const Size tradeEneIndex,
43 const Size nettingSetEpeIndex,
const Size nettingSetEneIndex,
44 const bool flipViewXVA,
const string& flipViewBorrowingCurvePostfix,
const string& flipViewLendingCurvePostfix)
46 fvaBorrowingCurve, fvaLendingCurve, applyDynamicInitialMargin,
47 dimCalculator, tradeExposureCube, nettingSetExposureCube, tradeEpeIndex, tradeEneIndex,
48 nettingSetEpeIndex, nettingSetEneIndex,
49 flipViewXVA, flipViewBorrowingCurvePostfix, flipViewLendingCurvePostfix) {
50 for (Size i = 0; i <
dates().size(); i++) {
57 const string& tid,
const string& cid,
const Date& d0,
const Date& d1,
const Real& rr) {
59 QL_REQUIRE(!dts.empty(),
"Default curve missing for counterparty " << cid);
61 Real s0 = dts->survivalProbability(d0);
62 Real s1 = dts->survivalProbability(d1);
64 increment = (1.0 - rr) * (s0 - s1) * epe;
69 const string& tid,
const Date& d0,
const Date& d1,
const Real& rr) {
71 QL_REQUIRE(!dts.empty(),
"Default curve missing for dvaName " <<
dvaName_);
73 Real s0 = dts->survivalProbability(d0);
74 Real s1 = dts->survivalProbability(d1);
76 increment = (1.0 - rr) * (s0 - s1) * ene;
81 const string& nid,
const string& cid,
const Date& d0,
const Date& d1,
const Real& rr) {
83 QL_REQUIRE(!dts.empty(),
"Default curve missing for counterparty " << cid);
85 Real s0 = dts->survivalProbability(d0);
86 Real s1 = dts->survivalProbability(d1);
88 increment = (1.0 - rr) * (s0 - s1) * epe;
93 const string& nid,
const Date& d0,
const Date& d1,
const Real& rr) {
95 QL_REQUIRE(!dts.empty(),
"Default curve missing for dvaName " <<
dvaName_);
97 Real s0 = dts->survivalProbability(d0);
98 Real s1 = dts->survivalProbability(d1);
100 increment = (1.0 - rr) * (s0 - s1) * ene;
105 const string& tid,
const string& cid,
const string& dvaName,
106 const Date& d0,
const Date& d1,
const Real& dcf) {
107 Handle<DefaultProbabilityTermStructure> dts_cid;
108 Handle<DefaultProbabilityTermStructure> dts_dvaName;
111 QL_REQUIRE(!dts_cid.empty(),
"Default curve missing for counterparty " << cid);
115 QL_REQUIRE(!dts_dvaName.empty(),
"Default curve missing for dvaName " << dvaName);
118 Real increment = 0.0;
119 Real s0 = cid ==
"" ? 1.0 : dts_cid->survivalProbability(d0);
120 Real s1 = dvaName ==
"" ? 1.0 : dts_dvaName->survivalProbability(d0);
122 increment = s0 * s1 * ene * dcf;
127 const string& tid,
const string& cid,
const string& dvaName,
128 const Date& d0,
const Date& d1,
const Real& dcf) {
129 Handle<DefaultProbabilityTermStructure> dts_cid;
130 Handle<DefaultProbabilityTermStructure> dts_dvaName;
133 QL_REQUIRE(!dts_cid.empty(),
"Default curve missing for counterparty " << cid);
137 QL_REQUIRE(!dts_dvaName.empty(),
"Default curve missing for dvaName " << dvaName);
140 Real increment = 0.0;
141 Real s0 = cid ==
"" ? 1.0 : dts_cid->survivalProbability(d0);
142 Real s1 = dvaName ==
"" ? 1.0 : dts_dvaName->survivalProbability(d0);
144 increment = s0 * s1 * epe * dcf;
149 const string& nid,
const string& cid,
const string& dvaName,
150 const Date& d0,
const Date& d1,
const Real& dcf) {
151 Handle<DefaultProbabilityTermStructure> dts_cid;
152 Handle<DefaultProbabilityTermStructure> dts_dvaName;
155 QL_REQUIRE(!dts_cid.empty(),
"Default curve missing for counterparty " << cid);
159 QL_REQUIRE(!dts_dvaName.empty(),
"Default curve missing for dvaName " << dvaName);
162 Real increment = 0.0;
163 Real s0 = cid ==
"" ? 1.0 : dts_cid->survivalProbability(d0);
164 Real s1 = dvaName ==
"" ? 1.0 : dts_dvaName->survivalProbability(d0);
166 increment = s0 * s1 * ene * dcf;
171 const string& nid,
const string& cid,
const string& dvaName,
172 const Date& d0,
const Date& d1,
const Real& dcf) {
173 Handle<DefaultProbabilityTermStructure> dts_cid;
174 Handle<DefaultProbabilityTermStructure> dts_dvaName;
177 QL_REQUIRE(!dts_cid.empty(),
"Default curve missing for counterparty " << cid);
181 QL_REQUIRE(!dts_dvaName.empty(),
"Default curve missing for dvaName " << dvaName);
184 Real increment = 0.0;
185 Real s0 = cid ==
"" ? 1.0 : dts_cid->survivalProbability(d0);
186 Real s1 = dvaName ==
"" ? 1.0 : dts_dvaName->survivalProbability(d0);
188 increment = s0 * s1 * epe * dcf;
193 const string& nid,
const string& cid,
const Date& d0,
const Date& d1,
const Real& dcf) {
194 Handle<DefaultProbabilityTermStructure> dts_cid =
market_->defaultCurve(cid,
configuration_)->curve();
195 QL_REQUIRE(cid ==
"" || !dts_cid.empty(),
"Default curve missing for counterparty " << cid);
197 QL_REQUIRE(
dvaName_ ==
"" || !dts_dvaName.empty(),
"Default curve missing for dvaName " <<
dvaName_);
199 Real increment = 0.0;
200 Real s0 = cid ==
"" ? 1.0 : dts_cid->survivalProbability(d0);
201 Real s1 =
dvaName_ ==
"" ? 1.0 : dts_dvaName->survivalProbability(d0);
virtual const Real calculateNettingSetDvaIncrement(const string &nid, const Date &d0, const Date &d1, const Real &rr) override
virtual const Real calculateNettingSetFcaIncrement(const string &nid, const string &cid, const string &dvaName, const Date &d0, const Date &d1, const Real &dcf) override
virtual const Real calculateFbaIncrement(const string &tid, const string &cid, const string &dvaName, const Date &d0, const Date &d1, const Real &dcf) override
virtual const Real calculateNettingSetMvaIncrement(const string &nid, const string &cid, const Date &d0, const Date &d1, const Real &dcf) override
virtual const Real calculateCvaIncrement(const string &tid, const string &cid, const Date &d0, const Date &d1, const Real &rr) override
virtual const Real calculateDvaIncrement(const string &tid, const Date &d0, const Date &d1, const Real &rr) override
virtual const Real calculateNettingSetCvaIncrement(const string &nid, const string &cid, const Date &d0, const Date &d1, const Real &rr) override
map< Date, Size > dateIndexMap_
virtual const Real calculateNettingSetFbaIncrement(const string &nid, const string &cid, const string &dvaName, const Date &d0, const Date &d1, const Real &dcf) override
StaticCreditXvaCalculator(const QuantLib::ext::shared_ptr< Portfolio > portfolio, const QuantLib::ext::shared_ptr< Market > market, const string &configuration, const string &baseCurrency, const string &dvaName, const string &fvaBorrowingCurve, const string &fvaLendingCurve, const bool applyDynamicInitialMargin, const QuantLib::ext::shared_ptr< DynamicInitialMarginCalculator > dimCalculator, const QuantLib::ext::shared_ptr< NPVCube > tradeExposureCube, const QuantLib::ext::shared_ptr< NPVCube > nettingSetExposureCube, const Size tradeEpeIndex=0, const Size tradeEneIndex=1, const Size nettingSetEpeIndex=1, const Size nettingSetEneIndex=2, const bool flipViewXVA=false, const string &flipViewBorrowingCurvePostfix="_BORROW", const string &flipViewLendingCurvePostfix="_LEND")
virtual const Real calculateFcaIncrement(const string &tid, const string &cid, const string &dvaName, const Date &d0, const Date &d1, const Real &dcf) override
XVA Calculator base class.
QuantLib::ext::shared_ptr< Market > market_
virtual const vector< Date > & dates()
QuantLib::ext::shared_ptr< DynamicInitialMarginCalculator > dimCalculator_
const QuantLib::ext::shared_ptr< NPVCube > nettingSetExposureCube_
const QuantLib::ext::shared_ptr< NPVCube > tradeExposureCube_
XVA calculator with static credit.