Ejemplo n.º 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);
	}
Ejemplo n.º 2
0
// [[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]);
}
Ejemplo n.º 3
0
// [[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]);
}
Ejemplo n.º 4
0
	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);
	}