Skip to content

Commit 6f44d49

Browse files
pcaspersjenkins
authored andcommitted
QPR-12192 extend cf report writer, extend cf results struct
1 parent a991aab commit 6f44d49

2 files changed

Lines changed: 32 additions & 7 deletions

File tree

OREAnalytics/orea/app/reportwriter.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,9 @@ void ReportWriter::writeCashflow(ore::data::Report& report, const std::string& b
176176
.addColumn("FloorStrike", double(), 6)
177177
.addColumn("CapStrike", double(), 6)
178178
.addColumn("FloorVolatility", double(), 6)
179-
.addColumn("CapVolatility", double(), 6);
179+
.addColumn("CapVolatility", double(), 6)
180+
.addColumn("EffectiveFloorVolatility", double(), 6)
181+
.addColumn("EffectiveCapVolatility", double(), 6);
180182

181183
std::map<std::string, boost::shared_ptr<Trade>> trades = portfolio->trades();
182184

@@ -361,6 +363,8 @@ void ReportWriter::writeCashflow(ore::data::Report& report, const std::string& b
361363
Real capStrike = Null<Real>();
362364
Real floorVolatility = Null<Real>();
363365
Real capVolatility = Null<Real>();
366+
Real effectiveFloorVolatility = Null<Real>();
367+
Real effectiveCapVolatility = Null<Real>();
364368

365369
if (amount != Null<Real>())
366370
effectiveAmount = amount * multiplier;
@@ -407,22 +411,31 @@ void ReportWriter::writeCashflow(ore::data::Report& report, const std::string& b
407411
volFixingDate = tmp->underlying()->fixingDates().front();
408412
qlIndexName = tmp->index()->name();
409413
usesCapVol = true;
410-
// for now we output the stripped caplet vol, not the effective one
414+
if (floorStrike != Null<Real>())
415+
effectiveFloorVolatility = tmp->effectiveFloorletVolatility();
416+
if (capStrike != Null<Real>())
417+
effectiveCapVolatility = tmp->effectiveCapletVolatility();
411418
} else if (auto tmp =
412419
boost::dynamic_pointer_cast<CappedFlooredAverageONIndexedCoupon>(c)) {
413420
floorStrike = tmp->effectiveFloor();
414421
capStrike = tmp->effectiveCap();
415422
volFixingDate = tmp->underlying()->fixingDates().front();
416423
qlIndexName = tmp->index()->name();
417424
usesCapVol = true;
418-
// for now we output the stripped caplet vol, not the effective one
419-
} else if (auto tmp =
420-
boost::dynamic_pointer_cast<CappedFlooredAverageBMACoupon>(c)) {
425+
if (floorStrike != Null<Real>())
426+
effectiveFloorVolatility = tmp->effectiveFloorletVolatility();
427+
if (capStrike != Null<Real>())
428+
effectiveCapVolatility = tmp->effectiveCapletVolatility();
429+
} else if (auto tmp = boost::dynamic_pointer_cast<CappedFlooredAverageBMACoupon>(c)) {
421430
floorStrike = tmp->effectiveFloor();
422431
capStrike = tmp->effectiveCap();
423432
volFixingDate = tmp->underlying()->fixingDates().front();
424433
qlIndexName = tmp->index()->name();
425434
usesCapVol = true;
435+
if (floorStrike != Null<Real>())
436+
effectiveFloorVolatility = tmp->effectiveFloorletVolatility();
437+
if (capStrike != Null<Real>())
438+
effectiveCapVolatility = tmp->effectiveCapletVolatility();
426439
}
427440

428441
// get market volaility for cap / floor
@@ -487,7 +500,9 @@ void ReportWriter::writeCashflow(ore::data::Report& report, const std::string& b
487500
.add(floorStrike)
488501
.add(capStrike)
489502
.add(floorVolatility)
490-
.add(capVolatility);
503+
.add(capVolatility)
504+
.add(effectiveFloorVolatility)
505+
.add(effectiveCapVolatility);
491506
}
492507
}
493508
}
@@ -521,6 +536,8 @@ void ReportWriter::writeCashflow(ore::data::Report& report, const std::string& b
521536
Real capStrike = Null<Real>();
522537
Real floorVolatility = Null<Real>();
523538
Real capVolatility = Null<Real>();
539+
Real effectiveFloorVolatility = Null<Real>();
540+
Real effectiveCapVolatility = Null<Real>();
524541

525542
if (cf.amount != Null<Real>())
526543
effectiveAmount = cf.amount * multiplier;
@@ -557,6 +574,10 @@ void ReportWriter::writeCashflow(ore::data::Report& report, const std::string& b
557574
floorVolatility = cf.floorVolatility;
558575
if (cf.capVolatility != Null<Real>())
559576
capVolatility = cf.capVolatility;
577+
if (cf.effectiveFloorVolatility != Null<Real>())
578+
floorVolatility = cf.effectiveFloorVolatility;
579+
if (cf.effectiveCapVolatility != Null<Real>())
580+
capVolatility = cf.effectiveCapVolatility;
560581

561582
report.next()
562583
.add(trade->id())
@@ -583,7 +604,9 @@ void ReportWriter::writeCashflow(ore::data::Report& report, const std::string& b
583604
.add(floorStrike)
584605
.add(capStrike)
585606
.add(floorVolatility)
586-
.add(capVolatility);
607+
.add(capVolatility)
608+
.add(effectiveFloorVolatility)
609+
.add(effectiveCapVolatility);
587610
}
588611
}
589612

QuantExt/qle/instruments/cashflowresults.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ struct CashFlowResults {
5555
QuantLib::Real capStrike = QuantLib::Null<QuantLib::Real>();
5656
QuantLib::Real floorVolatility = QuantLib::Null<QuantLib::Real>();
5757
QuantLib::Real capVolatility = QuantLib::Null<QuantLib::Real>();
58+
QuantLib::Real effectiveFloorVolatility = QuantLib::Null<QuantLib::Real>();
59+
QuantLib::Real effectiveCapVolatility = QuantLib::Null<QuantLib::Real>();
5860
};
5961

6062
std::ostream& operator<<(std::ostream& out, const CashFlowResults& t);

0 commit comments

Comments
 (0)