21#include <ql/indexes/inflationindex.hpp>
22#include <ql/termstructures/inflationtermstructure.hpp>
23#include <ql/time/calendars/nullcalendar.hpp>
30 const Period& observationLag,
33 switch (interpolationType) {
35 return index->fixing(date - observationLag);
39 return index->fixing(fixingPeriod.first);
45 if (date == interpolationPeriod.first) {
49 return index->fixing(fixingPeriod.first);
54 auto I0 = index->fixing(fixingPeriod.first);
55 auto I1 = index->fixing(fixingPeriod.second + oneDay);
57 return I0 + (I1 - I0) * (date - interpolationPeriod.first) /
58 (
Real)((interpolationPeriod.second + oneDay) - interpolationPeriod.first);
61 QL_FAIL(
"unknown CPI interpolation type: " <<
int(interpolationType));
71 const Period& availabilityLag,
78 std::move(currency)) {
79 QL_DEPRECATED_DISABLE_WARNING
81 QL_DEPRECATED_ENABLE_WARNING
87 QL_DEPRECATED_DISABLE_WARNING
92 const Period& availabilityLag,
94 : familyName_(
std::move(familyName)), region_(
std::move(region)), revised_(revised),
95 frequency_(frequency), availabilityLag_(availabilityLag), currency_(
std::move(currency)) {
100 QL_DEPRECATED_ENABLE_WARNING
103 QL_DEPRECATED_DISABLE_WARNING
105 QL_DEPRECATED_ENABLE_WARNING
115 bool forceOverwrite) {
119 std::vector<Date> dates(n);
120 std::vector<Rate> rates(n);
121 for (
Size i=0; i<n; ++i) {
122 dates[i] = lim.first + i;
127 rates.begin(), forceOverwrite);
135 const Period& availabilityLag,
139 familyName, region, revised, frequency, availabilityLag, currency,
std::move(zeroInflation)) {
140 QL_DEPRECATED_DISABLE_WARNING
142 QL_DEPRECATED_ENABLE_WARNING
149 const Period& availabilityLag,
152 :
InflationIndex(familyName, region, revised, frequency, availabilityLag, currency),
153 zeroInflation_(
std::move(zeroInflation)) {
163 Real I1 = ts[p.first];
165 "Missing " <<
name() <<
" fixing for " << p.first);
167 QL_DEPRECATED_DISABLE_WARNING
169 QL_DEPRECATED_ENABLE_WARNING
171 Real I2 = ts[p.second+1];
173 "Missing " <<
name() <<
" fixing for " << p.second+1);
178 Real daysInPeriod = (p2.second + 1) - p2.first;
179 Real interpolationCoefficient = (observationDate - p2.first) / daysInPeriod;
181 return I1 + (I2 - I1) * interpolationCoefficient;
204 Date historicalFixingKnown =
206 Date latestNeededDate = fixingDate;
208 QL_DEPRECATED_DISABLE_WARNING
211 if (fixingDate > p.first)
214 QL_DEPRECATED_ENABLE_WARNING
216 if (latestNeededDate <= historicalFixingKnown) {
220 }
else if (latestNeededDate > today) {
239 name() <<
" index fixing at base date " << baseDate <<
" is not available");
244 QL_DEPRECATED_DISABLE_WARNING
246 Date firstDateInPeriod = p.first;
249 baseDate, firstDateInPeriod);
250 Real I1 = baseFixing * std::pow(1.0 + Z1, t1);
253 Date firstDateInNextPeriod = p.second + 1;
256 baseDate, firstDateInNextPeriod);
257 Real I2 = baseFixing * std::pow(1.0 + Z2, t2);
262 Real daysInPeriod = (p2.second + 1) - p2.first;
263 Real interpolationCoefficient = (observationDate - p2.first) / daysInPeriod;
265 return I1 + (I2 - I1) * interpolationCoefficient;
270 QL_DEPRECATED_ENABLE_WARNING
278 auto clonedIndex = ext::make_shared<ZeroInflationIndex>(
280 QL_DEPRECATED_DISABLE_WARNING
282 QL_DEPRECATED_ENABLE_WARNING
290 :
InflationIndex(
"YYR_" + underlyingIndex->familyName(), underlyingIndex->region(),
291 underlyingIndex->revised(), underlyingIndex->frequency(),
292 underlyingIndex->availabilityLag(), underlyingIndex->currency()),
293 interpolated_(interpolated), ratio_(true), underlyingIndex_(underlyingIndex),
294 yoyInflation_(
std::move(yoyInflation)) {
299 QL_DEPRECATED_DISABLE_WARNING
306 const Period& availabilityLag,
310 frequency, availabilityLag, currency,
std::move(yoyInflation)) {}
312 QL_DEPRECATED_ENABLE_WARNING
320 const Period& availabilityLag,
323 :
InflationIndex(familyName, region, revised, frequency, availabilityLag, currency),
324 interpolated_(interpolated), ratio_(ratio), yoyInflation_(
std::move(yoyInflation)) {
338 Date lastFix = lim.first-1;
340 Date flatMustForecastOn = lastFix+1;
343 if (
interpolated() && fixingDate >= interpMustForecastOn) {
347 if (!
interpolated() && fixingDate >= flatMustForecastOn) {
359 return pastFixing/previousFixing - 1.0;
366 Real dp = lim.second + 1 - lim.first;
367 Real dl = fixingDate - lim.first;
368 Rate limFirstFix = ts[lim.first];
370 "Missing " <<
name() <<
" fixing for "
372 Rate limSecondFix = ts[lim.second+1];
374 "Missing " <<
name() <<
" fixing for "
376 Real linearNow = limFirstFix + (limSecondFix-limFirstFix)*dl/dp;
384 Rate pastFixing = ts[lim.first];
386 "Missing " <<
name() <<
" fixing for " << lim.first);
424 QL_DEPRECATED_DISABLE_WARNING
426 QL_DEPRECATED_ENABLE_WARNING
Shared handle to an observable.
const TimeSeries< Real > & timeSeries() const
returns the fixing TimeSeries
void addFixings(const TimeSeries< Real > &t, bool forceOverwrite=false)
stores historical fixings from a TimeSeries
Base class for inflation-rate indexes,.
Calendar fixingCalendar() const override
QL_DEPRECATED bool interpolated() const
std::string name() const override
Returns the name of the index.
InflationIndex(std::string familyName, Region region, bool revised, Frequency frequency, const Period &availabilitiyLag, Currency currency)
void addFixing(const Date &fixingDate, Rate fixing, bool forceOverwrite=false) override
Currency currency() const
Frequency frequency() const
QL_DEPRECATED bool interpolated_
Period availabilityLag() const
std::string familyName() const
Real fixing(const Date &fixingDate, bool forecastTodaysFixing=false) const override=0
Calendar for reproducing theoretical calculations.
template class providing a null value for a given type.
std::pair< iterator, bool > registerWith(const ext::shared_ptr< Observable > &)
Frequency frequency() const
Region class, used for inflation applicability.
const std::string & name() const
DateProxy & evaluationDate()
the date at which pricing is to be performed.
static Settings & instance()
access to the unique instance
Container for historical data.
Base class for year-on-year inflation indices.
Handle< YoYInflationTermStructure > yoyInflation_
ext::shared_ptr< YoYInflationIndex > clone(const Handle< YoYInflationTermStructure > &h) const
bool interpolated() const
Rate forecastFixing(const Date &fixingDate) const
YoYInflationIndex(const ext::shared_ptr< ZeroInflationIndex > &underlyingIndex, bool interpolated, Handle< YoYInflationTermStructure > ts={})
Constructor for year-on-year indices defined as a ratio.
Rate fixing(const Date &fixingDate, bool forecastTodaysFixing=false) const override
ext::shared_ptr< ZeroInflationIndex > underlyingIndex_
Base class for zero inflation indices.
ext::shared_ptr< ZeroInflationIndex > clone(const Handle< ZeroInflationTermStructure > &h) const
Handle< ZeroInflationTermStructure > zeroInflation_
ZeroInflationIndex(const std::string &familyName, const Region ®ion, bool revised, Frequency frequency, const Period &availabilityLag, const Currency ¤cy, Handle< ZeroInflationTermStructure > ts={})
Real forecastFixing(const Date &fixingDate) const
bool needsForecast(const Date &fixingDate) const
Real fixing(const Date &fixingDate, bool forecastTodaysFixing=false) const override
Frequency
Frequency of events.
Real Time
continuous quantity with 1-year units
std::size_t Size
size of a container
QuantLib::CPI::InterpolationType effectiveInterpolationType(const ext::shared_ptr< ZeroInflationIndex > &index, const QuantLib::CPI::InterpolationType &type=QuantLib::CPI::AsIndex)
std::pair< Date, Date > inflationPeriod(const Date &d, Frequency frequency)
utility function giving the inflation period for a given date
Time inflationYearFraction(Frequency f, bool indexIsInterpolated, const DayCounter &dayCounter, const Date &d1, const Date &d2)
static Real laggedFixing(const ext::shared_ptr< ZeroInflationIndex > &index, const Date &date, const Period &observationLag, InterpolationType interpolationType)
interpolated inflation fixing
InterpolationType
when you observe an index, how do you interpolate between fixings?
@ AsIndex
same interpolation as index
@ Linear
linearly between bracketing fixings
@ Flat
flat from previous fixing