1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
/*
Copyright (C) 2000, 2001, 2002 RiskMap srl
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it under the
terms of the QuantLib license. You should have received a copy of the
license along with this program; if not, please email ferdinando@ametrano.net
The license is also available online at http://quantlib.org/html/license.html
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
/*! \file xibor.cpp
\brief purely virtual base class for libor indexes
\fullpath
ql/Indexes/%xibor.cpp
*/
// $Id: xibor.cpp,v 1.6 2002/01/16 14:43:12 nando Exp $
#include <ql/Indexes/xibor.hpp>
#include <ql/Indexes/xibormanager.hpp>
namespace QuantLib {
namespace Indexes {
std::string Xibor::name() const {
switch (units_) {
case Days:
return familyName_+IntegerFormatter::toString(n_)+"d";
case Weeks:
return familyName_+IntegerFormatter::toString(n_)+"w";
case Months:
return familyName_+IntegerFormatter::toString(n_)+"m";
case Years:
return familyName_+IntegerFormatter::toString(n_)+"y";
default:
throw Error("invalid time unit");
}
QL_DUMMY_RETURN(std::string());
}
Rate Xibor::fixing(const Date& fixingDate) const {
QL_REQUIRE(!termStructure_.isNull(),
"null term structure set");
Date settlementDate = termStructure_->settlementDate();
if (fixingDate < settlementDate) {
// must have been fixed
Rate pastFixing =
XiborManager::getHistory(name())[fixingDate];
QL_REQUIRE(pastFixing != Null<double>(),
"Missing " + name() + " fixing for " +
DateFormatter::toString(fixingDate));
return pastFixing;
}
if (fixingDate == settlementDate) {
// might have been fixed
try {
Rate pastFixing =
XiborManager::getHistory(name())[fixingDate];
if (pastFixing != Null<double>())
return pastFixing;
else
; // fall through and forecast
} catch (Error&) {
; // fall through and forecast
}
}
Date endDate = fixingDate.plus(n_,units_);
if (isAdjusted_)
endDate = calendar_.roll(endDate,rollingConvention_);
DiscountFactor fixingDiscount =
termStructure_->discount(fixingDate);
DiscountFactor endDiscount =
termStructure_->discount(endDate);
double fixingPeriod =
dayCounter_.yearFraction(fixingDate, endDate);
return (fixingDiscount/endDiscount-1.0) / fixingPeriod;
}
}
}
|