Skip to content

Commit 10d4b16

Browse files
committed
Merge branch 'feature/QPR-13646' into 'master'
Resolve QPR-13646 incorporate yassir's feedback Closes QPR-13646 See merge request qs/oreplus!3067
2 parents 4352ccf + 3c5d082 commit 10d4b16

7 files changed

Lines changed: 1652 additions & 1603 deletions

File tree

Examples/CurveBuilding/ExpectedOutput/fixedfloatccs/todaysmarketcalibration_cashflows.csv

Lines changed: 1562 additions & 1548 deletions
Large diffs are not rendered by default.

OREAnalytics/orea/app/marketcalibrationreport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ void MarketCalibrationReportBase::addInflationCurve(const QuantLib::Date& refdat
396396
if (info == nullptr)
397397
return;
398398

399-
const string inflationStr = "inflationCuve";
399+
const string inflationStr = "inflationCurve";
400400

401401
// check if we have already processed this curve
402402
if (checkCalibrations(label, inflationStr, id)) {

OREData/ored/marketdata/inflationcurve.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,10 +315,10 @@ InflationCurve::CurveBuildResults
315315
results.rateHelperTypes.push_back("ZeroCouponInflation");
316316
results.cashflowGenerators.push_back(
317317
std::function<std::vector<TradeCashflowReportData>()>([instrument, index, asof, nominalTs]() {
318-
return getCashflowReportData({instrument->swap()->leg(0), instrument->swap()->leg(1)},
319-
{false, true}, {1.0, 1.0}, index->currency().code(),
320-
{index->currency().code(), index->currency().code()}, asof,
321-
{*nominalTs, *nominalTs}, {1.0, 1.0}, {}, {});
318+
return getCashflowReportData(
319+
{instrument->swap()->leg(0), instrument->swap()->leg(1)}, {false, true}, {1.0, 1.0},
320+
index->currency().code(), {index->currency().code(), index->currency().code()}, asof,
321+
{*nominalTs, *nominalTs}, {1.0, 1.0}, {}, {}, {"Interest", ""}, {1.0E6, 1.0E6});
322322
}));
323323
}
324324
}
@@ -422,9 +422,9 @@ InflationCurve::CurveBuildResults
422422
results.cashflowGenerators.push_back(
423423
std::function<std::vector<TradeCashflowReportData>()>([instrument, index, asof, nominalTs]() {
424424
return getCashflowReportData({instrument->swap()->leg(0), instrument->swap()->leg(1)},
425-
{false, true}, {1.0, 1.0}, index->currency().code(),
425+
{false, true}, {1.0E6, 1.0E6}, index->currency().code(),
426426
{index->currency().code(), index->currency().code()}, asof,
427-
{*nominalTs, *nominalTs}, {1.0, 1.0}, {}, {});
427+
{*nominalTs, *nominalTs}, {1.0E6, 1.0E6}, {}, {});
428428
}));
429429
}
430430
}

OREData/ored/marketdata/yieldcurve.cpp

Lines changed: 64 additions & 39 deletions
Large diffs are not rendered by default.

