Time Series Filters
1 2 3 4 5 | <span class = "kn" > from < / span> <span class = "nn" >__future__< / span> <span class = "kn" > import < / span> <span class = "n" >print_function< / span> <span class = "kn" > import < / span> <span class = "nn" >pandas< / span> <span class = "kn" >as< / span> <span class = "nn" >pd< / span> <span class = "kn" > import < / span> <span class = "nn" >matplotlib.pyplot< / span> <span class = "kn" >as< / span> <span class = "nn" >plt< / span> <span class = "kn" > import < / span> <span class = "nn" >statsmodels.api< / span> <span class = "kn" >as< / span> <span class = "nn" >sm< / span> |
1 | <span class = "n" >dta< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >datasets< / span><span class = "o" >.< / span><span class = "n" >macrodata< / span><span class = "o" >.< / span><span class = "n" >load_pandas< / span><span class = "p" >()< / span><span class = "o" >.< / span><span class = "n" >data< / span> |
1 2 | <span class = "n" >index< / span> <span class = "o" > = < / span> <span class = "n" >pd< / span><span class = "o" >.< / span><span class = "n" >Index< / span><span class = "p" >(< / span><span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >tsa< / span><span class = "o" >.< / span><span class = "n" >datetools< / span><span class = "o" >.< / span><span class = "n" >dates_from_range< / span><span class = "p" >(< / span><span class = "s" > '1959Q1' < / span><span class = "p" >,< / span> <span class = "s" > '2009Q3' < / span><span class = "p" >))< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >index< / span><span class = "p" >)< / span> |
1 2 3 | <span class = "n" >dta< / span><span class = "o" >.< / span><span class = "n" >index< / span> <span class = "o" > = < / span> <span class = "n" >index< / span> <span class = "k" > del < / span> <span class = "n" >dta< / span><span class = "p" >[< / span><span class = "s" > 'year' < / span><span class = "p" >]< / span> <span class = "k" > del < / span> <span class = "n" >dta< / span><span class = "p" >[< / span><span class = "s" > 'quarter' < / span><span class = "p" >]< / span> |
1 | <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >datasets< / span><span class = "o" >.< / span><span class = "n" >macrodata< / span><span class = "o" >.< / span><span class = "n" >NOTE< / span><span class = "p" >)< / span> |
1 | <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >dta< / span><span class = "o" >.< / span><span class = "n" >head< / span><span class = "p" >(< / span><span class = "mi" > 10 < / span><span class = "p" >))< / span> |
1 2 3 4 5 | <span class = "n" >fig< / span> <span class = "o" > = < / span> <span class = "n" >plt< / span><span class = "o" >.< / span><span class = "n" >figure< / span><span class = "p" >(< / span><span class = "n" >figsize< / span><span class = "o" > = < / span><span class = "p" >(< / span><span class = "mi" > 12 < / span><span class = "p" >,< / span><span class = "mi" > 8 < / span><span class = "p" >))< / span> <span class = "n" >ax< / span> <span class = "o" > = < / span> <span class = "n" >fig< / span><span class = "o" >.< / span><span class = "n" >add_subplot< / span><span class = "p" >(< / span><span class = "mi" > 111 < / span><span class = "p" >)< / span> <span class = "n" >dta< / span><span class = "o" >.< / span><span class = "n" >realgdp< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >ax< / span><span class = "o" > = < / span><span class = "n" >ax< / span><span class = "p" >);< / span> <span class = "n" >legend< / span> <span class = "o" > = < / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >legend< / span><span class = "p" >(< / span><span class = "n" >loc< / span> <span class = "o" > = < / span> <span class = "s" > 'upper left' < / span><span class = "p" >);< / span> <span class = "n" >legend< / span><span class = "o" >.< / span><span class = "n" >prop< / span><span class = "o" >.< / span><span class = "n" >set_size< / span><span class = "p" >(< / span><span class = "mi" > 20 < / span><span class = "p" >);< / span> |
Hodrick-Prescott Filter
The Hodrick-Prescott filter separates a time-series $y_t$ into a trend $\tau_t$ and a cyclical component $\zeta_t$
yt=τt+ζt
The components are determined by minimizing the following quadratic loss function
min
1 | <span class = "n" >gdp_cycle< / span><span class = "p" >,< / span> <span class = "n" >gdp_trend< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >tsa< / span><span class = "o" >.< / span><span class = "n" >filters< / span><span class = "o" >.< / span><span class = "n" >hpfilter< / span><span class = "p" >(< / span><span class = "n" >dta< / span><span class = "o" >.< / span><span class = "n" >realgdp< / span><span class = "p" >)< / span> |
1 2 3 | <span class = "n" >gdp_decomp< / span> <span class = "o" > = < / span> <span class = "n" >dta< / span><span class = "p" >[[< / span><span class = "s" > 'realgdp' < / span><span class = "p" >]]< / span> <span class = "n" >gdp_decomp< / span><span class = "p" >[< / span><span class = "s" > "cycle" < / span><span class = "p" >]< / span> <span class = "o" > = < / span> <span class = "n" >gdp_cycle< / span> <span class = "n" >gdp_decomp< / span><span class = "p" >[< / span><span class = "s" > "trend" < / span><span class = "p" >]< / span> <span class = "o" > = < / span> <span class = "n" >gdp_trend< / span> |
1 2 3 4 5 | <span class = "n" >fig< / span> <span class = "o" > = < / span> <span class = "n" >plt< / span><span class = "o" >.< / span><span class = "n" >figure< / span><span class = "p" >(< / span><span class = "n" >figsize< / span><span class = "o" > = < / span><span class = "p" >(< / span><span class = "mi" > 12 < / span><span class = "p" >,< / span><span class = "mi" > 8 < / span><span class = "p" >))< / span> <span class = "n" >ax< / span> <span class = "o" > = < / span> <span class = "n" >fig< / span><span class = "o" >.< / span><span class = "n" >add_subplot< / span><span class = "p" >(< / span><span class = "mi" > 111 < / span><span class = "p" >)< / span> <span class = "n" >gdp_decomp< / span><span class = "p" >[[< / span><span class = "s" > "realgdp" < / span><span class = "p" >,< / span> <span class = "s" > "trend" < / span><span class = "p" >]][< / span><span class = "s" > "2000-03-31" < / span><span class = "p" >:]< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >ax< / span><span class = "o" > = < / span><span class = "n" >ax< / span><span class = "p" >,< / span> <span class = "n" >fontsize< / span><span class = "o" > = < / span><span class = "mi" > 16 < / span><span class = "p" >);< / span> <span class = "n" >legend< / span> <span class = "o" > = < / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >get_legend< / span><span class = "p" >()< / span> <span class = "n" >legend< / span><span class = "o" >.< / span><span class = "n" >prop< / span><span class = "o" >.< / span><span class = "n" >set_size< / span><span class = "p" >(< / span><span class = "mi" > 20 < / span><span class = "p" >);< / span> |
Baxter-King approximate band-pass filter: Inflation and Unemployment
Explore the hypothesis that inflation and unemployment are counter-cyclical.
The Baxter-King filter is intended to explictly deal with the periodicty of the business cycle. By applying their band-pass filter to a series, they produce a new series that does not contain fluctuations at higher or lower than those of the business cycle. Specifically, the BK filter takes the form of a symmetric moving average
y_{t}^{*}=\sum_{k=-K}^{k=K}a_ky_{t-k}
where $a_{-k}=a_k$ and $\sum_{k=-k}^{K}a_k=0$ to eliminate any trend in the series and render it stationary if the series is I(1) or I(2).
For completeness, the filter weights are determined as follows
a_{j} = B_{j}+\theta\text{ for }j=0,\pm1,\pm2,\dots,\pm K
B_{0} = \frac{\left(\omega_{2}-\omega_{1}\right)}{\pi} B_{j} = \frac{1}{\pi j}\left(\sin\left(\omega_{2}j\right)-\sin\left(\omega_{1}j\right)\right)\text{ for }j=0,\pm1,\pm2,\dots,\pm K
where $\theta$ is a normalizing constant such that the weights sum to zero.
\theta=\frac{-\sum_{j=-K^{K}b_{j}}}{2K+1}
\omega_{1}=\frac{2\pi}{P_{H}}
\omega_{2}=\frac{2\pi}{P_{L}}
$P_L$ and $P_H$ are the periodicity of the low and high cut-off frequencies. Following Burns and Mitchell's work on US business cycles which suggests cycles last from 1.5 to 8 years, we use $P_L=6$ and $P_H=32$ by default.
1 | <span class = "n" >bk_cycles< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >tsa< / span><span class = "o" >.< / span><span class = "n" >filters< / span><span class = "o" >.< / span><span class = "n" >bkfilter< / span><span class = "p" >(< / span><span class = "n" >dta< / span><span class = "p" >[[< / span><span class = "s" > "infl" < / span><span class = "p" >,< / span><span class = "s" > "unemp" < / span><span class = "p" >]])< / span> |
- We lose K observations on both ends. It is suggested to use K=12 for quarterly data.
1 2 3 | <span class = "n" >fig< / span> <span class = "o" > = < / span> <span class = "n" >plt< / span><span class = "o" >.< / span><span class = "n" >figure< / span><span class = "p" >(< / span><span class = "n" >figsize< / span><span class = "o" > = < / span><span class = "p" >(< / span><span class = "mi" > 12 < / span><span class = "p" >,< / span><span class = "mi" > 10 < / span><span class = "p" >))< / span> <span class = "n" >ax< / span> <span class = "o" > = < / span> <span class = "n" >fig< / span><span class = "o" >.< / span><span class = "n" >add_subplot< / span><span class = "p" >(< / span><span class = "mi" > 111 < / span><span class = "p" >)< / span> <span class = "n" >bk_cycles< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >ax< / span><span class = "o" > = < / span><span class = "n" >ax< / span><span class = "p" >,< / span> <span class = "n" >style< / span><span class = "o" > = < / span><span class = "p" >[< / span><span class = "s" > 'r--' < / span><span class = "p" >,< / span> <span class = "s" > 'b-' < / span><span class = "p" >]);< / span> |
Christiano-Fitzgerald approximate band-pass filter: Inflation and Unemployment
The Christiano-Fitzgerald filter is a generalization of BK and can thus also be seen as weighted moving average. However, the CF filter is asymmetric about $t$ as well as using the entire series. The implementation of their filter involves the calculations of the weights in
y_{t}^{*}=B_{0}y_{t}+B_{1}y_{t+1}+\dots+B_{T-1-t}y_{T-1}+\tilde B_{T-t}y_{T}+B_{1}y_{t-1}+\dots+B_{t-2}y_{2}+\tilde B_{t-1}y_{1}
for $t=3,4,...,T-2$, where
B_{j} = \frac{\sin(jb)-\sin(ja)}{\pi j},j\geq1
B_{0} = \frac{b-a}{\pi},a=\frac{2\pi}{P_{u}},b=\frac{2\pi}{P_{L}}
$\tilde B_{T-t}$ and $\tilde B_{t-1}$ are linear functions of the $B_{j}$'s, and the values for $t=1,2,T-1,$ and $T$ are also calculated in much the same way. $P_{U}$ and $P_{L}$ are as described above with the same interpretation.
The CF filter is appropriate for series that may follow a random walk.
1 | <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >tsa< / span><span class = "o" >.< / span><span class = "n" >stattools< / span><span class = "o" >.< / span><span class = "n" >adfuller< / span><span class = "p" >(< / span><span class = "n" >dta< / span><span class = "p" >[< / span><span class = "s" > 'unemp' < / span><span class = "p" >])[:< / span><span class = "mi" > 3 < / span><span class = "p" >])< / span> |
1 | <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >tsa< / span><span class = "o" >.< / span><span class = "n" >stattools< / span><span class = "o" >.< / span><span class = "n" >adfuller< / span><span class = "p" >(< / span><span class = "n" >dta< / span><span class = "p" >[< / span><span class = "s" > 'infl' < / span><span class = "p" >])[:< / span><span class = "mi" > 3 < / span><span class = "p" >])< / span> |
1 2 | <span class = "n" >cf_cycles< / span><span class = "p" >,< / span> <span class = "n" >cf_trend< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >tsa< / span><span class = "o" >.< / span><span class = "n" >filters< / span><span class = "o" >.< / span><span class = "n" >cffilter< / span><span class = "p" >(< / span><span class = "n" >dta< / span><span class = "p" >[[< / span><span class = "s" > "infl" < / span><span class = "p" >,< / span><span class = "s" > "unemp" < / span><span class = "p" >]])< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >cf_cycles< / span><span class = "o" >.< / span><span class = "n" >head< / span><span class = "p" >(< / span><span class = "mi" > 10 < / span><span class = "p" >))< / span> |
1 2 3 | <span class = "n" >fig< / span> <span class = "o" > = < / span> <span class = "n" >plt< / span><span class = "o" >.< / span><span class = "n" >figure< / span><span class = "p" >(< / span><span class = "n" >figsize< / span><span class = "o" > = < / span><span class = "p" >(< / span><span class = "mi" > 14 < / span><span class = "p" >,< / span><span class = "mi" > 10 < / span><span class = "p" >))< / span> <span class = "n" >ax< / span> <span class = "o" > = < / span> <span class = "n" >fig< / span><span class = "o" >.< / span><span class = "n" >add_subplot< / span><span class = "p" >(< / span><span class = "mi" > 111 < / span><span class = "p" >)< / span> <span class = "n" >cf_cycles< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >ax< / span><span class = "o" > = < / span><span class = "n" >ax< / span><span class = "p" >,< / span> <span class = "n" >style< / span><span class = "o" > = < / span><span class = "p" >[< / span><span class = "s" > 'r--' < / span><span class = "p" >,< / span><span class = "s" > 'b-' < / span><span class = "p" >]);< / span> |
Filtering assumes a priori that business cycles exist. Due to this assumption, many macroeconomic models seek to create models that match the shape of impulse response functions rather than replicating properties of filtered series. See VAR notebook.
Please login to continue.