Skip to content

Commit 8f6227e

Browse files
pcaspersjenkins
authored andcommitted
QPR-12046 -- Add SIMM Exemption Overrides to netting XML for SA-CCR
1 parent 0c47b01 commit 8f6227e

3 files changed

Lines changed: 23 additions & 9 deletions

File tree

OREData/ored/portfolio/nettingsetdefinition.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,15 @@ NettingSetDefinition::NettingSetDefinition(const NettingSetDetails& nettingSetDe
124124
const string& marginPostFreq, const string& mpr, const Real& collatSpreadPay,
125125
const Real& collatSpreadRcv, const vector<string>& eligCollatCcys,
126126
bool applyInitialMargin, const string& initialMarginType,
127-
const bool calculateIMAmount, const bool calculateVMAmount)
127+
const bool calculateIMAmount, const bool calculateVMAmount,
128+
const string& nonExemptIMRegulations)
128129
: nettingSetDetails_(nettingSetDetails), activeCsaFlag_(true) {
129130

130131
csa_ = boost::make_shared<CSA>(
131132
parseCsaType(bilateral), csaCurrency, index, thresholdPay, thresholdRcv, mtaPay, mtaRcv, iaHeld, iaType,
132133
parsePeriod(marginCallFreq), parsePeriod(marginPostFreq), parsePeriod(mpr), collatSpreadPay, collatSpreadRcv,
133-
eligCollatCcys, applyInitialMargin, parseCsaType(initialMarginType), calculateIMAmount, calculateVMAmount);
134+
eligCollatCcys, applyInitialMargin, parseCsaType(initialMarginType), calculateIMAmount, calculateVMAmount,
135+
nonExemptIMRegulations);
134136

135137
validate();
136138
DLOG(nettingSetDetails_ << ": collateralised NettingSetDefinition built. ");
@@ -204,11 +206,14 @@ void NettingSetDefinition::fromXML(XMLNode* node) {
204206
bool calculateIMAmount = XMLUtils::getChildValueAsBool(csaChild, "CalculateIMAmount", false, false);
205207
bool calculateVMAmount = XMLUtils::getChildValueAsBool(csaChild, "CalculateVMAmount", false, false);
206208

209+
string nonExemptIMRegulations = XMLUtils::getChildValue(csaChild, "NonExemptIMRegulations", false);
210+
207211
csa_ = boost::make_shared<CSA>(parseCsaType(csaTypeStr), csaCurrency, index, thresholdPay, thresholdRcv, mtaPay,
208212
mtaRcv, iaHeld, iaType, parsePeriod(marginCallFreqStr),
209213
parsePeriod(marginPostFreqStr), parsePeriod(mprStr), collatSpreadPay,
210214
collatSpreadRcv, eligCollatCcys, applyInitialMargin,
211-
parseCsaType(initialMarginType), calculateIMAmount, calculateVMAmount);
215+
parseCsaType(initialMarginType), calculateIMAmount, calculateVMAmount,
216+
nonExemptIMRegulations);
212217
}
213218

214219
validate();
@@ -260,6 +265,7 @@ XMLNode* NettingSetDefinition::toXML(XMLDocument& doc) {
260265
XMLUtils::addChild(doc, csaSubNode, "InitialMarginType", to_string(csa_->initialMarginType()));
261266
XMLUtils::addChild(doc, csaSubNode, "CalculateIMAmount", csa_->calculateIMAmount());
262267
XMLUtils::addChild(doc, csaSubNode, "CalculateVMAmount", csa_->calculateVMAmount());
268+
XMLUtils::addChild(doc, csaSubNode, "NonExemptIMRegulations", csa_->nonExemptIMRegulations());
263269
}
264270

265271
return node;

