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();
}
예제 #2
0
//! 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;
}