UpperTriangleVanillaSwaptionQuotes::UpperTriangleVanillaSwaptionQuotes( LMMTenorStructure_PTR lmmTenorStructure, int lastYear, const Tenor& fixedTenor, const Tenor& floatingTenor, const UpperTriangularDoubleMatrix& strikes, // 1st row and column not used like g! const UpperTriangularDoubleMatrix& quotes) // 1st row and column not used like g! : lmmTenorStructure_(lmmTenorStructure) , lastYear_(lastYear) , fixedTenor_(fixedTenor) , floatingTenor_(floatingTenor) , indexRatio_(fixedTenor.NbOfMonth()/floatingTenor.NbOfMonth()) , upperTriangleVanillaSwaptionQuotes_(lastYear+1, lastYear+1) , indexMapping_gDelegate_gTransformed_(lastYear+1, lastYear+1) { assert(lmmTenorStructure_->get_horizon() == lastYear*indexRatio_); assert(lastYear>1); assert(strikes.size1() == strikes.size2() && strikes.size1() == lastYear_+1); assert(quotes.size1() == quotes.size2() && quotes.size1() == lastYear_+1); assert(fixedTenor.NbOfMonth() == 12 && fixedTenor.NbOfMonth()%floatingTenor.NbOfMonth() ==0); assert(lmmTenorStructure->get_tenorType() == floatingTenor); //! upperTriangle: for(size_t iExpirity = 1; iExpirity<quotes.size1(); ++iExpirity) // row { for(size_t jTenor = 1; jTenor<quotes.size2()-iExpirity; ++jTenor) // col { double strike = strikes(iExpirity,jTenor); //size_t indexStart = computeStartIndex(iExpirity); //size_t indexEnd = computeIndexEnd(iExpirity,jTenor); size_t indexStart = iExpirity*indexRatio_; size_t indexEnd = indexStart + jTenor*indexRatio_; VanillaSwap vanillaSwap(strike, indexStart, indexEnd, floatingTenor_, fixedTenor_, lmmTenorStructure); VanillaSwaption vanillaSwaption(vanillaSwap, OptionType::OptionType::CALL); double quote = quotes(iExpirity,jTenor); std::pair<VanillaSwaption, double> p(vanillaSwaption, quote); upperTriangleVanillaSwaptionQuotes_(iExpirity,jTenor) = p; } } initialize_gDelegate_IndexIngTransformed(); }
//! for MC double McGeneticTargetSwapLmmPricer::evaluateCouponLeg( LMM::Index indexValuationDate, const CouponLeg_CONSTPTR couponLeg, const std::vector<double>& numeraire, const matrix& liborMatrix, LMMTenorStructure_PTR lmmTenorStructure)const { std::vector<Coupon_CONSTPTR> couponList=couponLeg->getLeg(); Coupon_CONSTPTR firstCoupon = couponList[0]; TargetCoupon_CONSTPTR firstTargetCoupon = boost::dynamic_pointer_cast<const TargetCoupon>(firstCoupon); if(!firstTargetCoupon) throw("fail to cast targetCoupon"); double target = firstTargetCoupon->getTarget(); Rate_CONSTPTR firstRate = firstTargetCoupon->getRate(); LiborRate_CONSTPTR firstLiborRate = boost::dynamic_pointer_cast<const LiborRate>(firstRate); ConstRate_CONSTPTR firstConstRate = boost::dynamic_pointer_cast<const ConstRate>(firstRate); if(!firstLiborRate&&!firstConstRate) { throw("fail to cast LiborRate or ConstRate"); } double price = 0.0; if(firstLiborRate) { if(firstLiborRate->getDuration()!=lmmTenorStructure->get_tenorType()) throw("the tenor of the libor demanded is not the same than that in the model"); for(size_t i=0; i<couponList.size(); i++) { Coupon_CONSTPTR coupon=couponList[i]; LMM::Index paymentIndex = coupon->getPaymentIndex(); if(paymentIndex<=indexValuationDate)continue; CappedFlooredCoupon_CONSTPTR cappedFlooredCoupon = boost::dynamic_pointer_cast<const CappedFlooredCoupon>(coupon); TargetCoupon_CONSTPTR targetCoupon = boost::dynamic_pointer_cast<const TargetCoupon>(coupon); Rate_CONSTPTR rate = targetCoupon->getRate(); LiborRate_CONSTPTR liborRate = boost::dynamic_pointer_cast<const LiborRate>(rate); LMM::Index indexLibor = liborRate->getFixingTime(); assert(indexLibor<=paymentIndex); if(price<target) { double numeraire1 = numeraire[indexValuationDate]; double numeraire2 = numeraire[paymentIndex]; double numeraireLocal = numeraire1/numeraire2; double liborValue = liborMatrix(indexLibor, indexLibor); double result_calculate = evaluateCappedFlooredCoupon(cappedFlooredCoupon, liborValue); price += numeraireLocal*result_calculate; } } } else { for(size_t i=0; i<couponList.size(); i++) { Coupon_CONSTPTR coupon=couponList[i]; LMM::Index paymentIndex = coupon->getPaymentIndex(); if(paymentIndex<=indexValuationDate)continue; CappedFlooredCoupon_CONSTPTR cappedFlooredCoupon = boost::dynamic_pointer_cast<const CappedFlooredCoupon>(coupon); Rate_CONSTPTR rate = cappedFlooredCoupon->getRate(); ConstRate_CONSTPTR constRate = boost::dynamic_pointer_cast<const ConstRate>(rate); double constRateValue = constRate->getConstRateValue(); price+=numeraire[indexValuationDate]/numeraire[paymentIndex]*evaluateCappedFlooredCoupon(cappedFlooredCoupon, constRateValue); } } return price; }