Skip to content

Commit 9a123d3

Browse files
committed
QPR-11467 add new methods to inflation seasonality to undo the rate adjustment
1 parent f7014c4 commit 9a123d3

2 files changed

Lines changed: 88 additions & 0 deletions

File tree

ql/termstructures/inflation/seasonality.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,23 @@ namespace QuantLib {
129129
return seasonalityCorrection(r, effectiveFixingDate, iTS.dayCounter(), curveBaseDate, true);
130130
}
131131

132+
Rate MultiplicativePriceSeasonality::deseasonalisedZeroRate(
133+
const Date& d, Rate r, const InflationTermStructure& iTS) const {
134+
Date curveBaseDate = iTS.baseDate();
135+
Date effectiveFixingDate = inflationPeriod(d, iTS.frequency()).first;
136+
137+
return removeSeasonalityAdjustment(r, effectiveFixingDate, iTS.dayCounter(), curveBaseDate, true);
138+
}
139+
140+
Rate MultiplicativePriceSeasonality::deseasonalisedYoYRate(
141+
const Date& d, Rate r, const InflationTermStructure& iTS) const {
142+
Date curveBaseDate = iTS.baseDate();
143+
Date effectiveFixingDate = inflationPeriod(d, iTS.frequency()).first;
144+
145+
return removeSeasonalityAdjustment(r, effectiveFixingDate, iTS.dayCounter(), curveBaseDate,
146+
false);
147+
}
148+
132149

133150
Rate MultiplicativePriceSeasonality::correctYoYRate(const Date &d,
134151
const Rate r,
@@ -214,6 +231,28 @@ namespace QuantLib {
214231
}
215232

216233

234+
Rate MultiplicativePriceSeasonality::removeSeasonalityAdjustment(Rate rate,
235+
const Date& atDate,
236+
const DayCounter& dc,
237+
const Date& curveBaseDate,
238+
const bool isZeroRate) const {
239+
Real factorAt = this->seasonalityFactor(atDate);
240+
Rate f;
241+
if (isZeroRate) {
242+
Rate factorBase = this->seasonalityFactor(curveBaseDate);
243+
Real seasonalityAt = factorAt / factorBase;
244+
std::pair<Date, Date> p = inflationPeriod(atDate, frequency());
245+
Time timeFromCurveBase = dc.yearFraction(curveBaseDate, p.first);
246+
f = std::pow(seasonalityAt, 1 / timeFromCurveBase);
247+
} else {
248+
Rate factor1Ybefore = this->seasonalityFactor(atDate - Period(1, Years));
249+
f = factorAt / factor1Ybefore;
250+
}
251+
252+
return (rate + 1) / f - 1;
253+
}
254+
255+
217256
Real KerkhofSeasonality::seasonalityFactor(const Date &to) const {
218257

219258
Integer dir = 1;
@@ -273,4 +312,25 @@ namespace QuantLib {
273312
return (rate + 1)*f - 1;
274313
}
275314

315+
Rate KerkhofSeasonality::removeSeasonalityAdjustment(Rate rate,
316+
const Date& atDate,
317+
const DayCounter& dc,
318+
const Date& curveBaseDate,
319+
const bool isZeroRate) const {
320+
321+
Real indexFactor = this->seasonalityFactor(atDate);
322+
323+
// Getting seasonality correction
324+
Rate f;
325+
if (isZeroRate) {
326+
std::pair<Date, Date> lim = inflationPeriod(curveBaseDate, Monthly);
327+
Time timeFromCurveBase = dc.yearFraction(lim.first, atDate);
328+
f = std::pow(indexFactor, 1 / timeFromCurveBase);
329+
} else {
330+
QL_FAIL("Seasonal Kerkhof model is not defined on YoY rates");
331+
}
332+
333+
return (rate + 1) / f - 1;
334+
}
335+
276336
}

ql/termstructures/inflation/seasonality.hpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ namespace QuantLib {
7373
inflation curve is bootstrapped.
7474
*/
7575
virtual bool isConsistent(const InflationTermStructure& iTS) const;
76+
77+
//! Takes a seasonality adjusted zeroRate and remove the seasonality adjustment
78+
virtual Rate deseasonalisedZeroRate(const Date& d,
79+
Rate r,
80+
const InflationTermStructure& iTS) const = 0;
81+
82+
//! Takes a seasonality adjusted yoy rate and remove the seasonality adjustment
83+
virtual Rate deseasonalisedYoYRate(const Date& d,
84+
Rate r,
85+
const InflationTermStructure& iTS) const = 0;
7686
//@}
7787

7888
virtual ~Seasonality() = default;
@@ -154,6 +164,12 @@ namespace QuantLib {
154164
Rate
155165
correctYoYRate(const Date& d, Rate r, const InflationTermStructure& iTS) const override;
156166
bool isConsistent(const InflationTermStructure& iTS) const override;
167+
Rate deseasonalisedZeroRate(const Date& d,
168+
Rate r,
169+
const InflationTermStructure& iTS) const override;
170+
Rate deseasonalisedYoYRate(const Date& d,
171+
Rate r,
172+
const InflationTermStructure& iTS) const override;
157173
//@}
158174

159175
//Destructor
@@ -164,6 +180,12 @@ namespace QuantLib {
164180
virtual void validate() const;
165181
virtual Rate seasonalityCorrection(Rate r, const Date &d, const DayCounter &dc,
166182
const Date &curveBaseDate, bool isZeroRate) const;
183+
184+
virtual Rate removeSeasonalityAdjustment(Rate r,
185+
const Date& d,
186+
const DayCounter& dc,
187+
const Date& curveBaseDate,
188+
bool isZeroRate) const;
167189
};
168190

169191

@@ -184,6 +206,12 @@ namespace QuantLib {
184206
const DayCounter& dc,
185207
const Date& curveBaseDate,
186208
bool isZeroRate) const override;
209+
210+
Rate removeSeasonalityAdjustment(Rate r,
211+
const Date& d,
212+
const DayCounter& dc,
213+
const Date& curveBaseDate,
214+
bool isZeroRate) const override;
187215
};
188216

189217
} // end of namespace QuantLib

0 commit comments

Comments
 (0)