@@ -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
0 commit comments