OREData/ored/portfolio/cashflowutils.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ TradeCashflowReportData getCashflowReportData(
176176
const std::string ccy, const Date asof, const ext::shared_ptr<YieldTermStructure>& discountCurveCcy,
177177
const double fxCcyBase,
178178
const std::function<ext::shared_ptr<SwaptionVolatilityStructure>(const std::string& qualifier)>& swaptionVol,
179-
const std::function<ext::shared_ptr<OptionletVolatilityStructure>(const std::string& qualifier)>& capFloorVol) {
179+
const std::function<ext::shared_ptr<OptionletVolatilityStructure>(const std::string& qualifier)>& capFloorVol,
180+
const std::string& overwriteFlowType, const Real overwriteNotional) {
180181

181182
QL_REQUIRE(ptrFlow, "getCashflowReportData: prtFlow is null.");
182183
QL_REQUIRE(discountCurveCcy || ptrFlow->hasOccurred(asof), "getCashflowReportData: discountCurveCcy is null.");
@@ -305,6 +306,7 @@ TradeCashflowReportData getCashflowReportData(
305306
fixingDate = ptrIndCf->fixingDate();
306307
fixingValue = ptrIndCf->indexFixing();
307308
flowType = "Index";
309+
// notional = ptrIndCf->notional(); // TODO we should enable this
308310
} else if (ptrCommIndCf) {
309311
fixingDate = ptrCommIndCf->lastPricingDate();
310312
fixingValue = ptrCommIndCf->fixing();
@@ -341,7 +343,7 @@ TradeCashflowReportData getCashflowReportData(
341343
if (amount != Null<Real>())
342344
effectiveAmount = amount * multiplier;
343345

344-
discountFactor = ptrFlow->hasOccurred(asof) ? 0.0 : discountCurveCcy->discount(payDate);
346+
discountFactor = payDate < asof ? 0.0 : discountCurveCcy->discount(payDate);
345347
if (effectiveAmount != Null<Real>())
346348
presentValue = discountFactor * effectiveAmount;
347349
try {
@@ -443,8 +445,10 @@ TradeCashflowReportData getCashflowReportData(
443445

444446
TradeCashflowReportData result;
445447

448+
Real effNotional = overwriteNotional != Null<Real>() ? overwriteNotional : notional;
449+
446450
result.payDate = payDate;
447-
result.flowType = flowType;
451+
result.flowType = overwriteFlowType.empty() ? flowType : overwriteFlowType;
448452
result.amount = effectiveAmount;
449453
result.currency = ccy;
450454
result.coupon = coupon;
@@ -454,7 +458,7 @@ TradeCashflowReportData getCashflowReportData(
454458
result.accruedAmount = accruedAmount * (accruedAmount == Null<Real>() ? 1.0 : multiplier);
455459
result.fixingDate = fixingDate;
456460
result.fixingValue = fixingValue;
457-
result.notional = notional * (notional == Null<Real>() ? 1.0 : multiplier);
461+
result.notional = effNotional * (effNotional == Null<Real>() ? 1.0 : multiplier);
458462
result.discountFactor = discountFactor;
459463
result.presentValue = presentValue;
460464
result.fxRateLocalBase = fxCcyBase;
@@ -478,12 +482,16 @@ std::vector<TradeCashflowReportData> getCashflowReportData(
478482
const std::function<QuantLib::ext::shared_ptr<QuantLib::SwaptionVolatilityStructure>(const std::string& qualifier)>&
479483
swaptionVol,
480484
const std::function<
481-
QuantLib::ext::shared_ptr<QuantLib::OptionletVolatilityStructure>(const std::string& qualifier)>& optionletVol) {
485+
QuantLib::ext::shared_ptr<QuantLib::OptionletVolatilityStructure>(const std::string& qualifier)>& optionletVol,
486+
const std::vector<std::string>& overwriteFlowType, const std::vector<Real>& overwriteNotional) {
482487
std::vector<TradeCashflowReportData> result;
483488
for (Size i = 0; i < legs.size(); ++i) {
489+
std::string owFlowType = overwriteFlowType.size() > i ? overwriteFlowType[i] : std::string();
490+
Real owNotional = overwriteNotional.size() > i ? overwriteNotional[i] : Null<Real>();
484491
for (Size j = 0; j < legs[i].size(); ++j) {
485492
result.push_back(getCashflowReportData(legs[i][j], payer[i], multiplier[i], baseCcy, ccys[i], asof,
486-
discountCurvesCcy[i], fxCcyBase[i], swaptionVol, optionletVol));
493+
discountCurvesCcy[i], fxCcyBase[i], swaptionVol, optionletVol,
494+
owFlowType, owNotional));
487495
result.back().cashflowNo = j + 1;
488496
result.back().legNo = i;
489497
}

OREData/ored/portfolio/cashflowutils.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ TradeCashflowReportData getCashflowReportData(
7777
const std::function<QuantLib::ext::shared_ptr<QuantLib::SwaptionVolatilityStructure>(const std::string& qualifier)>&
7878
swaptionVol,
7979
const std::function<
80-
QuantLib::ext::shared_ptr<QuantLib::OptionletVolatilityStructure>(const std::string& qualifier)>& optionletVol);
80+
QuantLib::ext::shared_ptr<QuantLib::OptionletVolatilityStructure>(const std::string& qualifier)>& optionletVol,
81+
const std::string& overwriteFlowType = std::string(), const Real overwriteNotional = Null<Real>());
8182

8283
// Populate TradeCashflowReportData based on Leg(s). Note: cashfowNo and legNo will _not_ be populated.
8384
std::vector<TradeCashflowReportData> getCashflowReportData(
@@ -88,7 +89,8 @@ std::vector<TradeCashflowReportData> getCashflowReportData(
8889
const std::function<QuantLib::ext::shared_ptr<QuantLib::SwaptionVolatilityStructure>(const std::string& qualifier)>&
8990
swaptionVol,
9091
const std::function<
91-
QuantLib::ext::shared_ptr<QuantLib::OptionletVolatilityStructure>(const std::string& qualifier)>& optionletVol);
92+
QuantLib::ext::shared_ptr<QuantLib::OptionletVolatilityStructure>(const std::string& qualifier)>& optionletVol,
93+
const std::vector<std::string>& overwriteFlowType = {}, const std::vector<Real>& overwriteNotional = {});
9294

9395
// Populate vector<TradeCashflowReportData> based on additional results map
9496
void populateReportDataFromAdditionalResults(

QuantLib

0 commit comments

Comments
 (0)