1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3/*
4 Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl
5 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 StatPro Italia srl
6 Copyright (C) 2009 Ferdinando Ametrano
7
8 This file is part of QuantLib, a free-software/open-source library
9 for financial quantitative analysts and developers - http://quantlib.org/
10
11 QuantLib is free software: you can redistribute it and/or modify it
12 under the terms of the QuantLib license. You should have received a
13 copy of the license along with this program; if not, please email
14 <quantlib-dev@lists.sf.net>. The license is also available online at
15 <http://quantlib.org/license.shtml>.
16
17 This program is distributed in the hope that it will be useful, but WITHOUT
18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 FOR A PARTICULAR PURPOSE. See the license for more details.
20*/
21
22/*! \file iborindex.hpp
23 \brief base class for Inter-Bank-Offered-Rate indexes
24*/
25
26#ifndef quantlib_ibor_index_hpp
27#define quantlib_ibor_index_hpp
28
29#include <ql/indexes/interestrateindex.hpp>
30#include <ql/termstructures/yieldtermstructure.hpp>
31
32namespace QuantLib {
33
34 //! base class for Inter-Bank-Offered-Rate indexes (e.g. %Libor, etc.)
35 class IborIndex : public InterestRateIndex {
36 public:
37 IborIndex(const std::string& familyName,
38 const Period& tenor,
39 Natural settlementDays,
40 const Currency& currency,
41 const Calendar& fixingCalendar,
42 BusinessDayConvention convention,
43 bool endOfMonth,
44 const DayCounter& dayCounter,
45 Handle<YieldTermStructure> h = {});
46 //! \name InterestRateIndex interface
47 //@{
48 Date maturityDate(const Date& valueDate) const override;
49 Rate forecastFixing(const Date& fixingDate) const override;
50 // @}
51 //! \name Inspectors
52 //@{
53 BusinessDayConvention businessDayConvention() const;
54 bool endOfMonth() const { return endOfMonth_; }
55 //! the curve used to forecast fixings
56 Handle<YieldTermStructure> forwardingTermStructure() const;
57 //@}
58 //! \name Other methods
59 //@{
60 //! returns a copy of itself linked to a different forwarding curve
61 virtual ext::shared_ptr<IborIndex> clone(
62 const Handle<YieldTermStructure>& forwarding) const;
63 // @}
64 protected:
65 BusinessDayConvention convention_;
66 Handle<YieldTermStructure> termStructure_;
67 bool endOfMonth_;
68 private:
69 // overload to avoid date/time (re)calculation
70 /* This can be called with cached coupon dates (and it does
71 give quite a performance boost to coupon calculations) but
72 is potentially misleading: by passing the wrong dates, one
73 can ask a 6-months index for a 1-year fixing.
74
75 For that reason, we're leaving this method private and
76 we're declaring the IborCoupon class (which uses it) as a
77 friend. Should the need arise, we might promote it to
78 public, but before doing that I'd think hard whether we
79 have any other way to get the same results.
80 */
81 Rate forecastFixing(const Date& valueDate,
82 const Date& endDate,
83 Time t) const;
84 friend class IborCoupon;
85 };
86
87
88 class OvernightIndex : public IborIndex {
89 public:
90 OvernightIndex(const std::string& familyName,
91 Natural settlementDays,
92 const Currency& currency,
93 const Calendar& fixingCalendar,
94 const DayCounter& dayCounter,
95 const Handle<YieldTermStructure>& h = {});
96 //! returns a copy of itself linked to a different forwarding curve
97 ext::shared_ptr<IborIndex> clone(const Handle<YieldTermStructure>& h) const override;
98 };
99
100
101 // inline
102
103 inline BusinessDayConvention IborIndex::businessDayConvention() const {
104 return convention_;
105 }
106
107 inline Handle<YieldTermStructure>
108 IborIndex::forwardingTermStructure() const {
109 return termStructure_;
110 }
111
112 inline Rate IborIndex::forecastFixing(const Date& d1,
113 const Date& d2,
114 Time t) const {
115 QL_REQUIRE(!termStructure_.empty(),
116 "null term structure set to this instance of " << name());
117 DiscountFactor disc1 = termStructure_->discount(d: d1);
118 DiscountFactor disc2 = termStructure_->discount(d: d2);
119 return (disc1/disc2 - 1.0) / t;
120 }
121
122}
123
124#endif
125

source code of quantlib/ql/indexes/iborindex.hpp