[T,C,CutOff,Lambda] = hpf(X)
[T,C,CutOff,Lambda] = hpf(X,Range,...)
[C,T,CutOff,Lambda] = hpf2(X)
[C,T,CutOff,Lambda] = hpf2(X,Range,...)
X
[ tseries ] - Input tseries object that will be filtered.
Range
[ numeric ] - Date Range on which the input data will be filtered; Range
can be Inf
, [startdata,Inf]
, or [-Inf,enddate]
; if not specifired, Inf
(i.e. the entire available Range of the input series) is used.
T
[ tseries ] - Low-frequency (trend) component.
C
[ tseries ] - High-frequency (cyclical or gap) component.
CutOff
[ numeric ] - Cut-off periodicity; periodicities above the cut-off are attributed to trends, periodicities below the cut-off are attributed to gaps.
Lambda
[ numeric ] - Smoothing parameter actually used; this output argument is useful when the option 'cutoff='
is used instead of 'lambda='
.
'cutoff='
[ numeric | empty ] - Cut-off periodicity in periods (depending on the time series frequency); this option can be specified instead of 'lambda='
; the smoothing parameter will be then determined based on the cut-off periodicity.
'cutoffYear='
[ numeric | empty ] - Cut-off periodicity in years; this option can be specified instead of 'lambda='
; the smoothing parameter will be then determined based on the cut-off periodicity.
'gamma='
[ numeric | tseries | 1 ] - Weight or weights on the deviations of the trend from observations; it only makes sense to use this option to make the signal-to-noise ratio time-varying; see the optimisation problem below.
'infoSet='
[ 1
| 2
] - Information set assumption used in the filter: 1
runs a one-sided filter, 2
runs a two-sided filter.
'lambda='
[ numeric | @auto
] - Smoothing parameter; needs to be specified for tseries objects with indeterminate frequency. See Description for default values.
'level='
[ tseries ] - Time series with hard tunes and soft tunes on the level of the trend.
'change='
[ tseries ] - Time series with hard tunes and soft tunes on the change in the trend.
'log='
[ true
| false
] - Logarithmise the data before filtering, de-logarithmise afterwards.
The function hpf
solves a constrained optimisation problem described by the following Lagrangian
$$\min_{\bar y_t, \omega_t, \sigma_t} \underbrace{ \tsum \lambda \left( \Delta \bar y_t - \Delta \bar y_{t-1} \right)^2 + \tsum \gamma_t \left( \bar y_t - y_t \right)^2}_\text{Plain HP with time-varying signal-to-noise ratio} + \cdots$$ $$\cdots + \underbrace{\tsum u_t \left( \bar y_t - a_t \right)^2}_\text{Soft level tunes} + \underbrace{\tsum v_t \left( \Delta \bar y_t - b_t \right)^2}_\text{Soft growth tunes} + \underbrace{\tsum \omega_t \left( \bar y_t - c_t \right)}_\text{Hard level tunes} + \underbrace{\tsum \sigma_t \left( \Delta \bar y_t - d_t \right)}_\text{Hard growth tunes},$$
where
'gamma='
;'level='
;'growth='
;'level='
;'growth='
;Each of the summations in the above Lagrangian goes over those periods in which the respective bracketed terms are defined (observations or tunes exist). You can combine any number of any tunes in one run of hpf
, including out-of-sample tunes (see below).
The hard tunes and soft tunes on the level of the trend are entered as time series through the option 'level='
.
The hard tunes and soft tunes on the change in the trend are entered as time series through the option 'change='
.
In the tseries objects entered through 'level='
and/or 'change='
, you can combine any number of hard and soft tune. In each particular period, you can obviously specify only a hard tune or only a soft tune. You can think of hard tunes as a special case of soft tunes with infinitely large weights.
A hard tune is specified as a plain real number (i.e. a number with a zero complex part).
A soft tune must be entered as a complex number whose real part specifies the tune itself, and the imaginary part specifies the inverse of the weight, i.e. $1/v_t$ or $1/u_t$, on that tune in that period. Note that if the weight goes to infinity, the imaginary part becomes zero and the tune becomes a hard tune.
Tunes can be imposed also at dates before the first observation of the input series, or after the last observation. In other words, the time series in 'level='
and/or 'growth='
can have a more extended Range (at either side) than the filtered input series.
If the user does not specify the smoothing parameter using the 'lambda='
option (or reassigns the default @auto
), a default value is used. The default value is based on common practice and can be calculated using the date frequency of the input time series as $\lambda = 100 \cdot f^2$, where $f$ is the frequency (yearly=1, half-yearly=2, quarterly=4, bi-monthly=6, monthly=12). This gives the following default values:
Note that there is no default value for data with indeterminate or daily frequency: for these types of time series, you must always use the option `'lambda=''.