OREData/ored/portfolio/nettingsetdefinition.hpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ class CSA {
5252
const Real& iaHeld, const string& iaType, const Period& marginCallFreq, const Period& marginPostFreq,
5353
const Period& mpr, const Real& collatSpreadPay, const Real& collatSpreadRcv,
5454
const vector<string>& eligCollatCcys, // vector of three letter ISO codes
55-
bool applyInitialMargin, Type initialMarginType, const bool calculateIMAmount, const bool calculateVMAmount)
55+
bool applyInitialMargin, Type initialMarginType, const bool calculateIMAmount, const bool calculateVMAmount,
56+
const string& nonExemptIMRegulations)
5657
: type_(type), csaCurrency_(csaCurrency), index_(index), thresholdPay_(thresholdPay),
5758
thresholdRcv_(thresholdRcv), mtaPay_(mtaPay), mtaRcv_(mtaRcv), iaHeld_(iaHeld), iaType_(iaType),
5859
marginCallFreq_(marginCallFreq), marginPostFreq_(marginPostFreq), mpr_(mpr),
5960
collatSpreadPay_(collatSpreadPay), collatSpreadRcv_(collatSpreadRcv), eligCollatCcys_(eligCollatCcys),
6061
applyInitialMargin_(applyInitialMargin), initialMarginType_(initialMarginType),
61-
calculateIMAmount_(calculateIMAmount), calculateVMAmount_(calculateVMAmount) {}
62+
calculateIMAmount_(calculateIMAmount), calculateVMAmount_(calculateVMAmount),
63+
nonExemptIMRegulations_(nonExemptIMRegulations) {}
6264

6365
//! Inspectors
6466
//@{
@@ -101,7 +103,9 @@ class CSA {
101103
bool calculateIMAmount() { return calculateIMAmount_; }
102104
/*! Calculate VM from NPV (currently used only for SA-CCR) */
103105
bool calculateVMAmount() { return calculateVMAmount_; }
104-
106+
/*! IM regulations (whose trade sensitivities are usually exempt from margin/sensi calc) that we wish to include
107+
(currently used only for SA-CCR) */
108+
const string& nonExemptIMRegulations() { return nonExemptIMRegulations_; }
105109
/*! invert all relevant aspects of the CSA */
106110
void invertCSA();
107111

@@ -126,6 +130,7 @@ class CSA {
126130
bool applyInitialMargin_;
127131
Type initialMarginType_;
128132
bool calculateIMAmount_, calculateVMAmount_;
133+
string nonExemptIMRegulations_;
129134
};
130135

131136
CSA::Type parseCsaType(const string& s);
@@ -165,7 +170,8 @@ class NettingSetDefinition : public XMLSerializable {
165170
const Real& collatSpreadPay, const Real& collatSpreadRcv,
166171
const vector<string>& eligCollatCcys, // vector of three letter ISO codes
167172
bool applyInitialMargin = false, const string& initialMarginType = "Bilateral",
168-
const bool calculateIMAmount = false, const bool calculateVMAmount = false);
173+
const bool calculateIMAmount = false, const bool calculateVMAmount = false,
174+
const string& nonExemptIMRegulations = "");
169175

170176
NettingSetDefinition(const string& nettingSetId, const string& bilateral,
171177
const string& csaCurrency, // three letter ISO code
@@ -177,11 +183,12 @@ class NettingSetDefinition : public XMLSerializable {
177183
const Real& collatSpreadPay, const Real& collatSpreadRcv,
178184
const vector<string>& eligCollatCcys, // vector of three letter ISO codes
179185
bool applyInitialMargin = false, const string& initialMarginType = "Bilateral",
180-
const bool calculateIMAmount = false, const bool calculateVMAmount = false)
186+
const bool calculateIMAmount = false, const bool calculateVMAmount = false,
187+
const string& nonExemptIMRegulations = "")
181188
: NettingSetDefinition(NettingSetDetails(nettingSetId), bilateral, csaCurrency, index, thresholdPay,
182189
thresholdRcv, mtaPay, mtaRcv, iaHeld, iaType, marginCallFreq, marginPostFreq, mpr,
183190
collatSpreadPay, collatSpreadRcv, eligCollatCcys, applyInitialMargin, initialMarginType,
184-
calculateIMAmount, calculateVMAmount) {}
191+
calculateIMAmount, calculateVMAmount, nonExemptIMRegulations) {}
185192

186193
/*!
187194
loads NettingSetDefinition object from XML

xsd/nettingsetdefinitions.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<xs:element type="csaType" name="InitialMarginType" minOccurs="0"/>
5656
<xs:element type="xs:boolean" name="CalculateIMAmount" minOccurs="0"/>
5757
<xs:element type="xs:boolean" name="CalculateVMAmount" minOccurs="0"/>
58+
<xs:element type="xs:string" name="NonExemptIMRegulations" minOccurs="0"/>
5859
</xs:all>
5960
</xs:complexType>
6061
</xs:element>

0 commit comments

Comments
 (0)