@@ -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}
0 commit comments