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); }
// [[Rcpp::export]] Rcpp::List calibrateHullWhiteUsingSwapsEngine(SEXP termStrcDateVec, SEXP termStrcZeroVec, SEXP swapDataDF, SEXP iborDateVec, SEXP iborZeroVec, std::string iborType, QuantLib::Date evalDate) { QuantLib::Settings::instance().evaluationDate() = evalDate; //set up the HullWhite model QuantLib::Handle<QuantLib::YieldTermStructure> term(rebuildCurveFromZeroRates(termStrcDateVec, termStrcZeroVec)); boost::shared_ptr<QuantLib::HullWhite> model(new QuantLib::HullWhite(term)); //set up ibor index QuantLib::Handle<QuantLib::YieldTermStructure> indexStrc(rebuildCurveFromZeroRates(iborDateVec, iborZeroVec)); boost::shared_ptr<QuantLib::IborIndex> index = buildIborIndex(iborType, indexStrc); //process capDataDF boost::shared_ptr<QuantLib::PricingEngine> engine(new QuantLib::JamshidianSwaptionEngine(model)); std::vector<boost::shared_ptr <QuantLib::CalibrationHelper> > swaps; Rcpp::DataFrame swapDF(swapDataDF); Rcpp::NumericVector i0v = swapDF[0]; Rcpp::CharacterVector s1v = swapDF[1]; Rcpp::NumericVector i2v = swapDF[2]; Rcpp::CharacterVector s3v = swapDF[3]; Rcpp::NumericVector d4v = swapDF[4]; Rcpp::NumericVector i5v = swapDF[5]; Rcpp::CharacterVector s6v = swapDF[6]; Rcpp::NumericVector i7v = swapDF[7]; Rcpp::NumericVector i8v = swapDF[8]; //std::vector<std::vector<ColDatum> > table = swapDF.getTableData(); //int nrow = table.size(); int nrow = i0v.size(); for (int row=0; row<nrow;row++) { QuantLib::Period maturity = periodByTimeUnit(i0v[row], Rcpp::as<std::string>(s1v[row])); QuantLib::Period length = periodByTimeUnit(i0v[row], Rcpp::as<std::string>(s3v[row])); boost::shared_ptr<QuantLib::Quote> vol(new QuantLib::SimpleQuote(d4v[row])); QuantLib::Period fixedLegTenor = periodByTimeUnit(i5v[row], Rcpp::as<std::string>(s6v[row])); QuantLib::DayCounter fixedLegDayCounter = getDayCounter(i7v[row]); QuantLib::DayCounter floatingLegDayCounter = getDayCounter(i8v[row]); boost::shared_ptr<QuantLib::CalibrationHelper> helper(new QuantLib::SwaptionHelper(maturity, length, QuantLib::Handle<QuantLib::Quote>(vol), index, fixedLegTenor, fixedLegDayCounter, floatingLegDayCounter, term)); helper->setPricingEngine(engine); swaps.push_back(helper); } //calibrate the data QuantLib::LevenbergMarquardt optimizationMethod(1.0e-8,1.0e-8,1.0e-8); QuantLib::EndCriteria endCriteria(10000, 100, 1e-6, 1e-8, 1e-8); model->calibrate(swaps, optimizationMethod, endCriteria); //EndCriteria::Type ecType = model->endCriteria(); //return the result QuantLib::Array xMinCalculated = model->params(); return Rcpp::List::create(Rcpp::Named("alpha") = xMinCalculated[0], Rcpp::Named("sigma") = xMinCalculated[1]); }
// [[Rcpp::export]] Rcpp::List calibrateHullWhiteUsingCapsEngine(SEXP termStrcDateVec, SEXP termStrcZeroVec, SEXP capDataDF, SEXP iborDateVec, SEXP iborZeroVec, std::string iborType, QuantLib::Date evalDate) { QuantLib::Settings::instance().evaluationDate() = evalDate; QuantLib::Handle<QuantLib::YieldTermStructure> term(rebuildCurveFromZeroRates(termStrcDateVec, termStrcZeroVec)); //set up ibor index QuantLib::Handle<QuantLib::YieldTermStructure> indexStrc(rebuildCurveFromZeroRates(iborDateVec, iborZeroVec)); boost::shared_ptr<QuantLib::IborIndex> index = buildIborIndex(iborType, indexStrc); //process capDataDF std::vector<boost::shared_ptr <QuantLib::CalibrationHelper> > caps; Rcpp::DataFrame capDF(capDataDF); Rcpp::NumericVector i0v = capDF[0]; Rcpp::CharacterVector s1v = capDF[1]; Rcpp::NumericVector d2v = capDF[2]; Rcpp::NumericVector i3v = capDF[3]; Rcpp::NumericVector i4v = capDF[4]; Rcpp::NumericVector i5v = capDF[5]; //std::vector<std::vector<ColDatum> > table = capDF.getTableData(); //int nrow = table.size(); int nrow = i0v.size(); for (int row=0; row<nrow;row++) { QuantLib::Period p = periodByTimeUnit(i0v[row], Rcpp::as<std::string>(s1v[row])); boost::shared_ptr<QuantLib::Quote> vol(new QuantLib::SimpleQuote(d2v[row])); QuantLib::DayCounter dc = getDayCounter(i4v[row]); boost::shared_ptr<QuantLib::CalibrationHelper> helper(new QuantLib::CapHelper(p, QuantLib::Handle<QuantLib::Quote>(vol), index, getFrequency(i3v[row]), dc, (i5v[row]==1) ? true : false, term)); boost::shared_ptr<QuantLib::BlackCapFloorEngine> engine(new QuantLib::BlackCapFloorEngine(term, d2v[row])); helper->setPricingEngine(engine); caps.push_back(helper); } //set up the HullWhite model boost::shared_ptr<QuantLib::HullWhite> model(new QuantLib::HullWhite(term)); //calibrate the data QuantLib::LevenbergMarquardt optimizationMethod(1.0e-8,1.0e-8,1.0e-8); QuantLib::EndCriteria endCriteria(10000, 100, 1e-6, 1e-8, 1e-8); model->calibrate(caps, optimizationMethod, endCriteria); //EndCriteria::Type ecType = model->endCriteria(); //return the result QuantLib::Array xMinCalculated = model->params(); return Rcpp::List::create(Rcpp::Named("alpha") = xMinCalculated[0], Rcpp::Named("sigma") = xMinCalculated[1]); }
HullWhiteTimeDependentParameters calibration_hull_white( const Date& evalDate, const SwaptionVolData& volData ) { boost::shared_ptr<IborIndex> index = volData.index; Frequency fixedFreq = volData.fixedFreq; DayCounter fixedDC = volData.fixedDC; DayCounter floatingDC = volData.floatingDC; Real FixedA = volData.fixedA; std::vector<Real> initialSigma = volData.initialSigma; Settings::instance().evaluationDate() = Date( evalDate.serialNumber() ); Date today = Settings::instance().evaluationDate(); std::vector<Date> tmpdates; for (Size i=0; i<volData.maturities.size(); ++i){ tmpdates.push_back(today+volData.maturities[i]); } tmpdates.back() = today+50*Years; std::set<Date> dateSet( tmpdates.begin(), tmpdates.end() ); std::vector<Date> dates( dateSet.begin(), dateSet.end() ); Handle<YieldTermStructure> rts_hw(index->forwardingTermStructure().currentLink()); //boost::shared_ptr<GeneralizedHullWhite> model(new GeneralizedHullWhite(rts_hw, dates, dates, std::vector<Real>(1, FixedA), initialSigma)); 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 TreeSwaptionEngine(model, 100)); boost::shared_ptr<PricingEngine> engine_hw(new JamshidianSwaptionEngine(model)); std::vector<boost::shared_ptr<CalibrationHelper> > swaptions; for (Size i=0; i<volData.maturities.size(); ++i) { boost::shared_ptr<CalibrationHelper> helper( new SwaptionHelper(volData.maturities[i], volData.lengths[i], Handle<Quote>(boost::shared_ptr<Quote>(new SimpleQuote(volData.vols[i]))), index, Period(fixedFreq), fixedDC, floatingDC, rts_hw, CalibrationHelper::PriceError)); helper->setPricingEngine(engine_hw); swaptions.push_back(helper); } LevenbergMarquardt optimizationMethod(1.0e-8,1.0e-8,1.0e-8); EndCriteria endCriteria(50000, 1000, 1e-8, 1e-8, 1e-8); model->calibrate(swaptions, optimizationMethod, endCriteria); 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, swaptions); }