#include "TreasuryYieldCurve.h" #include #include #include #include #include #include #include using namespace QuantLib; using namespace std; using namespace boost; #if defined(QL_ENABLE_SESSIONS) namespace QuantLib { Integer sessionId() { return 0; } } #endif // par-rate approximation Rate parRate(const YieldTermStructure& yts, const std::vector& dates, const DayCounter& resultDayCounter) { QL_REQUIRE(dates.size() >= 2, "at least two dates are required"); Real sum = 0.0; Time dt; for (Size i=1; i0.0, "unsorted dates"); sum += yts.discount(dates[i]) * dt; } Real result = yts.discount(dates.front()) - yts.discount(dates.back()); return result/sum; } int main(int, char* []) { try{ boost::timer timer; std::cout << std::endl; /////////////////***************************///////////////////////// Natural settlementDays = 1; Integer fixingDays = 1; DayCounter DMCalcCounter = Actual360(); Calendar DMCalccalendar = UnitedStates(UnitedStates::GovernmentBond); Date settlementDate(19, September, 2012); // must be a business day settlementDate = DMCalccalendar.adjust(settlementDate); Date todaysDate = DMCalccalendar.advance(settlementDate, -fixingDays, Days); cout << "Today is " << todaysDate << endl; // nothing to do with Date::todaysDate Settings::instance().evaluationDate() = todaysDate; std::vector AccuralStart; std::vector IndexRate; string dummyString, line; double dummyNumber; std::ifstream AccuralStartFile, IndexRateFile; std::ofstream junk; junk.open("c:\\temp\\junk.dat"); QuantLib::Date dd; AccuralStartFile.open("c:\\temp\\ASDate.dat"); while(true){ AccuralStartFile >> dummyString; if(AccuralStartFile.eof()) break; dd = DateParser::parse(dummyString, "mm/dd/yyyy"); AccuralStart.push_back(dd); junk << dd << endl; } cout << "AccuralStartSize = " << AccuralStart.size() << endl; IndexRateFile.open("c:\\temp\\IndexRate.dat"); while(true){ IndexRateFile >> dummyNumber; if(IndexRateFile.eof()) break; IndexRate.push_back(dummyNumber); //junk << dummyNumber << endl; } cout << "IndexRateFileSize = " << IndexRate.size() << endl; junk.close(); boost::shared_ptr TB13WksRateTermStructure( new InterpolatedZeroCurve ( AccuralStart, IndexRate, DMCalcCounter)); Rate Spread = 0.0012; Rate DM = 0.0012; Handle zeroCurveHandle(TB13WksRateTermStructure); Handle DMQuoteHandle(boost::shared_ptr(new SimpleQuote(Spread))); boost::shared_ptr discountRateTermStructure(new ZeroSpreadedTermStructure(zeroCurveHandle, DMQuoteHandle)); discountRateTermStructure->enableExtrapolation(); Real FRNfaceAmount = 1000000; RelinkableHandle TreasuryTermStructure; const boost::shared_ptr FRN13Wks( new USDLibor(Period(13,Weeks),TreasuryTermStructure)); FRN13Wks->addFixing(Date(30, July, 2012), 0.000950); Schedule FRNSchedule( Date(31, July, 2012), Date(31, July, 2014), Period(Quarterly), UnitedStates(UnitedStates::GovernmentBond), Unadjusted, Unadjusted, DateGeneration::Backward, true); FloatingRateBond FRN( settlementDays, FRNfaceAmount, FRNSchedule, FRN13Wks, Actual360(), ModifiedFollowing, Natural(2), // Gearings std::vector(1, 1.0), // Spreads std::vector(1, 0.0012), // Caps std::vector(), // Floors std::vector(), // Fixing in arrears true, Real(100.0), Date(31, July, 2012)); RelinkableHandle discountRateTermStructureHandle; boost::shared_ptr FRNEngine(new DiscountingBondEngine(discountRateTermStructureHandle)); FRN.setPricingEngine(FRNEngine); // Coupon pricers boost::shared_ptr FRNpricer(new BlackIborCouponPricer); // optionLet volatilities Volatility FRNvolatility = 0.0; Handle FRNvol; FRNvol = Handle( boost::shared_ptr(new ConstantOptionletVolatility( settlementDays, DMCalccalendar, ModifiedFollowing, FRNvolatility, Actual365Fixed()))); FRNpricer->setCapletVolatility(FRNvol); //void setCouponPricer(const Leg& leg, const boost::shared_ptr&); //to set the price using setCouponPricer setCouponPricer(FRN.cashflows(),FRNpricer); // Yield curve bootstrapping discountRateTermStructureHandle.linkTo(discountRateTermStructure); TreasuryTermStructure.linkTo(discountRateTermStructure); Size FRNwidths[] = { 18, 10, 10, 10 }; std::cout << std::setw(FRNwidths[0]) << "FRN Net present value" << std::setw(FRNwidths[3]) << FRN.NPV() << std::endl; std::cout << std::setw(FRNwidths[0]) << "FRN Clean price" << std::setw(FRNwidths[2]) << FRN.cleanPrice() << std::endl; cout << "hello" << endl; system("pause"); }catch (std::exception& e) { std::cerr << e.what() << std::endl; return 1; } catch (...) { std::cerr << "unknown error" << std::endl; return 1; } }