statsmodels.tsa.filters.hp_filter.hpfilter#

statsmodels.tsa.filters.hp_filter.hpfilter(x, lamb=1600, one_sided=False)[source]#

Hodrick-Prescott filter

Parameters:
xarray_like

The time series to filter, 1-d.

lambfloat, optional

The Hodrick-Prescott smoothing parameter. A value of 1600 is suggested for quarterly data. Ravn and Uhlig suggest using a value of 6.25 (1600/4**4) for annual data and 129600 (1600*3**4) for monthly data.

one_sidedbool, optional

If True, use the one-sided HP filter where the trend at time t only depends on the observations up to and including t. The default is the usual two-sided filter. The first two observations are fit exactly, so the trend is equal to x and the cycle is 0, and the first non-trivial value of the cycle is at t=2. x must not be empty and must not contain NaN or inf values.

Added in version 0.15.1.

Returns:
CycleTrendResult

A result object with fields:

cyclendarray or Series

The estimated cycle in the data given lamb.

trendndarray or Series

The estimated trend in the data given lamb.

Raises:
TypeError

If one_sided is not a bool.

ValueError

If lamb is not positive. If one_sided is True and x is empty or contains NaN or inf.

See also

statsmodels.tsa.filters.bk_filter.bkfilter

Baxter-King filter.

statsmodels.tsa.filters.cf_filter.cffilter

The Christiano Fitzgerald asymmetric, random walk filter.

statsmodels.tsa.seasonal.seasonal_decompose

Decompose a time series using moving averages.

statsmodels.tsa.seasonal.STL

Season-Trend decomposition using LOESS.

Notes

The HP filter removes a smooth trend, T, from the data x by solving

min sum((x[t] - T[t])**2 + lamb*((T[t+1] - T[t]) - (T[t] - T[t-1]))**2)

T t

Here we implemented the HP filter as a ridge-regression rule using scipy.sparse. In this sense, the solution can be written as

T = inv(I + lamb*K’K)x

where I is a nobs x nobs identity matrix, and K is a (nobs-2) x nobs matrix such that

K[i,j] = 1 if i == j or i == j + 2 K[i,j] = -2 if i == j + 1 K[i,j] = 0 otherwise

The one-sided filter uses the state space form of the HP filter

x[t] = T[t] + c[t], c[t] ~ N(0, 1) T[t] = 2*T[t-1] - T[t-2] + e[t], e[t] ~ N(0, 1/lamb)

The trend is the filtered state of the Kalman filter with an exact diffuse initialization. The one-sided trend at time t is identical to the last value of the two-sided trend computed from x[:t+1] (Stock and Watson, 1999). Because the initialization is exactly diffuse, the first observations differ slightly (by up to about 1e-3 for the real GDP series in the statsmodels tests, which has a level of about 3000) from implementations that approximate it with a large finite variance, for example hp1 in the R package hpfilter, which uses a prior variance of 1e5.

See the notebook Time Series Filters for an overview.

References

Hodrick, R.J, and E. C. Prescott. 1980. “Postwar U.S. Business Cycles: An

Empirical Investigation.” Carnegie Mellon University discussion paper no. 451.

Ravn, M.O and H. Uhlig. 2002. “On Adjusting the Hodrick-Prescott

Filter for the Frequency of Observations.” The Review of Economics and Statistics, 84(2), 371-80.

Stock, J.H. and M.W. Watson. 1999. “Forecasting inflation.” *Journal of

Monetary Economics*, 44(2), 293-335.

Examples

>>> import statsmodels.api as sm
>>> import pandas as pd
>>> dta = sm.datasets.macrodata.load_pandas().data
>>> index = pd.period_range('1959Q1', '2009Q3', freq='Q')
>>> dta = dta.set_index(index)
>>> cycle, trend = sm.tsa.filters.hpfilter(dta.realgdp, 1600)
>>> gdp_decomp = dta[['realgdp']]
>>> gdp_decomp["cycle"] = cycle
>>> gdp_decomp["trend"] = trend
>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> gdp_decomp[["realgdp", "trend"]]["2000-03-31":].plot(ax=ax,
...                                                      fontsize=16)
>>> plt.show()

(Source code, png, hires.png, pdf)

../_images/hpf_plot.png