Logo
Fully annotated reference manual - version 1.8.12
Loading...
Searching...
No Matches
simmconfigurationisdav2_5a.cpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2023 Quaternion Risk Management Ltd.
3 All rights reserved.
4
5 This file is part of ORE, a free-software/open-source library
6 for transparent pricing and risk analysis - http://opensourcerisk.org
7
8 ORE is free software: you can redistribute it and/or modify it
9 under the terms of the Modified BSD License. You should have received a
10 copy of the license along with this program.
11 The license is also available online at <http://opensourcerisk.org>
12
13 This program is distributed on the basis that it will form a useful
14 contribution to risk analytics and model standardisation, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the license for more details.
17*/
18
21#include <ql/math/matrix.hpp>
22
23#include <boost/algorithm/string/predicate.hpp>
24#include <boost/make_shared.hpp>
25
26using QuantLib::InterestRateIndex;
27using QuantLib::Matrix;
28using QuantLib::Real;
29using std::string;
30using std::vector;
31
32namespace ore {
33namespace analytics {
35QuantLib::Size SimmConfiguration_ISDA_V2_5A::group(const string& qualifier, const std::map<QuantLib::Size,
36 std::set<string>>& categories) const {
37 QuantLib::Size result = 0;
38 for (const auto& kv : categories) {
39 if (kv.second.empty()) {
40 result = kv.first;
41 } else {
42 if (kv.second.count(qualifier) > 0) {
43 // Found qualifier in category so return it
44 return kv.first;
45 }
46 }
47 }
48
49 // If we get here, result should hold category with empty set
50 return result;
51}
52
53QuantLib::Real SimmConfiguration_ISDA_V2_5A::weight(const RiskType& rt, boost::optional<string> qualifier,
54 boost::optional<std::string> label_1,
55 const std::string& calculationCurrency) const {
56
57 if (rt == RiskType::FX) {
58 QL_REQUIRE(calculationCurrency != "", "no calculation currency provided weight");
59 QL_REQUIRE(qualifier, "need a qualifier to return a risk weight for the risk type FX");
60
61 QuantLib::Size g1 = group(calculationCurrency, ccyGroups_);
62 QuantLib::Size g2 = group(*qualifier, ccyGroups_);
63 return rwFX_[g1][g2];
64 }
65
66 return SimmConfigurationBase::weight(rt, qualifier, label_1);
67}
68
69QuantLib::Real SimmConfiguration_ISDA_V2_5A::correlation(const RiskType& firstRt, const string& firstQualifier,
70 const string& firstLabel_1, const string& firstLabel_2,
71 const RiskType& secondRt, const string& secondQualifier,
72 const string& secondLabel_1, const string& secondLabel_2,
73 const std::string& calculationCurrency) const {
74
75 if (firstRt == RiskType::FX && secondRt == RiskType::FX) {
76 QL_REQUIRE(calculationCurrency != "", "no calculation currency provided corr");
77 QuantLib::Size g = group(calculationCurrency, ccyGroups_);
78 QuantLib::Size g1 = group(firstQualifier, ccyGroups_);
79 QuantLib::Size g2 = group(secondQualifier, ccyGroups_);
80 if (g == 0) {
81 return fxRegVolCorrelation_[g1][g2];
82 } else if (g == 1) {
83 return fxHighVolCorrelation_[g1][g2];
84 } else {
85 QL_FAIL("FX Volatility group " << g << " not recognized");
86 }
87 }
88
89 return SimmConfigurationBase::correlation(firstRt, firstQualifier, firstLabel_1, firstLabel_2, secondRt,
90 secondQualifier, secondLabel_1, secondLabel_2);
91}
92
93SimmConfiguration_ISDA_V2_5A::SimmConfiguration_ISDA_V2_5A(const QuantLib::ext::shared_ptr<SimmBucketMapper>& simmBucketMapper,
94 const QuantLib::Size& mporDays, const std::string& name,
95 const std::string version)
96 : SimmConfigurationBase(simmBucketMapper, name, version, mporDays) {
97
98 // The differences in methodology for 1 Day horizon is described in
99 // Standard Initial Margin Model: Technical Paper, ISDA SIMM Governance Forum, Version 10:
100 // Section I - Calibration with one-day horizon
101 QL_REQUIRE(mporDays_ == 10 || mporDays_ == 1, "SIMM only supports MPOR 10-day or 1-day");
102
103 // Set up the correct concentration threshold getter
104 if (mporDays == 10) {
105 simmConcentration_ = QuantLib::ext::make_shared<SimmConcentration_ISDA_V2_5A>(simmBucketMapper_);
106 } else {
107 // SIMM:Technical Paper, Section I.4: "The Concentration Risk feature is disabled"
108 simmConcentration_ = QuantLib::ext::make_shared<SimmConcentrationBase>();
109 }
110
111 // clang-format off
112
113 // Set up the members for this configuration
114 // Explanations of all these members are given in the hpp file
115
116 mapBuckets_ = {
117 { RiskType::IRCurve, { "1", "2", "3" } },
118 { RiskType::CreditQ, { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "Residual" } },
119 { RiskType::CreditVol, { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "Residual" } },
120 { RiskType::CreditNonQ, { "1", "2", "Residual" } },
121 { RiskType::CreditVolNonQ, { "1", "2", "Residual" } },
122 { RiskType::Equity, { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "Residual" } },
123 { RiskType::EquityVol, { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "Residual" } },
124 { RiskType::Commodity, { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17" } },
125 { RiskType::CommodityVol, { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17" } }
126 };
127
128 mapLabels_1_ = {
129 { RiskType::IRCurve, { "2w", "1m", "3m", "6m", "1y", "2y", "3y", "5y", "10y", "15y", "20y", "30y" } },
130 { RiskType::CreditQ, { "1y", "2y", "3y", "5y", "10y" } },
131 { RiskType::CreditNonQ, { "1y", "2y", "3y", "5y", "10y" } },
132 { RiskType::IRVol, { "2w", "1m", "3m", "6m", "1y", "2y", "3y", "5y", "10y", "15y", "20y", "30y" } },
133 { RiskType::InflationVol, { "2w", "1m", "3m", "6m", "1y", "2y", "3y", "5y", "10y", "15y", "20y", "30y" } },
134 { RiskType::CreditVol, { "1y", "2y", "3y", "5y", "10y" } },
135 { RiskType::CreditVolNonQ, { "1y", "2y", "3y", "5y", "10y" } },
136 { RiskType::EquityVol, { "2w", "1m", "3m", "6m", "1y", "2y", "3y", "5y", "10y", "15y", "20y", "30y" } },
137 { RiskType::CommodityVol, { "2w", "1m", "3m", "6m", "1y", "2y", "3y", "5y", "10y", "15y", "20y", "30y" } },
138 { RiskType::FXVol, { "2w", "1m", "3m", "6m", "1y", "2y", "3y", "5y", "10y", "15y", "20y", "30y" } }
139 };
140
141 mapLabels_2_ = {
142 { RiskType::IRCurve, { "OIS", "Libor1m", "Libor3m", "Libor6m", "Libor12m", "Prime", "Municipal" } },
143 { RiskType::CreditQ, { "", "Sec" } }
144 };
145
146 // Populate CCY groups that are used for FX correlations and risk weights
147 // The groups consists of High Vol Currencies & regular vol currencies
148 ccyGroups_ = {
149 { 1, { "BRL", "RUB", "TRY", "ZAR" } },
150 { 0, { } }
151 };
152
153 vector<Real> temp;
154
155 if (mporDays_ == 10) {
156 // Risk weights
157 temp = {
158 7.4, 13.6,
159 13.6, 14.6
160 };
161 rwFX_ = Matrix(2, 2, temp.begin(), temp.end());
162
163 rwRiskType_ = {
164 { RiskType::Inflation, 63 },
165 { RiskType::XCcyBasis, 21 },
166 { RiskType::IRVol, 0.18 },
167 { RiskType::InflationVol, 0.18 },
168 { RiskType::CreditVol, 0.74 },
169 { RiskType::CreditVolNonQ, 0.74 },
170 { RiskType::CommodityVol, 0.6 },
171 { RiskType::FXVol, 0.47 },
172 { RiskType::BaseCorr, 10 }
173 };
174
175 rwBucket_ = {
176 {RiskType::CreditQ,
177 {{{"1", "", ""}, 75},
178 {{"2", "", ""}, 91},
179 {{"3", "", ""}, 78},
180 {{"4", "", ""}, 55},
181 {{"5", "", ""}, 67},
182 {{"6", "", ""}, 47},
183 {{"7", "", ""}, 187},
184 {{"8", "", ""}, 665},
185 {{"9", "", ""}, 262},
186 {{"10", "", ""}, 251},
187 {{"11", "", ""}, 172},
188 {{"12", "", ""}, 247},
189 {{"Residual", "", ""}, 665}}},
190 {RiskType::CreditNonQ, {{{"1", "", ""}, 280}, {{"2", "", ""}, 1300}, {{"Residual", "", ""}, 1300}}},
191 {RiskType::Equity,
192 {{{"1", "", ""}, 26},
193 {{"2", "", ""}, 28},
194 {{"3", "", ""}, 34},
195 {{"4", "", ""}, 28},
196 {{"5", "", ""}, 23},
197 {{"6", "", ""}, 25},
198 {{"7", "", ""}, 29},
199 {{"8", "", ""}, 27},
200 {{"9", "", ""}, 32},
201 {{"10", "", ""}, 32},
202 {{"11", "", ""}, 18},
203 {{"12", "", ""}, 18},
204 {{"Residual", "", ""}, 34}}},
205 {RiskType::Commodity,
206 {{{"1", "", ""}, 27},
207 {{"2", "", ""}, 29},
208 {{"3", "", ""}, 33},
209 {{"4", "", ""}, 25},
210 {{"5", "", ""}, 35},
211 {{"6", "", ""}, 24},
212 {{"7", "", ""}, 40},
213 {{"8", "", ""}, 53},
214 {{"9", "", ""}, 44},
215 {{"10", "", ""}, 58},
216 {{"11", "", ""}, 20},
217 {{"12", "", ""}, 21},
218 {{"13", "", ""}, 13},
219 {{"14", "", ""}, 16},
220 {{"15", "", ""}, 13},
221 {{"16", "", ""}, 58},
222 {{"17", "", ""}, 17}}},
223 {RiskType::EquityVol,
224 {{{"1", "", ""}, 0.45},
225 {{"2", "", ""}, 0.45},
226 {{"3", "", ""}, 0.45},
227 {{"4", "", ""}, 0.45},
228 {{"5", "", ""}, 0.45},
229 {{"6", "", ""}, 0.45},
230 {{"7", "", ""}, 0.45},
231 {{"8", "", ""}, 0.45},
232 {{"9", "", ""}, 0.45},
233 {{"10", "", ""}, 0.45},
234 {{"11", "", ""}, 0.45},
235 {{"12", "", ""}, 0.96},
236 {{"Residual", "", ""}, 0.45}}},
237 };
238
239 rwLabel_1_ = {
240 {RiskType::IRCurve,
241 {{{"1", "2w", ""}, 109},
242 {{"1", "1m", ""}, 105},
243 {{"1", "3m", ""}, 90},
244 {{"1", "6m", ""}, 71},
245 {{"1", "1y", ""}, 66},
246 {{"1", "2y", ""}, 66},
247 {{"1", "3y", ""}, 64},
248 {{"1", "5y", ""}, 60},
249 {{"1", "10y", ""}, 60},
250 {{"1", "15y", ""}, 61},
251 {{"1", "20y", ""}, 61},
252 {{"1", "30y", ""}, 67},
253 {{"2", "2w", ""}, 15},
254 {{"2", "1m", ""}, 18},
255 {{"2", "3m", ""}, 9.0},
256 {{"2", "6m", ""}, 11},
257 {{"2", "1y", ""}, 13},
258 {{"2", "2y", ""}, 15},
259 {{"2", "3y", ""}, 19},
260 {{"2", "5y", ""}, 23},
261 {{"2", "10y", ""}, 23},
262 {{"2", "15y", ""}, 22},
263 {{"2", "20y", ""}, 22},
264 {{"2", "30y", ""}, 23},
265 {{"3", "2w", ""}, 163},
266 {{"3", "1m", ""}, 109},
267 {{"3", "3m", ""}, 87},
268 {{"3", "6m", ""}, 89},
269 {{"3", "1y", ""}, 102},
270 {{"3", "2y", ""}, 96},
271 {{"3", "3y", ""}, 101},
272 {{"3", "5y", ""}, 97},
273 {{"3", "10y", ""}, 97},
274 {{"3", "15y", ""}, 102},
275 {{"3", "20y", ""}, 106},
276 {{"3", "30y", ""}, 101}}
277 },
278 };
279
280 // Historical volatility ratios
281 historicalVolatilityRatios_[RiskType::EquityVol] = 0.58;
282 historicalVolatilityRatios_[RiskType::CommodityVol] = 0.69;
283 historicalVolatilityRatios_[RiskType::FXVol] = 0.52;
284 hvr_ir_ = 0.44;
285
286 // Curvature weights
288 { RiskType::IRVol, { 0.5,
289 0.5 * 14.0 / (365.0 / 12.0),
290 0.5 * 14.0 / (3.0 * 365.0 / 12.0),
291 0.5 * 14.0 / (6.0 * 365.0 / 12.0),
292 0.5 * 14.0 / 365.0,
293 0.5 * 14.0 / (2.0 * 365.0),
294 0.5 * 14.0 / (3.0 * 365.0),
295 0.5 * 14.0 / (5.0 * 365.0),
296 0.5 * 14.0 / (10.0 * 365.0),
297 0.5 * 14.0 / (15.0 * 365.0),
298 0.5 * 14.0 / (20.0 * 365.0),
299 0.5 * 14.0 / (30.0 * 365.0) }
300 },
301 { RiskType::CreditVol, { 0.5 * 14.0 / 365.0,
302 0.5 * 14.0 / (2.0 * 365.0),
303 0.5 * 14.0 / (3.0 * 365.0),
304 0.5 * 14.0 / (5.0 * 365.0),
305 0.5 * 14.0 / (10.0 * 365.0) }
306 }
307 };
308 curvatureWeights_[RiskType::InflationVol] = curvatureWeights_[RiskType::IRVol];
309 curvatureWeights_[RiskType::EquityVol] = curvatureWeights_[RiskType::IRVol];
310 curvatureWeights_[RiskType::CommodityVol] = curvatureWeights_[RiskType::IRVol];
311 curvatureWeights_[RiskType::FXVol] = curvatureWeights_[RiskType::IRVol];
312 curvatureWeights_[RiskType::CreditVolNonQ] = curvatureWeights_[RiskType::CreditVol];
313
314 } else {
315 // SIMM:Technical Paper, Section I.1: "All delta and vega risk weights should be replaced with the values for
316 // one-day calibration given in the Calibration Results document."
317
318 // Risk weights
319 temp = {
320 1.8, 3.2,
321 3.2, 3.4
322 };
323 rwFX_ = Matrix(2, 2, temp.begin(), temp.end());
324
325 rwRiskType_ = {
326 { RiskType::Inflation, 15 },
327 { RiskType::XCcyBasis, 5.9 },
328 { RiskType::IRVol, 0.047 },
329 { RiskType::InflationVol, 0.047 },
330 { RiskType::CreditVol, 0.085 },
331 { RiskType::CreditVolNonQ, 0.085 },
332 { RiskType::CommodityVol, 0.16 },
333 { RiskType::FXVol, 0.096 },
334 { RiskType::BaseCorr, 2.5 }
335 };
336
337 rwBucket_ = {
338 {RiskType::CreditQ,
339 {{{"1", "", ""}, 21},
340 {{"2", "", ""}, 27},
341 {{"3", "", ""}, 16},
342 {{"4", "", ""}, 12},
343 {{"5", "", ""}, 14},
344 {{"6", "", ""}, 12},
345 {{"7", "", ""}, 48},
346 {{"8", "", ""}, 144},
347 {{"9", "", ""}, 51},
348 {{"10", "", ""}, 53},
349 {{"11", "", ""}, 38},
350 {{"12", "", ""}, 57},
351 {{"Residual", "", ""}, 144}}},
352 {RiskType::CreditNonQ, {{{"1", "", ""}, 66}, {{"2", "", ""}, 250}, {{"Residual", "", ""}, 250}}},
353 {RiskType::Equity,
354 {{{"1", "", ""}, 9.3},
355 {{"2", "", ""}, 9.7},
356 {{"3", "", ""}, 10.0},
357 {{"4", "", ""}, 9.2},
358 {{"5", "", ""}, 7.7},
359 {{"6", "", ""}, 8.5},
360 {{"7", "", ""}, 9.5},
361 {{"8", "", ""}, 9.6},
362 {{"9", "", ""}, 10.0},
363 {{"10", "", ""}, 10},
364 {{"11", "", ""}, 5.9},
365 {{"12", "", ""}, 5.9},
366 {{"Residual", "", ""}, 10.0}}},
367 {RiskType::Commodity,
368 {{{"1", "", ""}, 9.0},
369 {{"2", "", ""}, 9.1},
370 {{"3", "", ""}, 8.1},
371 {{"4", "", ""}, 7.2},
372 {{"5", "", ""}, 10},
373 {{"6", "", ""}, 8.2},
374 {{"7", "", ""}, 9.7},
375 {{"8", "", ""}, 10},
376 {{"9", "", ""}, 10},
377 {{"10", "", ""}, 16},
378 {{"11", "", ""}, 6.2},
379 {{"12", "", ""}, 6.5},
380 {{"13", "", ""}, 4.6},
381 {{"14", "", ""}, 4.6},
382 {{"15", "", ""}, 4.0},
383 {{"16", "", ""}, 16},
384 {{"17", "", ""}, 5.1}}},
385 {RiskType::EquityVol,
386 {{{"1", "", ""}, 0.093},
387 {{"2", "", ""}, 0.093},
388 {{"3", "", ""}, 0.093},
389 {{"4", "", ""}, 0.093},
390 {{"5", "", ""}, 0.093},
391 {{"6", "", ""}, 0.093},
392 {{"7", "", ""}, 0.093},
393 {{"8", "", ""}, 0.093},
394 {{"9", "", ""}, 0.093},
395 {{"10", "", ""}, 0.093},
396 {{"11", "", ""}, 0.093},
397 {{"12", "", ""}, 0.25},
398 {{"Residual", "", ""}, 0.093}}},
399 };
400
401 rwLabel_1_ = {
402 {RiskType::IRCurve,
403 {{{"1", "2w", ""}, 19},
404 {{"1", "1m", ""}, 15},
405 {{"1", "3m", ""}, 12},
406 {{"1", "6m", ""}, 13},
407 {{"1", "1y", ""}, 15},
408 {{"1", "2y", ""}, 18},
409 {{"1", "3y", ""}, 18},
410 {{"1", "5y", ""}, 18},
411 {{"1", "10y", ""}, 18},
412 {{"1", "15y", ""}, 18},
413 {{"1", "20y", ""}, 17},
414 {{"1", "30y", ""}, 18},
415 {{"2", "2w", ""}, 1.7},
416 {{"2", "1m", ""}, 2.9},
417 {{"2", "3m", ""}, 1.7},
418 {{"2", "6m", ""}, 2.0},
419 {{"2", "1y", ""}, 3.4},
420 {{"2", "2y", ""}, 4.8},
421 {{"2", "3y", ""}, 5.8},
422 {{"2", "5y", ""}, 7.3},
423 {{"2", "10y", ""}, 7.8},
424 {{"2", "15y", ""}, 7.5},
425 {{"2", "20y", ""}, 8.0},
426 {{"2", "30y", ""}, 9.0},
427 {{"3", "2w", ""}, 55},
428 {{"3", "1m", ""}, 29},
429 {{"3", "3m", ""}, 18},
430 {{"3", "6m", ""}, 21},
431 {{"3", "1y", ""}, 26},
432 {{"3", "2y", ""}, 25},
433 {{"3", "3y", ""}, 34},
434 {{"3", "5y", ""}, 33},
435 {{"3", "10y", ""}, 34},
436 {{"3", "15y", ""}, 31},
437 {{"3", "20y", ""}, 34},
438 {{"3", "30y", ""}, 28}}},
439 };
440
441 // Historical volatility ratios
442 historicalVolatilityRatios_[RiskType::EquityVol] = 0.54;
443 historicalVolatilityRatios_[RiskType::CommodityVol] = 0.69;
444 historicalVolatilityRatios_[RiskType::FXVol] = 0.7;
445 hvr_ir_ = 0.51;
446
447 // Curvature weights
448 //SIMM:Technical Paper, Section I.3, this 10-day formula for curvature weights is modified
450 { RiskType::IRVol, { 0.5 / 10.0,
451 0.5 * 1.40 / (365.0 / 12.0),
452 0.5 * 1.40 / (3.0 * 365.0 / 12.0),
453 0.5 * 1.40 / (6.0 * 365.0 / 12.0),
454 0.5 * 1.40 / 365.0,
455 0.5 * 1.40 / (2.0 * 365.0),
456 0.5 * 1.40 / (3.0 * 365.0),
457 0.5 * 1.40 / (5.0 * 365.0),
458 0.5 * 1.40 / (10.0 * 365.0),
459 0.5 * 1.40 / (15.0 * 365.0),
460 0.5 * 1.40 / (20.0 * 365.0),
461 0.5 * 1.40 / (30.0 * 365.0) }
462 },
463 { RiskType::CreditVol, { 0.5 * 1.40 / 365.0,
464 0.5 * 1.40 / (2.0 * 365.0),
465 0.5 * 1.40 / (3.0 * 365.0),
466 0.5 * 1.40 / (5.0 * 365.0),
467 0.5 * 1.40 / (10.0 * 365.0) }
468 }
469 };
470 curvatureWeights_[RiskType::InflationVol] = curvatureWeights_[RiskType::IRVol];
471 curvatureWeights_[RiskType::EquityVol] = curvatureWeights_[RiskType::IRVol];
472 curvatureWeights_[RiskType::CommodityVol] = curvatureWeights_[RiskType::IRVol];
473 curvatureWeights_[RiskType::FXVol] = curvatureWeights_[RiskType::IRVol];
474 curvatureWeights_[RiskType::CreditVolNonQ] = curvatureWeights_[RiskType::CreditVol];
475 }
476
477
478 // Valid risk types
480 RiskType::Commodity,
481 RiskType::CommodityVol,
482 RiskType::CreditNonQ,
483 RiskType::CreditQ,
484 RiskType::CreditVol,
485 RiskType::CreditVolNonQ,
486 RiskType::Equity,
487 RiskType::EquityVol,
488 RiskType::FX,
489 RiskType::FXVol,
490 RiskType::Inflation,
491 RiskType::IRCurve,
492 RiskType::IRVol,
493 RiskType::InflationVol,
494 RiskType::BaseCorr,
495 RiskType::XCcyBasis,
496 RiskType::ProductClassMultiplier,
497 RiskType::AddOnNotionalFactor,
498 RiskType::PV,
499 RiskType::Notional,
500 RiskType::AddOnFixedAmount
501 };
502
503 // Risk class correlation matrix
505 {{"", "InterestRate", "CreditQualifying"}, 0.29},
506 {{"", "InterestRate", "CreditNonQualifying"}, 0.13},
507 {{"", "InterestRate", "Equity"}, 0.28},
508 {{"", "InterestRate", "Commodity"}, 0.46},
509 {{"", "InterestRate", "FX"}, 0.32},
510 {{"", "CreditQualifying", "InterestRate"}, 0.29},
511 {{"", "CreditQualifying", "CreditNonQualifying"}, 0.54},
512 {{"", "CreditQualifying", "Equity"}, 0.71},
513 {{"", "CreditQualifying", "Commodity"}, 0.52},
514 {{"", "CreditQualifying", "FX"}, 0.38},
515 {{"", "CreditNonQualifying", "InterestRate"}, 0.13},
516 {{"", "CreditNonQualifying", "CreditQualifying"}, 0.54},
517 {{"", "CreditNonQualifying", "Equity"}, 0.46},
518 {{"", "CreditNonQualifying", "Commodity"}, 0.41},
519 {{"", "CreditNonQualifying", "FX"}, 0.12},
520 {{"", "Equity", "InterestRate"}, 0.28},
521 {{"", "Equity", "CreditQualifying"}, 0.71},
522 {{"", "Equity", "CreditNonQualifying"}, 0.46},
523 {{"", "Equity", "Commodity"}, 0.49},
524 {{"", "Equity", "FX"}, 0.35},
525 {{"", "Commodity", "InterestRate"}, 0.46},
526 {{"", "Commodity", "CreditQualifying"}, 0.52},
527 {{"", "Commodity", "CreditNonQualifying"}, 0.41},
528 {{"", "Commodity", "Equity"}, 0.49},
529 {{"", "Commodity", "FX"}, 0.41},
530 {{"", "FX", "InterestRate"}, 0.32},
531 {{"", "FX", "CreditQualifying"}, 0.38},
532 {{"", "FX", "CreditNonQualifying"}, 0.12},
533 {{"", "FX", "Equity"}, 0.35},
534 {{"", "FX", "Commodity"}, 0.41}
535 };
536
537 // FX correlations
538 temp = {
539 0.5, 0.27,
540 0.27, 0.42
541 };
542 fxRegVolCorrelation_ = Matrix(2, 2, temp.begin(), temp.end());
543
544 temp = {
545 0.85, 0.54,
546 0.54, 0.5
547 };
548 fxHighVolCorrelation_ = Matrix(2, 2, temp.begin(), temp.end());
549
550 // Interest rate tenor correlations (i.e. Label1 level correlations)
551 intraBucketCorrelation_[RiskType::IRCurve] = {
552 {{"", "2w", "1m"}, 0.74},
553 {{"", "2w", "3m"}, 0.63},
554 {{"", "2w", "6m"}, 0.55},
555 {{"", "2w", "1y"}, 0.45},
556 {{"", "2w", "2y"}, 0.36},
557 {{"", "2w", "3y"}, 0.32},
558 {{"", "2w", "5y"}, 0.28},
559 {{"", "2w", "10y"}, 0.23},
560 {{"", "2w", "15y"}, 0.2},
561 {{"", "2w", "20y"}, 0.18},
562 {{"", "2w", "30y"}, 0.16},
563 {{"", "1m", "2w"}, 0.74},
564 {{"", "1m", "3m"}, 0.8},
565 {{"", "1m", "6m"}, 0.69},
566 {{"", "1m", "1y"}, 0.52},
567 {{"", "1m", "2y"}, 0.41},
568 {{"", "1m", "3y"}, 0.35},
569 {{"", "1m", "5y"}, 0.29},
570 {{"", "1m", "10y"}, 0.24},
571 {{"", "1m", "15y"}, 0.18},
572 {{"", "1m", "20y"}, 0.17},
573 {{"", "1m", "30y"}, 0.16},
574 {{"", "3m", "2w"}, 0.63},
575 {{"", "3m", "1m"}, 0.8},
576 {{"", "3m", "6m"}, 0.85},
577 {{"", "3m", "1y"}, 0.67},
578 {{"", "3m", "2y"}, 0.53},
579 {{"", "3m", "3y"}, 0.45},
580 {{"", "3m", "5y"}, 0.39},
581 {{"", "3m", "10y"}, 0.32},
582 {{"", "3m", "15y"}, 0.24},
583 {{"", "3m", "20y"}, 0.22},
584 {{"", "3m", "30y"}, 0.22},
585 {{"", "6m", "2w"}, 0.55},
586 {{"", "6m", "1m"}, 0.69},
587 {{"", "6m", "3m"}, 0.85},
588 {{"", "6m", "1y"}, 0.83},
589 {{"", "6m", "2y"}, 0.71},
590 {{"", "6m", "3y"}, 0.62},
591 {{"", "6m", "5y"}, 0.54},
592 {{"", "6m", "10y"}, 0.45},
593 {{"", "6m", "15y"}, 0.36},
594 {{"", "6m", "20y"}, 0.35},
595 {{"", "6m", "30y"}, 0.33},
596 {{"", "1y", "2w"}, 0.45},
597 {{"", "1y", "1m"}, 0.52},
598 {{"", "1y", "3m"}, 0.67},
599 {{"", "1y", "6m"}, 0.83},
600 {{"", "1y", "2y"}, 0.94},
601 {{"", "1y", "3y"}, 0.86},
602 {{"", "1y", "5y"}, 0.78},
603 {{"", "1y", "10y"}, 0.65},
604 {{"", "1y", "15y"}, 0.58},
605 {{"", "1y", "20y"}, 0.55},
606 {{"", "1y", "30y"}, 0.53},
607 {{"", "2y", "2w"}, 0.36},
608 {{"", "2y", "1m"}, 0.41},
609 {{"", "2y", "3m"}, 0.53},
610 {{"", "2y", "6m"}, 0.71},
611 {{"", "2y", "1y"}, 0.94},
612 {{"", "2y", "3y"}, 0.95},
613 {{"", "2y", "5y"}, 0.89},
614 {{"", "2y", "10y"}, 0.78},
615 {{"", "2y", "15y"}, 0.72},
616 {{"", "2y", "20y"}, 0.68},
617 {{"", "2y", "30y"}, 0.67},
618 {{"", "3y", "2w"}, 0.32},
619 {{"", "3y", "1m"}, 0.35},
620 {{"", "3y", "3m"}, 0.45},
621 {{"", "3y", "6m"}, 0.62},
622 {{"", "3y", "1y"}, 0.86},
623 {{"", "3y", "2y"}, 0.95},
624 {{"", "3y", "5y"}, 0.96},
625 {{"", "3y", "10y"}, 0.87},
626 {{"", "3y", "15y"}, 0.8},
627 {{"", "3y", "20y"}, 0.77},
628 {{"", "3y", "30y"}, 0.74},
629 {{"", "5y", "2w"}, 0.28},
630 {{"", "5y", "1m"}, 0.29},
631 {{"", "5y", "3m"}, 0.39},
632 {{"", "5y", "6m"}, 0.54},
633 {{"", "5y", "1y"}, 0.78},
634 {{"", "5y", "2y"}, 0.89},
635 {{"", "5y", "3y"}, 0.96},
636 {{"", "5y", "10y"}, 0.94},
637 {{"", "5y", "15y"}, 0.89},
638 {{"", "5y", "20y"}, 0.86},
639 {{"", "5y", "30y"}, 0.84},
640 {{"", "10y", "2w"}, 0.23},
641 {{"", "10y", "1m"}, 0.24},
642 {{"", "10y", "3m"}, 0.32},
643 {{"", "10y", "6m"}, 0.45},
644 {{"", "10y", "1y"}, 0.65},
645 {{"", "10y", "2y"}, 0.78},
646 {{"", "10y", "3y"}, 0.87},
647 {{"", "10y", "5y"}, 0.94},
648 {{"", "10y", "15y"}, 0.97},
649 {{"", "10y", "20y"}, 0.95},
650 {{"", "10y", "30y"}, 0.94},
651 {{"", "15y", "2w"}, 0.2},
652 {{"", "15y", "1m"}, 0.18},
653 {{"", "15y", "3m"}, 0.24},
654 {{"", "15y", "6m"}, 0.36},
655 {{"", "15y", "1y"}, 0.58},
656 {{"", "15y", "2y"}, 0.72},
657 {{"", "15y", "3y"}, 0.8},
658 {{"", "15y", "5y"}, 0.89},
659 {{"", "15y", "10y"}, 0.97},
660 {{"", "15y", "20y"}, 0.98},
661 {{"", "15y", "30y"}, 0.98},
662 {{"", "20y", "2w"}, 0.18},
663 {{"", "20y", "1m"}, 0.17},
664 {{"", "20y", "3m"}, 0.22},
665 {{"", "20y", "6m"}, 0.35},
666 {{"", "20y", "1y"}, 0.55},
667 {{"", "20y", "2y"}, 0.68},
668 {{"", "20y", "3y"}, 0.77},
669 {{"", "20y", "5y"}, 0.86},
670 {{"", "20y", "10y"}, 0.95},
671 {{"", "20y", "15y"}, 0.98},
672 {{"", "20y", "30y"}, 0.99},
673 {{"", "30y", "2w"}, 0.16},
674 {{"", "30y", "1m"}, 0.16},
675 {{"", "30y", "3m"}, 0.22},
676 {{"", "30y", "6m"}, 0.33},
677 {{"", "30y", "1y"}, 0.53},
678 {{"", "30y", "2y"}, 0.67},
679 {{"", "30y", "3y"}, 0.74},
680 {{"", "30y", "5y"}, 0.84},
681 {{"", "30y", "10y"}, 0.94},
682 {{"", "30y", "15y"}, 0.98},
683 {{"", "30y", "20y"}, 0.99}
684 };
685
686 // CreditQ inter-bucket correlations
687 interBucketCorrelation_[RiskType::CreditQ] = {
688 {{"", "1", "2"}, 0.36},
689 {{"", "1", "3"}, 0.38},
690 {{"", "1", "4"}, 0.35},
691 {{"", "1", "5"}, 0.37},
692 {{"", "1", "6"}, 0.33},
693 {{"", "1", "7"}, 0.36},
694 {{"", "1", "8"}, 0.31},
695 {{"", "1", "9"}, 0.32},
696 {{"", "1", "10"}, 0.33},
697 {{"", "1", "11"}, 0.32},
698 {{"", "1", "12"}, 0.3},
699 {{"", "2", "1"}, 0.36},
700 {{"", "2", "3"}, 0.46},
701 {{"", "2", "4"}, 0.44},
702 {{"", "2", "5"}, 0.45},
703 {{"", "2", "6"}, 0.43},
704 {{"", "2", "7"}, 0.33},
705 {{"", "2", "8"}, 0.36},
706 {{"", "2", "9"}, 0.38},
707 {{"", "2", "10"}, 0.39},
708 {{"", "2", "11"}, 0.4},
709 {{"", "2", "12"}, 0.36},
710 {{"", "3", "1"}, 0.38},
711 {{"", "3", "2"}, 0.46},
712 {{"", "3", "4"}, 0.49},
713 {{"", "3", "5"}, 0.49},
714 {{"", "3", "6"}, 0.47},
715 {{"", "3", "7"}, 0.34},
716 {{"", "3", "8"}, 0.36},
717 {{"", "3", "9"}, 0.41},
718 {{"", "3", "10"}, 0.42},
719 {{"", "3", "11"}, 0.43},
720 {{"", "3", "12"}, 0.39},
721 {{"", "4", "1"}, 0.35},
722 {{"", "4", "2"}, 0.44},
723 {{"", "4", "3"}, 0.49},
724 {{"", "4", "5"}, 0.48},
725 {{"", "4", "6"}, 0.48},
726 {{"", "4", "7"}, 0.31},
727 {{"", "4", "8"}, 0.34},
728 {{"", "4", "9"}, 0.38},
729 {{"", "4", "10"}, 0.42},
730 {{"", "4", "11"}, 0.41},
731 {{"", "4", "12"}, 0.37},
732 {{"", "5", "1"}, 0.37},
733 {{"", "5", "2"}, 0.45},
734 {{"", "5", "3"}, 0.49},
735 {{"", "5", "4"}, 0.48},
736 {{"", "5", "6"}, 0.48},
737 {{"", "5", "7"}, 0.33},
738 {{"", "5", "8"}, 0.35},
739 {{"", "5", "9"}, 0.39},
740 {{"", "5", "10"}, 0.42},
741 {{"", "5", "11"}, 0.43},
742 {{"", "5", "12"}, 0.38},
743 {{"", "6", "1"}, 0.33},
744 {{"", "6", "2"}, 0.43},
745 {{"", "6", "3"}, 0.47},
746 {{"", "6", "4"}, 0.48},
747 {{"", "6", "5"}, 0.48},
748 {{"", "6", "7"}, 0.29},
749 {{"", "6", "8"}, 0.32},
750 {{"", "6", "9"}, 0.36},
751 {{"", "6", "10"}, 0.39},
752 {{"", "6", "11"}, 0.4},
753 {{"", "6", "12"}, 0.35},
754 {{"", "7", "1"}, 0.36},
755 {{"", "7", "2"}, 0.33},
756 {{"", "7", "3"}, 0.34},
757 {{"", "7", "4"}, 0.31},
758 {{"", "7", "5"}, 0.33},
759 {{"", "7", "6"}, 0.29},
760 {{"", "7", "8"}, 0.28},
761 {{"", "7", "9"}, 0.32},
762 {{"", "7", "10"}, 0.31},
763 {{"", "7", "11"}, 0.3},
764 {{"", "7", "12"}, 0.28},
765 {{"", "8", "1"}, 0.31},
766 {{"", "8", "2"}, 0.36},
767 {{"", "8", "3"}, 0.36},
768 {{"", "8", "4"}, 0.34},
769 {{"", "8", "5"}, 0.35},
770 {{"", "8", "6"}, 0.32},
771 {{"", "8", "7"}, 0.28},
772 {{"", "8", "9"}, 0.33},
773 {{"", "8", "10"}, 0.34},
774 {{"", "8", "11"}, 0.33},
775 {{"", "8", "12"}, 0.3},
776 {{"", "9", "1"}, 0.32},
777 {{"", "9", "2"}, 0.38},
778 {{"", "9", "3"}, 0.41},
779 {{"", "9", "4"}, 0.38},
780 {{"", "9", "5"}, 0.39},
781 {{"", "9", "6"}, 0.36},
782 {{"", "9", "7"}, 0.32},
783 {{"", "9", "8"}, 0.33},
784 {{"", "9", "10"}, 0.38},
785 {{"", "9", "11"}, 0.36},
786 {{"", "9", "12"}, 0.34},
787 {{"", "10", "1"}, 0.33},
788 {{"", "10", "2"}, 0.39},
789 {{"", "10", "3"}, 0.42},
790 {{"", "10", "4"}, 0.42},
791 {{"", "10", "5"}, 0.42},
792 {{"", "10", "6"}, 0.39},
793 {{"", "10", "7"}, 0.31},
794 {{"", "10", "8"}, 0.34},
795 {{"", "10", "9"}, 0.38},
796 {{"", "10", "11"}, 0.38},
797 {{"", "10", "12"}, 0.36},
798 {{"", "11", "1"}, 0.32},
799 {{"", "11", "2"}, 0.4},
800 {{"", "11", "3"}, 0.43},
801 {{"", "11", "4"}, 0.41},
802 {{"", "11", "5"}, 0.43},
803 {{"", "11", "6"}, 0.4},
804 {{"", "11", "7"}, 0.3},
805 {{"", "11", "8"}, 0.33},
806 {{"", "11", "9"}, 0.36},
807 {{"", "11", "10"}, 0.38},
808 {{"", "11", "12"}, 0.35},
809 {{"", "12", "1"}, 0.3},
810 {{"", "12", "2"}, 0.36},
811 {{"", "12", "3"}, 0.39},
812 {{"", "12", "4"}, 0.37},
813 {{"", "12", "5"}, 0.38},
814 {{"", "12", "6"}, 0.35},
815 {{"", "12", "7"}, 0.28},
816 {{"", "12", "8"}, 0.3},
817 {{"", "12", "9"}, 0.34},
818 {{"", "12", "10"}, 0.36},
819 {{"", "12", "11"}, 0.35}
820 };
821
822 // Equity inter-bucket correlations
823 interBucketCorrelation_[RiskType::Equity] = {
824 {{"", "1", "2"}, 0.2},
825 {{"", "1", "3"}, 0.2},
826 {{"", "1", "4"}, 0.2},
827 {{"", "1", "5"}, 0.13},
828 {{"", "1", "6"}, 0.16},
829 {{"", "1", "7"}, 0.16},
830 {{"", "1", "8"}, 0.16},
831 {{"", "1", "9"}, 0.17},
832 {{"", "1", "10"}, 0.12},
833 {{"", "1", "11"}, 0.18},
834 {{"", "1", "12"}, 0.18},
835 {{"", "2", "1"}, 0.2},
836 {{"", "2", "3"}, 0.25},
837 {{"", "2", "4"}, 0.23},
838 {{"", "2", "5"}, 0.14},
839 {{"", "2", "6"}, 0.17},
840 {{"", "2", "7"}, 0.18},
841 {{"", "2", "8"}, 0.17},
842 {{"", "2", "9"}, 0.19},
843 {{"", "2", "10"}, 0.13},
844 {{"", "2", "11"}, 0.19},
845 {{"", "2", "12"}, 0.19},
846 {{"", "3", "1"}, 0.2},
847 {{"", "3", "2"}, 0.25},
848 {{"", "3", "4"}, 0.24},
849 {{"", "3", "5"}, 0.13},
850 {{"", "3", "6"}, 0.17},
851 {{"", "3", "7"}, 0.18},
852 {{"", "3", "8"}, 0.16},
853 {{"", "3", "9"}, 0.2},
854 {{"", "3", "10"}, 0.13},
855 {{"", "3", "11"}, 0.18},
856 {{"", "3", "12"}, 0.18},
857 {{"", "4", "1"}, 0.2},
858 {{"", "4", "2"}, 0.23},
859 {{"", "4", "3"}, 0.24},
860 {{"", "4", "5"}, 0.17},
861 {{"", "4", "6"}, 0.22},
862 {{"", "4", "7"}, 0.22},
863 {{"", "4", "8"}, 0.22},
864 {{"", "4", "9"}, 0.21},
865 {{"", "4", "10"}, 0.16},
866 {{"", "4", "11"}, 0.24},
867 {{"", "4", "12"}, 0.24},
868 {{"", "5", "1"}, 0.13},
869 {{"", "5", "2"}, 0.14},
870 {{"", "5", "3"}, 0.13},
871 {{"", "5", "4"}, 0.17},
872 {{"", "5", "6"}, 0.27},
873 {{"", "5", "7"}, 0.26},
874 {{"", "5", "8"}, 0.27},
875 {{"", "5", "9"}, 0.15},
876 {{"", "5", "10"}, 0.2},
877 {{"", "5", "11"}, 0.3},
878 {{"", "5", "12"}, 0.3},
879 {{"", "6", "1"}, 0.16},
880 {{"", "6", "2"}, 0.17},
881 {{"", "6", "3"}, 0.17},
882 {{"", "6", "4"}, 0.22},
883 {{"", "6", "5"}, 0.27},
884 {{"", "6", "7"}, 0.34},
885 {{"", "6", "8"}, 0.33},
886 {{"", "6", "9"}, 0.18},
887 {{"", "6", "10"}, 0.24},
888 {{"", "6", "11"}, 0.38},
889 {{"", "6", "12"}, 0.38},
890 {{"", "7", "1"}, 0.16},
891 {{"", "7", "2"}, 0.18},
892 {{"", "7", "3"}, 0.18},
893 {{"", "7", "4"}, 0.22},
894 {{"", "7", "5"}, 0.26},
895 {{"", "7", "6"}, 0.34},
896 {{"", "7", "8"}, 0.32},
897 {{"", "7", "9"}, 0.18},
898 {{"", "7", "10"}, 0.24},
899 {{"", "7", "11"}, 0.37},
900 {{"", "7", "12"}, 0.37},
901 {{"", "8", "1"}, 0.16},
902 {{"", "8", "2"}, 0.17},
903 {{"", "8", "3"}, 0.16},
904 {{"", "8", "4"}, 0.22},
905 {{"", "8", "5"}, 0.27},
906 {{"", "8", "6"}, 0.33},
907 {{"", "8", "7"}, 0.32},
908 {{"", "8", "9"}, 0.18},
909 {{"", "8", "10"}, 0.23},
910 {{"", "8", "11"}, 0.37},
911 {{"", "8", "12"}, 0.37},
912 {{"", "9", "1"}, 0.17},
913 {{"", "9", "2"}, 0.19},
914 {{"", "9", "3"}, 0.2},
915 {{"", "9", "4"}, 0.21},
916 {{"", "9", "5"}, 0.15},
917 {{"", "9", "6"}, 0.18},
918 {{"", "9", "7"}, 0.18},
919 {{"", "9", "8"}, 0.18},
920 {{"", "9", "10"}, 0.14},
921 {{"", "9", "11"}, 0.2},
922 {{"", "9", "12"}, 0.2},
923 {{"", "10", "1"}, 0.12},
924 {{"", "10", "2"}, 0.13},
925 {{"", "10", "3"}, 0.13},
926 {{"", "10", "4"}, 0.16},
927 {{"", "10", "5"}, 0.2},
928 {{"", "10", "6"}, 0.24},
929 {{"", "10", "7"}, 0.24},
930 {{"", "10", "8"}, 0.23},
931 {{"", "10", "9"}, 0.14},
932 {{"", "10", "11"}, 0.25},
933 {{"", "10", "12"}, 0.25},
934 {{"", "11", "1"}, 0.18},
935 {{"", "11", "2"}, 0.19},
936 {{"", "11", "3"}, 0.18},
937 {{"", "11", "4"}, 0.24},
938 {{"", "11", "5"}, 0.3},
939 {{"", "11", "6"}, 0.38},
940 {{"", "11", "7"}, 0.37},
941 {{"", "11", "8"}, 0.37},
942 {{"", "11", "9"}, 0.2},
943 {{"", "11", "10"}, 0.25},
944 {{"", "11", "12"}, 0.45},
945 {{"", "12", "1"}, 0.18},
946 {{"", "12", "2"}, 0.19},
947 {{"", "12", "3"}, 0.18},
948 {{"", "12", "4"}, 0.24},
949 {{"", "12", "5"}, 0.3},
950 {{"", "12", "6"}, 0.38},
951 {{"", "12", "7"}, 0.37},
952 {{"", "12", "8"}, 0.37},
953 {{"", "12", "9"}, 0.2},
954 {{"", "12", "10"}, 0.25},
955 {{"", "12", "11"}, 0.45}
956 };
957
958 // Commodity inter-bucket correlations
959 interBucketCorrelation_[RiskType::Commodity] = {
960 {{"", "1", "2"}, 0.33},
961 {{"", "1", "3"}, 0.21},
962 {{"", "1", "4"}, 0.27},
963 {{"", "1", "5"}, 0.29},
964 {{"", "1", "6"}, 0.21},
965 {{"", "1", "7"}, 0.48},
966 {{"", "1", "8"}, 0.16},
967 {{"", "1", "9"}, 0.41},
968 {{"", "1", "10"}, 0.23},
969 {{"", "1", "11"}, 0.18},
970 {{"", "1", "12"}, 0.02},
971 {{"", "1", "13"}, 0.21},
972 {{"", "1", "14"}, 0.19},
973 {{"", "1", "15"}, 0.15},
974 {{"", "1", "16"}, 0.0},
975 {{"", "1", "17"}, 0.24},
976 {{"", "2", "1"}, 0.33},
977 {{"", "2", "3"}, 0.94},
978 {{"", "2", "4"}, 0.94},
979 {{"", "2", "5"}, 0.89},
980 {{"", "2", "6"}, 0.21},
981 {{"", "2", "7"}, 0.19},
982 {{"", "2", "8"}, 0.13},
983 {{"", "2", "9"}, 0.21},
984 {{"", "2", "10"}, 0.21},
985 {{"", "2", "11"}, 0.41},
986 {{"", "2", "12"}, 0.27},
987 {{"", "2", "13"}, 0.31},
988 {{"", "2", "14"}, 0.29},
989 {{"", "2", "15"}, 0.21},
990 {{"", "2", "16"}, 0.0},
991 {{"", "2", "17"}, 0.6},
992 {{"", "3", "1"}, 0.21},
993 {{"", "3", "2"}, 0.94},
994 {{"", "3", "4"}, 0.91},
995 {{"", "3", "5"}, 0.85},
996 {{"", "3", "6"}, 0.12},
997 {{"", "3", "7"}, 0.2},
998 {{"", "3", "8"}, 0.09},
999 {{"", "3", "9"}, 0.19},
1000 {{"", "3", "10"}, 0.2},
1001 {{"", "3", "11"}, 0.36},
1002 {{"", "3", "12"}, 0.18},
1003 {{"", "3", "13"}, 0.22},
1004 {{"", "3", "14"}, 0.23},
1005 {{"", "3", "15"}, 0.23},
1006 {{"", "3", "16"}, 0.0},
1007 {{"", "3", "17"}, 0.54},
1008 {{"", "4", "1"}, 0.27},
1009 {{"", "4", "2"}, 0.94},
1010 {{"", "4", "3"}, 0.91},
1011 {{"", "4", "5"}, 0.84},
1012 {{"", "4", "6"}, 0.14},
1013 {{"", "4", "7"}, 0.24},
1014 {{"", "4", "8"}, 0.13},
1015 {{"", "4", "9"}, 0.21},
1016 {{"", "4", "10"}, 0.19},
1017 {{"", "4", "11"}, 0.39},
1018 {{"", "4", "12"}, 0.25},
1019 {{"", "4", "13"}, 0.23},
1020 {{"", "4", "14"}, 0.27},
1021 {{"", "4", "15"}, 0.18},
1022 {{"", "4", "16"}, 0.0},
1023 {{"", "4", "17"}, 0.59},
1024 {{"", "5", "1"}, 0.29},
1025 {{"", "5", "2"}, 0.89},
1026 {{"", "5", "3"}, 0.85},
1027 {{"", "5", "4"}, 0.84},
1028 {{"", "5", "6"}, 0.15},
1029 {{"", "5", "7"}, 0.17},
1030 {{"", "5", "8"}, 0.09},
1031 {{"", "5", "9"}, 0.16},
1032 {{"", "5", "10"}, 0.21},
1033 {{"", "5", "11"}, 0.38},
1034 {{"", "5", "12"}, 0.28},
1035 {{"", "5", "13"}, 0.28},
1036 {{"", "5", "14"}, 0.27},
1037 {{"", "5", "15"}, 0.18},
1038 {{"", "5", "16"}, 0.0},
1039 {{"", "5", "17"}, 0.55},
1040 {{"", "6", "1"}, 0.21},
1041 {{"", "6", "2"}, 0.21},
1042 {{"", "6", "3"}, 0.12},
1043 {{"", "6", "4"}, 0.14},
1044 {{"", "6", "5"}, 0.15},
1045 {{"", "6", "7"}, 0.33},
1046 {{"", "6", "8"}, 0.53},
1047 {{"", "6", "9"}, 0.26},
1048 {{"", "6", "10"}, 0.09},
1049 {{"", "6", "11"}, 0.21},
1050 {{"", "6", "12"}, 0.04},
1051 {{"", "6", "13"}, 0.11},
1052 {{"", "6", "14"}, 0.1},
1053 {{"", "6", "15"}, 0.09},
1054 {{"", "6", "16"}, 0.0},
1055 {{"", "6", "17"}, 0.24},
1056 {{"", "7", "1"}, 0.48},
1057 {{"", "7", "2"}, 0.19},
1058 {{"", "7", "3"}, 0.2},
1059 {{"", "7", "4"}, 0.24},
1060 {{"", "7", "5"}, 0.17},
1061 {{"", "7", "6"}, 0.33},
1062 {{"", "7", "8"}, 0.31},
1063 {{"", "7", "9"}, 0.72},
1064 {{"", "7", "10"}, 0.24},
1065 {{"", "7", "11"}, 0.14},
1066 {{"", "7", "12"}, -0.12},
1067 {{"", "7", "13"}, 0.19},
1068 {{"", "7", "14"}, 0.14},
1069 {{"", "7", "15"}, 0.08},
1070 {{"", "7", "16"}, 0.0},
1071 {{"", "7", "17"}, 0.24},
1072 {{"", "8", "1"}, 0.16},
1073 {{"", "8", "2"}, 0.13},
1074 {{"", "8", "3"}, 0.09},
1075 {{"", "8", "4"}, 0.13},
1076 {{"", "8", "5"}, 0.09},
1077 {{"", "8", "6"}, 0.53},
1078 {{"", "8", "7"}, 0.31},
1079 {{"", "8", "9"}, 0.24},
1080 {{"", "8", "10"}, 0.04},
1081 {{"", "8", "11"}, 0.13},
1082 {{"", "8", "12"}, -0.07},
1083 {{"", "8", "13"}, 0.04},
1084 {{"", "8", "14"}, 0.06},
1085 {{"", "8", "15"}, 0.01},
1086 {{"", "8", "16"}, 0.0},
1087 {{"", "8", "17"}, 0.16},
1088 {{"", "9", "1"}, 0.41},
1089 {{"", "9", "2"}, 0.21},
1090 {{"", "9", "3"}, 0.19},
1091 {{"", "9", "4"}, 0.21},
1092 {{"", "9", "5"}, 0.16},
1093 {{"", "9", "6"}, 0.26},
1094 {{"", "9", "7"}, 0.72},
1095 {{"", "9", "8"}, 0.24},
1096 {{"", "9", "10"}, 0.21},
1097 {{"", "9", "11"}, 0.18},
1098 {{"", "9", "12"}, -0.07},
1099 {{"", "9", "13"}, 0.12},
1100 {{"", "9", "14"}, 0.12},
1101 {{"", "9", "15"}, 0.1},
1102 {{"", "9", "16"}, 0.0},
1103 {{"", "9", "17"}, 0.21},
1104 {{"", "10", "1"}, 0.23},
1105 {{"", "10", "2"}, 0.21},
1106 {{"", "10", "3"}, 0.2},
1107 {{"", "10", "4"}, 0.19},
1108 {{"", "10", "5"}, 0.21},
1109 {{"", "10", "6"}, 0.09},
1110 {{"", "10", "7"}, 0.24},
1111 {{"", "10", "8"}, 0.04},
1112 {{"", "10", "9"}, 0.21},
1113 {{"", "10", "11"}, 0.14},
1114 {{"", "10", "12"}, 0.11},
1115 {{"", "10", "13"}, 0.11},
1116 {{"", "10", "14"}, 0.1},
1117 {{"", "10", "15"}, 0.07},
1118 {{"", "10", "16"}, 0.0},
1119 {{"", "10", "17"}, 0.14},
1120 {{"", "11", "1"}, 0.18},
1121 {{"", "11", "2"}, 0.41},
1122 {{"", "11", "3"}, 0.36},
1123 {{"", "11", "4"}, 0.39},
1124 {{"", "11", "5"}, 0.38},
1125 {{"", "11", "6"}, 0.21},
1126 {{"", "11", "7"}, 0.14},
1127 {{"", "11", "8"}, 0.13},
1128 {{"", "11", "9"}, 0.18},
1129 {{"", "11", "10"}, 0.14},
1130 {{"", "11", "12"}, 0.28},
1131 {{"", "11", "13"}, 0.3},
1132 {{"", "11", "14"}, 0.25},
1133 {{"", "11", "15"}, 0.18},
1134 {{"", "11", "16"}, 0.0},
1135 {{"", "11", "17"}, 0.38},
1136 {{"", "12", "1"}, 0.02},
1137 {{"", "12", "2"}, 0.27},
1138 {{"", "12", "3"}, 0.18},
1139 {{"", "12", "4"}, 0.25},
1140 {{"", "12", "5"}, 0.28},
1141 {{"", "12", "6"}, 0.04},
1142 {{"", "12", "7"}, -0.12},
1143 {{"", "12", "8"}, -0.07},
1144 {{"", "12", "9"}, -0.07},
1145 {{"", "12", "10"}, 0.11},
1146 {{"", "12", "11"}, 0.28},
1147 {{"", "12", "13"}, 0.18},
1148 {{"", "12", "14"}, 0.18},
1149 {{"", "12", "15"}, 0.08},
1150 {{"", "12", "16"}, 0.0},
1151 {{"", "12", "17"}, 0.21},
1152 {{"", "13", "1"}, 0.21},
1153 {{"", "13", "2"}, 0.31},
1154 {{"", "13", "3"}, 0.22},
1155 {{"", "13", "4"}, 0.23},
1156 {{"", "13", "5"}, 0.28},
1157 {{"", "13", "6"}, 0.11},
1158 {{"", "13", "7"}, 0.19},
1159 {{"", "13", "8"}, 0.04},
1160 {{"", "13", "9"}, 0.12},
1161 {{"", "13", "10"}, 0.11},
1162 {{"", "13", "11"}, 0.3},
1163 {{"", "13", "12"}, 0.18},
1164 {{"", "13", "14"}, 0.34},
1165 {{"", "13", "15"}, 0.16},
1166 {{"", "13", "16"}, 0.0},
1167 {{"", "13", "17"}, 0.34},
1168 {{"", "14", "1"}, 0.19},
1169 {{"", "14", "2"}, 0.29},
1170 {{"", "14", "3"}, 0.23},
1171 {{"", "14", "4"}, 0.27},
1172 {{"", "14", "5"}, 0.27},
1173 {{"", "14", "6"}, 0.1},
1174 {{"", "14", "7"}, 0.14},
1175 {{"", "14", "8"}, 0.06},
1176 {{"", "14", "9"}, 0.12},
1177 {{"", "14", "10"}, 0.1},
1178 {{"", "14", "11"}, 0.25},
1179 {{"", "14", "12"}, 0.18},
1180 {{"", "14", "13"}, 0.34},
1181 {{"", "14", "15"}, 0.13},
1182 {{"", "14", "16"}, 0.0},
1183 {{"", "14", "17"}, 0.26},
1184 {{"", "15", "1"}, 0.15},
1185 {{"", "15", "2"}, 0.21},
1186 {{"", "15", "3"}, 0.23},
1187 {{"", "15", "4"}, 0.18},
1188 {{"", "15", "5"}, 0.18},
1189 {{"", "15", "6"}, 0.09},
1190 {{"", "15", "7"}, 0.08},
1191 {{"", "15", "8"}, 0.01},
1192 {{"", "15", "9"}, 0.1},
1193 {{"", "15", "10"}, 0.07},
1194 {{"", "15", "11"}, 0.18},
1195 {{"", "15", "12"}, 0.08},
1196 {{"", "15", "13"}, 0.16},
1197 {{"", "15", "14"}, 0.13},
1198 {{"", "15", "16"}, 0.0},
1199 {{"", "15", "17"}, 0.21},
1200 {{"", "16", "1"}, 0.0},
1201 {{"", "16", "2"}, 0.0},
1202 {{"", "16", "3"}, 0.0},
1203 {{"", "16", "4"}, 0.0},
1204 {{"", "16", "5"}, 0.0},
1205 {{"", "16", "6"}, 0.0},
1206 {{"", "16", "7"}, 0.0},
1207 {{"", "16", "8"}, 0.0},
1208 {{"", "16", "9"}, 0.0},
1209 {{"", "16", "10"}, 0.0},
1210 {{"", "16", "11"}, 0.0},
1211 {{"", "16", "12"}, 0.0},
1212 {{"", "16", "13"}, 0.0},
1213 {{"", "16", "14"}, 0.0},
1214 {{"", "16", "15"}, 0.0},
1215 {{"", "16", "17"}, 0.0},
1216 {{"", "17", "1"}, 0.24},
1217 {{"", "17", "2"}, 0.6},
1218 {{"", "17", "3"}, 0.54},
1219 {{"", "17", "4"}, 0.59},
1220 {{"", "17", "5"}, 0.55},
1221 {{"", "17", "6"}, 0.24},
1222 {{"", "17", "7"}, 0.24},
1223 {{"", "17", "8"}, 0.16},
1224 {{"", "17", "9"}, 0.21},
1225 {{"", "17", "10"}, 0.14},
1226 {{"", "17", "11"}, 0.38},
1227 {{"", "17", "12"}, 0.21},
1228 {{"", "17", "13"}, 0.34},
1229 {{"", "17", "14"}, 0.26},
1230 {{"", "17", "15"}, 0.21},
1231 {{"", "17", "16"}, 0.0}
1232 };
1233
1234 // Equity intra-bucket correlations (exclude Residual and deal with it in the method - it is 0%) - changed
1235 intraBucketCorrelation_[RiskType::Equity] = {
1236 {{"1", "", ""}, 0.18},
1237 {{"2", "", ""}, 0.23},
1238 {{"3", "", ""}, 0.3},
1239 {{"4", "", ""}, 0.26},
1240 {{"5", "", ""}, 0.23},
1241 {{"6", "", ""}, 0.35},
1242 {{"7", "", ""}, 0.36},
1243 {{"8", "", ""}, 0.33},
1244 {{"9", "", ""}, 0.19},
1245 {{"10", "", ""}, 0.2},
1246 {{"11", "", ""}, 0.45},
1247 {{"12", "", ""}, 0.45}
1248 };
1249
1250 // Commodity intra-bucket correlations
1251 intraBucketCorrelation_[RiskType::Commodity] = {
1252 {{"1", "", ""}, 0.84},
1253 {{"2", "", ""}, 0.98},
1254 {{"3", "", ""}, 0.96},
1255 {{"4", "", ""}, 0.97},
1256 {{"5", "", ""}, 0.98},
1257 {{"6", "", ""}, 0.88},
1258 {{"7", "", ""}, 0.98},
1259 {{"8", "", ""}, 0.49},
1260 {{"9", "", ""}, 0.8},
1261 {{"10", "", ""}, 0.46},
1262 {{"11", "", ""}, 0.55},
1263 {{"12", "", ""}, 0.46},
1264 {{"13", "", ""}, 0.66},
1265 {{"14", "", ""}, 0.18},
1266 {{"15", "", ""}, 0.21},
1267 {{"16", "", ""}, 0},
1268 {{"17", "", ""}, 0.36}
1269 };
1270
1271 // Initialise the single, ad-hoc type, correlations
1272 xccyCorr_ = 0.01;
1273 infCorr_ = 0.37;
1274 infVolCorr_ = 0.37;
1275 irSubCurveCorr_ = 0.99;
1276 irInterCurrencyCorr_ = 0.24;
1278 crqSameIntraCorr_ = 0.93;
1279 crqDiffIntraCorr_ = 0.42;
1281 crnqSameIntraCorr_ = 0.82;
1282 crnqDiffIntraCorr_ = 0.27;
1283 crnqInterCorr_ = 0.4;
1284 fxCorr_ = 0.5;
1285 basecorrCorr_ = 0.24;
1286
1287 // clang-format on
1288}
1289
1290/* The CurvatureMargin must be multiplied by a scale factor of HVR(IR)^{-2}, where HVR(IR)
1291is the historical volatility ratio for the interest-rate risk class (see page 8 section 11(d)
1292of the ISDA-SIMM-v2.5A documentation).
1293*/
1295
1296void SimmConfiguration_ISDA_V2_5A::addLabels2(const RiskType& rt, const string& label_2) {
1297 // Call the shared implementation
1299}
1300
1301string SimmConfiguration_ISDA_V2_5A::label2(const QuantLib::ext::shared_ptr<InterestRateIndex>& irIndex) const {
1302 // Special for BMA
1303 if (boost::algorithm::starts_with(irIndex->name(), "BMA")) {
1304 return "Municipal";
1305 }
1306
1307 // Otherwise pass off to base class
1308 return SimmConfigurationBase::label2(irIndex);
1309}
1310
1311} // namespace analytics
1312} // namespace ore
virtual std::string label2(const QuantLib::ext::shared_ptr< QuantLib::InterestRateIndex > &irIndex) const
QuantLib::Real correlation(const CrifRecord::RiskType &firstRt, const std::string &firstQualifier, const std::string &firstLabel_1, const std::string &firstLabel_2, const CrifRecord::RiskType &secondRt, const std::string &secondQualifier, const std::string &secondLabel_1, const std::string &secondLabel_2, const std::string &calculationCurrency="") const override
QuantLib::Real weight(const CrifRecord::RiskType &rt, boost::optional< std::string > qualifier=boost::none, boost::optional< std::string > label_1=boost::none, const std::string &calculationCurrency="") const override
QuantLib::Matrix fxRegVolCorrelation_
FX Correlations when the calculation ccy is in the Regular Volatility group.
QuantLib::Matrix fxHighVolCorrelation_
FX Correlations when the calculation ccy is in the High Volatility group.
std::string label2(const QuantLib::ext::shared_ptr< QuantLib::InterestRateIndex > &irIndex) const override
Return the SIMM Label2 value for the given interest rate index.
SimmConfiguration_ISDA_V2_5A(const QuantLib::ext::shared_ptr< SimmBucketMapper > &simmBucketMapper, const QuantLib::Size &mporDays=10, const std::string &name="SIMM ISDA 2.5A (15 July 2023)", const std::string version="2.5A")
void addLabels2(const CrifRecord::RiskType &rt, const std::string &label_2) override
Add SIMM Label2 values under certain circumstances.
std::map< QuantLib::Size, std::set< std::string > > ccyGroups_
QuantLib::Matrix rwFX_
FX risk weight matrix.
QuantLib::Real hvr_ir_
IR Historical volatility ratio.
QuantLib::Size group(const std::string &qualifier, const std::map< QuantLib::Size, std::set< std::string > > &groups) const
Find the group of the qualifier.
QuantLib::Real correlation(const CrifRecord::RiskType &firstRt, const std::string &firstQualifier, const std::string &firstLabel_1, const std::string &firstLabel_2, const CrifRecord::RiskType &secondRt, const std::string &secondQualifier, const std::string &secondLabel_1, const std::string &secondLabel_2, const std::string &calculationCurrency="") const override
QuantLib::Real crqResidualIntraCorr_
Credit-Q residual intra correlation.
QuantLib::Real basecorrCorr_
Base correlation risk factor correlation.
std::map< CrifRecord::RiskType, QuantLib::Real > rwRiskType_
QuantLib::Real weight(const CrifRecord::RiskType &rt, boost::optional< std::string > qualifier=boost::none, boost::optional< std::string > label_1=boost::none, const std::string &calculationCurrency="") const override
QuantLib::Real crnqResidualIntraCorr_
Credit-NonQ residual intra correlation.
QuantLib::Size mporDays() const
MPOR in days.
std::map< CrifRecord::RiskType, std::vector< std::string > > mapLabels_2_
QuantLib::Real irInterCurrencyCorr_
IR correlation across currencies.
std::map< CrifRecord::RiskType, Amounts > rwLabel_1_
std::map< CrifRecord::RiskType, Amounts > intraBucketCorrelation_
std::map< CrifRecord::RiskType, std::vector< std::string > > mapBuckets_
QuantLib::Real crnqDiffIntraCorr_
Credit-NonQ non-residual intra correlation when different underlying names.
QuantLib::Real crqSameIntraCorr_
Credit-Q non-residual intra correlation when same qualifier but different vertex/source.
QuantLib::Real crnqSameIntraCorr_
Credit-NonQ non-residual intra correlation when same underlying names.
std::set< CrifRecord::RiskType > validRiskTypes_
Set of valid risk types for the current configuration.
QuantLib::ext::shared_ptr< SimmConcentration > simmConcentration_
Used to get the concentration thresholds for a given risk type and qualifier.
QuantLib::Real infCorr_
Correlation between any yield and inflation in same currency.
Amounts riskClassCorrelation_
Risk class correlation matrix.
QuantLib::Real crnqInterCorr_
Credit-NonQ non-residual inter bucket correlation.
std::map< CrifRecord::RiskType, QuantLib::Real > historicalVolatilityRatios_
Map from risk type to a historical volatility ratio.
std::map< CrifRecord::RiskType, Amounts > interBucketCorrelation_
std::map< CrifRecord::RiskType, std::vector< std::string > > mapLabels_1_
QuantLib::Real infVolCorr_
Correlation between any yield volatility and inflation volatility in same currency.
QuantLib::Real crqDiffIntraCorr_
Credit-Q non-residual intra correlation when different qualifier.
QuantLib::Real irSubCurveCorr_
IR Label2 level i.e. sub-curve correlation.
void addLabels2Impl(const CrifRecord::RiskType &rt, const std::string &label_2)
A base implementation of addLabels2 that can be shared by derived classes.
std::map< CrifRecord::RiskType, std::vector< QuantLib::Real > > curvatureWeights_
QuantLib::ext::shared_ptr< SimmBucketMapper > simmBucketMapper_
Used to map SIMM Qualifier names to SIMM bucket values.
std::map< CrifRecord::RiskType, Amounts > rwBucket_
RandomVariable pow(RandomVariable x, const RandomVariable &y)
CrifRecord::RiskType RiskType
Definition: crifloader.cpp:92
SIMM concentration thresholds for SIMM version 2.5A.
SIMM configuration for SIMM version 2.5A.
string name