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); }
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()); }