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 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 forwardstructure.hpp
23 \brief Forward-based yield term structure
24*/
25
26#ifndef quantlib_forward_structure_hpp
27#define quantlib_forward_structure_hpp
28
29#include <ql/termstructures/yieldtermstructure.hpp>
30
31namespace QuantLib {
32
33 //! %Forward-rate term structure
34 /*! This abstract class acts as an adapter to YieldTermStructure allowing
35 the programmer to implement only the <tt>forwardImpl(Time)</tt> method
36 in derived classes.
37
38 Zero yields and discounts are calculated from forwards.
39
40 Forward rates are assumed to be annual continuous compounding.
41
42 \ingroup yieldtermstructures
43 */
44 class ForwardRateStructure : public YieldTermStructure {
45 public:
46 /*! \name Constructors
47 See the TermStructure documentation for issues regarding
48 constructors.
49 */
50 //@{
51 explicit ForwardRateStructure(
52 const DayCounter& dayCounter = DayCounter());
53 explicit ForwardRateStructure(
54 const Date& referenceDate,
55 const Calendar& cal = Calendar(),
56 const DayCounter& dayCounter = DayCounter(),
57 const std::vector<Handle<Quote> >& jumps = {},
58 const std::vector<Date>& jumpDates = {});
59 ForwardRateStructure(
60 Natural settlementDays,
61 const Calendar& cal,
62 const DayCounter& dayCounter = DayCounter(),
63 const std::vector<Handle<Quote> >& jumps = {},
64 const std::vector<Date>& jumpDates = {});
65 //@}
66 protected:
67 /*! \name Calculations
68
69 These methods must be implemented in derived classes to
70 perform the actual calculations. When they are called,
71 range check has already been performed; therefore, they
72 must assume that extrapolation is required.
73 */
74 //@{
75 //! instantaneous forward-rate calculation
76 virtual Rate forwardImpl(Time) const = 0;
77 /*! Returns the zero yield rate for the given date calculating it
78 from the instantaneous forward rate \f$ f(t) \f$ as
79 \f[
80 z(t) = \int_0^t f(\tau) d\tau
81 \f]
82
83 \warning This default implementation uses an highly inefficient
84 and possibly wildly inaccurate numerical integration.
85 Derived classes should override it if a more efficient
86 implementation is available.
87 */
88 virtual Rate zeroYieldImpl(Time) const;
89 //@}
90
91 //! \name YieldTermStructure implementation
92 //@{
93 /*! Returns the discount factor for the given date calculating it
94 from the zero rate as \f$ d(t) = \exp \left( -z(t) t \right) \f$
95 */
96 DiscountFactor discountImpl(Time) const override;
97 //@}
98 };
99
100
101 // inline definitions
102
103 inline DiscountFactor ForwardRateStructure::discountImpl(Time t) const {
104 if (t == 0.0) // this acts as a safe guard in cases where
105 return 1.0; // zeroYieldImpl(0.0) would throw.
106
107 Rate r = zeroYieldImpl(t);
108 return DiscountFactor(std::exp(x: -r*t));
109 }
110
111}
112
113#endif
114

source code of quantlib/ql/termstructures/yield/forwardstructure.hpp