25#ifndef quantlib_interpolated_zeroinflationcurve_hpp
26#define quantlib_interpolated_zeroinflationcurve_hpp
28#include <ql/termstructures/inflationtermstructure.hpp>
29#include <ql/termstructures/interpolatedcurve.hpp>
30#include <ql/math/interpolations/linearinterpolation.hpp>
31#include <ql/math/comparison.hpp>
38 template<
class Interpolator>
48 std::vector<Date>
dates,
49 const std::vector<Rate>&
rates,
50 const Interpolator& interpolator = Interpolator());
60 const std::vector<Date>&
dates()
const;
61 const std::vector<Time>&
times()
const;
62 const std::vector<Real>&
data()
const;
63 const std::vector<Rate>&
rates()
const;
64 std::vector<std::pair<Date,Rate> >
nodes()
const;
84 const Interpolator &interpolator = Interpolator());
93 template <
class Interpolator>
95 const Date& referenceDate,
100 std::vector<Date> dates,
101 const std::vector<Rate>& rates,
102 const Interpolator& interpolator)
105 dates_(
std::move(dates)) {
107 QL_REQUIRE(
dates_.size() > 1,
"too few dates: " <<
dates_.size());
112 std::pair<Date, Date> lim =
114 QL_REQUIRE(lim.first <=
dates_[0] &&
dates_[0] <= lim.second,
115 "first data date is not in base period, date: "
116 <<
dates_[0] <<
" not within [" << lim.first <<
"," << lim.second <<
"]");
118 QL_REQUIRE(this->
data_.size() == dates_.size(),
119 "indices/dates count mismatch: " << this->data_.size() <<
" vs "
123 QL_REQUIRE(this->
data_[i] > -1.0,
"zero inflation data < -100 %");
131 template <
class Interpolator>
139 const Interpolator& interpolator)
141 baseZeroRate, lag, frequency),
147 return dates_.front();
157 return this->interpolation_(t,
true);
161 inline const std::vector<Time>&
167 inline const std::vector<Date>&
173 inline const std::vector<Rate>&
179 inline const std::vector<Real>&
185 inline std::vector<std::pair<Date,Rate> >
187 std::vector<std::pair<Date,Rate> >
results(dates_.size());
188 for (
Size i=0; i<dates_.size(); ++i)
189 results[i] = std::make_pair(dates_[i],this->data_[i]);
virtual Period observationLag() const
virtual Frequency frequency() const
Helper class to build interpolated term structures.
Interpolation interpolation_
void setupTimes(const std::vector< Date > &dates, Date referenceDate, const DayCounter &dayCounter)
void setupInterpolation()
std::vector< Real > data_
Inflation term structure based on the interpolation of zero rates.
const std::vector< Rate > & rates() const
Rate zeroRateImpl(Time t) const override
to be defined in derived classes
std::vector< Date > dates_
Date baseDate() const override
minimum (base) date
const std::vector< Date > & dates() const
const std::vector< Real > & data() const
std::vector< std::pair< Date, Rate > > nodes() const
const std::vector< Time > & times() const
Date maxDate() const override
the latest date for which the curve can return values
InterpolatedZeroInflationCurve(const Date &referenceDate, const Calendar &calendar, const DayCounter &dayCounter, const Period &lag, Frequency frequency, std::vector< Date > dates, const std::vector< Rate > &rates, const Interpolator &interpolator=Interpolator())
virtual const Date & referenceDate() const
the date at which discount = 1.0 and/or variance = 0.0
virtual Calendar calendar() const
the calendar used for reference and/or option date calculation
virtual DayCounter dayCounter() const
the day counter used for date/time conversion
Interface for zero inflation term structures.
Frequency
Frequency of events.
Real Time
continuous quantity with 1-year units
std::size_t Size
size of a container
InterpolatedZeroInflationCurve< Linear > ZeroInflationCurve
std::pair< Date, Date > inflationPeriod(const Date &d, Frequency frequency)
utility function giving the inflation period for a given date