Skip to content

Commit 5e281c5

Browse files
damienbarkerjenkins
authored andcommitted
QPR-12474 -- TRS maturity should not rely on underlying, but rather on the TRS legs
1 parent 4043e21 commit 5e281c5

7 files changed

Lines changed: 18 additions & 33 deletions

File tree

OREData/ored/portfolio/cbo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ void CBOTrsUnderlyingBuilder::build(
254254
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
255255
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
256256
std::string& assetCurrency, std::string& creditRiskCurrency,
257-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
257+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
258258
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
259259
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
260260
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&

OREData/ored/portfolio/cbo.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ struct CBOTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
123123
QuantLib::ext::shared_ptr<QuantLib::Index>& underlyingIndex, Real& underlyingMultiplier,
124124
std::map<std::string, double>& indexQuantities, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
125125
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
126-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
126+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
127127
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
128128
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
129129
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&

OREData/ored/portfolio/convertiblebond.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ void ConvertibleBondTrsUnderlyingBuilder::build(
605605
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
606606
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
607607
std::string& assetCurrency, std::string& creditRiskCurrency,
608-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
608+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
609609
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
610610
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
611611
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -641,8 +641,6 @@ void ConvertibleBondTrsUnderlyingBuilder::build(
641641
SimmCreditQualifierMapping(t->data().bondData().securityId(), t->data().bondData().creditGroup());
642642
creditQualifierMapping[t->bondData().creditCurveId()] =
643643
SimmCreditQualifierMapping(t->data().bondData().securityId(), t->data().bondData().creditGroup());
644-
// FIXME shouldn't we leave that empty and let TRS determine the maturity date based on valuation / funding dates?
645-
maturity = qlBond->maturityDate();
646644
}
647645

648646
void ConvertibleBondTrsUnderlyingBuilder::updateUnderlying(const QuantLib::ext::shared_ptr<ReferenceDataManager>& refData,

OREData/ored/portfolio/convertiblebond.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct ConvertibleBondTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
6464
QuantLib::ext::shared_ptr<QuantLib::Index>& underlyingIndex, Real& underlyingMultiplier,
6565
std::map<std::string, double>& indexQuantities, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
6666
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
67-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
67+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
6868
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
6969
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
7070
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&

OREData/ored/portfolio/trs.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,6 @@ void TRS::build(const QuantLib::ext::shared_ptr<EngineFactory>& engineFactory) {
429429
DLOG("build underlying index for underlying #" << (i + 1));
430430

431431
std::string localCreditRiskCurrency;
432-
Date localMaturity;
433432
std::map<std::string, double> localIndexNamesAndQuantities;
434433
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>> localFxIndices = initialFxIndices;
435434
Real dummyInitialPrice = 1.0; // initial price is only updated if we have one underlying
@@ -440,7 +439,7 @@ void TRS::build(const QuantLib::ext::shared_ptr<EngineFactory>& engineFactory) {
440439
builder->build(id(), underlying_[i], valuationDates, paymentDates, fundingCurrency, engineFactory,
441440
underlyingIndex[i], underlyingMultiplier[i], localIndexNamesAndQuantities, localFxIndices,
442441
underlying_.size() == 1 ? initialPrice : dummyInitialPrice, assetCurrency[i],
443-
localCreditRiskCurrency, creditQualifierMapping_, localMaturity,
442+
localCreditRiskCurrency, creditQualifierMapping_,
444443
std::bind(&TRS::getFxIndex, this, std::placeholders::_1, std::placeholders::_2,
445444
std::placeholders::_3, std::placeholders::_4, std::placeholders::_5,
446445
std::ref(missingFxIndexPairs)),
@@ -459,10 +458,6 @@ void TRS::build(const QuantLib::ext::shared_ptr<EngineFactory>& engineFactory) {
459458
.log();
460459
}
461460

462-
// update global maturity date
463-
464-
maturity_ = std::max(maturity_, localMaturity);
465-
466461
// get fx indices for conversion of asset to funding ccy
467462

468463
DLOG("underlying #" << (i + 1) << " has asset ccy " << assetCurrency[i] << ", funding ccy is "

OREData/ored/portfolio/trsunderlyingbuilder.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void BondTrsUnderlyingBuilder::build(
8282
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
8383
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
8484
std::string& assetCurrency, std::string& creditRiskCurrency,
85-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
85+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
8686
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
8787
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
8888
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -120,8 +120,6 @@ void BondTrsUnderlyingBuilder::build(
120120
SimmCreditQualifierMapping(t->bondData().securityId(), t->bondData().creditGroup());
121121
creditQualifierMapping[t->bondData().creditCurveId()] =
122122
SimmCreditQualifierMapping(t->bondData().securityId(), t->bondData().creditGroup());
123-
// FIXME shouldn't we leave that empty and let TRS determine the maturity date based on valuation / funding dates?
124-
maturity = qlBond->maturityDate();
125123
}
126124

127125
void ForwardBondTrsUnderlyingBuilder::build(
@@ -131,7 +129,7 @@ void ForwardBondTrsUnderlyingBuilder::build(
131129
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
132130
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
133131
std::string& assetCurrency, std::string& creditRiskCurrency,
134-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
132+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
135133
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
136134
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
137135
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -181,7 +179,7 @@ void AssetPositionTrsUnderlyingBuilder<T>::build(
181179
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
182180
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
183181
std::string& assetCurrency, std::string& creditRiskCurrency,
184-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
182+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
185183
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
186184
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
187185
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -267,7 +265,7 @@ void EquityOptionPositionTrsUnderlyingBuilder::build(
267265
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
268266
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
269267
std::string& assetCurrency, std::string& creditRiskCurrency,
270-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
268+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
271269
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
272270
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
273271
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -325,7 +323,7 @@ void BondPositionTrsUnderlyingBuilder::build(
325323
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
326324
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
327325
std::string& assetCurrency, std::string& creditRiskCurrency,
328-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
326+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
329327
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
330328
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
331329
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -388,9 +386,6 @@ void BondPositionTrsUnderlyingBuilder::build(
388386

389387
if (hasCreditRisk)
390388
creditRiskCurrency = assetCurrency;
391-
// FIXME same question as for single bond underlying: shouldn't we leave that empty and let TRS determine the
392-
// maturity date based on valuation / funding dates?
393-
maturity = t->maturity();
394389
}
395390

396391
void DerivativeTrsUnderlyingBuilder::build(
@@ -400,7 +395,7 @@ void DerivativeTrsUnderlyingBuilder::build(
400395
Real& underlyingMultiplier, std::map<std::string, double>& indexQuantities,
401396
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices, Real& initialPrice,
402397
std::string& assetCurrency, std::string& creditRiskCurrency,
403-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
398+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
404399
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
405400
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
406401
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -412,9 +407,6 @@ void DerivativeTrsUnderlyingBuilder::build(
412407
underlyingIndex = QuantLib::ext::make_shared<QuantExt::GenericIndex>(indexName);
413408
indexQuantities[indexName] = 1.0;
414409
underlyingMultiplier = 1.0;
415-
// FIXME same question as for single bond underlying: shouldn't we leave that empty and let TRS determine the
416-
// maturity date based on valuation / funding dates?
417-
maturity = underlying->maturity();
418410

419411
auto fxIndex = getFxIndex(engineFactory->market(), engineFactory->configuration(MarketContext::pricing),
420412
assetCurrency, fundingCurrency, fxIndices);

OREData/ored/portfolio/trsunderlyingbuilder.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ struct TrsUnderlyingBuilder {
3737
QuantLib::ext::shared_ptr<QuantLib::Index>& underlyingIndex, Real& underlyingMultiplier,
3838
std::map<std::string, double>& indexQuantities, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
3939
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
40-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
40+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
4141
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
4242
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
4343
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -71,7 +71,7 @@ struct BondTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
7171
std::map<std::string, double>& indexQuantities,
7272
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
7373
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
74-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
74+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
7575
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
7676
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
7777
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>&
@@ -88,7 +88,7 @@ struct ForwardBondTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
8888
std::map<std::string, double>& indexQuantities,
8989
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
9090
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
91-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
91+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
9292
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
9393
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
9494
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>& getFxIndex,
@@ -105,7 +105,7 @@ struct AssetPositionTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
105105
std::map<std::string, double>& indexQuantities,
106106
std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
107107
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
108-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
108+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
109109
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
110110
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
111111
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>& getFxIndex,
@@ -129,7 +129,7 @@ struct EquityOptionPositionTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
129129
QuantLib::ext::shared_ptr<QuantLib::Index>& underlyingIndex, Real& underlyingMultiplier,
130130
std::map<std::string, double>& indexQuantities, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
131131
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
132-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
132+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
133133
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
134134
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
135135
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>& getFxIndex,
@@ -145,7 +145,7 @@ struct BondPositionTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
145145
QuantLib::ext::shared_ptr<QuantLib::Index>& underlyingIndex, Real& underlyingMultiplier,
146146
std::map<std::string, double>& indexQuantities, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
147147
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
148-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
148+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
149149
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
150150
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
151151
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>& getFxIndex,
@@ -160,7 +160,7 @@ struct DerivativeTrsUnderlyingBuilder : public TrsUnderlyingBuilder {
160160
QuantLib::ext::shared_ptr<QuantLib::Index>& underlyingIndex, Real& underlyingMultiplier,
161161
std::map<std::string, double>& indexQuantities, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices,
162162
Real& initialPrice, std::string& assetCurrency, std::string& creditRiskCurrency,
163-
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping, Date& maturity,
163+
std::map<std::string, SimmCreditQualifierMapping>& creditQualifierMapping,
164164
const std::function<QuantLib::ext::shared_ptr<QuantExt::FxIndex>(
165165
const QuantLib::ext::shared_ptr<Market> market, const std::string& configuration, const std::string& domestic,
166166
const std::string& foreign, std::map<std::string, QuantLib::ext::shared_ptr<QuantExt::FxIndex>>& fxIndices)>& getFxIndex,

0 commit comments

Comments
 (0)