Пример #1
0
	HullWhiteTimeDependentParameters calibration_hull_white(
		const Date& evalDate,
		const CapVolData& volData
	)
	{
			boost::shared_ptr<IborIndex> index = volData.index;
			Frequency fixedFreq = volData.fixedFreq;
			DayCounter fixedDC = volData.fixedDC;
			Real FixedA = volData.fixedA;
			std::vector<Real> initialSigma = volData.initialSigma;

			Settings::instance().evaluationDate() = Date( evalDate.serialNumber() );

			Date today  = Settings::instance().evaluationDate();
			std::vector<Date> dates;
			for (Size i=0; i<volData.tenors.size(); ++i){
				dates.push_back(today+volData.tenors[i]*Years);
			}
			dates.back() = today+50*Years;
			std::set<Date> temp(dates.begin(), dates.end());
			dates = std::vector<Date>(temp.begin(), temp.end());

			Handle<YieldTermStructure> rts_hw(index->forwardingTermStructure().currentLink());
			boost::shared_ptr<Generalized_HullWhite> model(new Generalized_HullWhite(rts_hw, dates, initialSigma, FixedA));

			boost::shared_ptr<PricingEngine> engine_hw(new AnalyticCapFloorEngine(model));
			//boost::shared_ptr<PricingEngine> engine_hw(new TreeCapFloorEngine(model, 80));
			std::vector<boost::shared_ptr<CalibrationHelper> > caps;

			for (Size i=0; i<volData.tenors.size(); ++i) {
				boost::shared_ptr<CalibrationHelper> helper(
					new CapHelper(Period(volData.tenors[i], Years),
					Handle<Quote>(boost::shared_ptr<Quote>(new SimpleQuote(volData.vols[i]))),
					index, fixedFreq,
					fixedDC,
					false,
					rts_hw, CalibrationHelper::PriceError));
				helper->setPricingEngine(engine_hw);
				caps.push_back(helper);		
			}

			LevenbergMarquardt optimizationMethod(1.0e-8,1.0e-8,1.0e-8);
			EndCriteria endCriteria(5000, 1000, 1e-8, 1e-8, 1e-8);
			Constraint c = BoundaryConstraint(0.01, 3.0);

			model->calibrate(caps, optimizationMethod, endCriteria, c);
			EndCriteria::Type ecType = model->endCriteria();
			Array xMinCalculated = model->params();
			
			//Real a = xMinCalculated[0];
			//Real sigmar = xMinCalculated[1];
			std::vector<Real> sigma;				
			for (Size i=0; i<xMinCalculated.size(); ++i) {
				sigma.push_back(xMinCalculated[i]);
			}

			return HullWhiteTimeDependentParameters(FixedA, dates, sigma, model, caps);
	}
Пример #2
0
    BatesDoubleExpModel::BatesDoubleExpModel(
        const boost::shared_ptr<HestonProcess> & process,
        Real lambda, Real nuUp, Real nuDown, Real p)
    : HestonModel(process) {
        arguments_.resize(9);

        arguments_[5] = ConstantParameter(p,
                                          BoundaryConstraint(0.0, 1.0));
        arguments_[6] = ConstantParameter(nuDown, PositiveConstraint());
        arguments_[7] = ConstantParameter(nuUp,   PositiveConstraint());
        arguments_[8] = ConstantParameter(lambda, PositiveConstraint());
    }