5.6 KiB
HT_DCPERIOD: Ehlers Hilbert Transform Dominant Cycle Period
The Hilbert Transform extracts the dominant cycle period by converting price into an analytic signal and measuring its phase rate.
| Property | Value |
|---|---|
| Category | Cycle |
| Inputs | Source (close) |
| Parameters | None |
| Outputs | Single series (HT_DCPERIOD) |
| Output range | Varies (see docs) |
| Warmup | LOOKBACK bars |
| PineScript | ht_dcperiod.pine |
- HT_DCPERIOD estimates the period of the dominant market cycle using Ehlers' Hilbert Transform cascade.
- No configurable parameters; computation is stateless per bar.
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
HT_DCPERIOD estimates the period of the dominant market cycle using Ehlers' Hilbert Transform cascade. The algorithm extracts In-Phase and Quadrature components from price, computes instantaneous phase via homodyne discrimination, and derives the period from the phase rate of change. Output is a continuously varying period (typically 6-50 bars) compatible with TA-Lib's HT_DCPERIOD function. The indicator enables dynamic tuning of other indicators to the market's actual rhythm rather than fixed-parameter assumptions.
Historical Context
John Ehlers introduced the Hilbert Transform Dominant Cycle Period in Rocket Science for Traders (2001) to overcome the fundamental limitation of fixed-period technical indicators. Markets cycle at variable rates, yet traditional indicators like RSI-14 or SMA-20 assume constant periodicity. HT_DCPERIOD measures the actual cycle length present in price data, enabling adaptive parameter selection. The TA-Lib implementation codified specific Hilbert Transform coefficients (A = 0.0962, B = 0.5769) and smoothing algorithms that became the de facto standard. QuanTAlib matches the TA-Lib implementation within floating-point tolerance, including the 32-bar lookback convention.
Architecture & Physics
1. WMA Price Smoothing
A 4-bar weighted moving average removes Nyquist-frequency noise:
SmoothPrice_t = \frac{4P_t + 3P_{t-1} + 2P_{t-2} + P_{t-3}}{10}
2. Hilbert Transform FIR
The discrete Hilbert approximation generates the detrender and quadrature components using coefficients A = 0.0962 and B = 0.5769. The detrender, Q_1, and Hilbert transforms of I_1 and Q_1 (jI, jQ) are all computed with the same 4-tap FIR structure.
3. Phasor Components
I_{2,t} = I_{1,t} - jQ_t, \qquad Q_{2,t} = Q_{1,t} + jI_t
Both smoothed with EMA (\alpha = 0.2).
4. Homodyne Period Extraction
Re_t = 0.2(I_{2,t} \cdot I_{2,t-1} + Q_{2,t} \cdot Q_{2,t-1}) + 0.8 \cdot Re_{t-1}
Im_t = 0.2(I_{2,t} \cdot Q_{2,t-1} - Q_{2,t} \cdot I_{2,t-1}) + 0.8 \cdot Im_{t-1}
Period_{raw} = \frac{2\pi}{\arctan(Im_t / Re_t)}
5. Period Smoothing
Clamped to [6, 50] bars, then smoothed:
Period_t = 0.33 \cdot Period_{raw} + 0.67 \cdot Period_{t-1}
6. Complexity
O(1) per bar. Fixed Hilbert cascade with circular buffers totaling approximately 1.2 KB per instance. Warmup: 32 bars (TA-Lib lookback).
Mathematical Foundation
Parameters
| Parameter | Description | Default | Constraint |
|---|---|---|---|
| (none) | No user-configurable parameters |
The period range [6, 50] and all smoothing constants are fixed by the TA-Lib specification.
Output Interpretation
| Output | Meaning |
|---|---|
period $\approx 6$-15 |
Short-cycle market; fast oscillator settings appropriate |
period $\approx 15$-30 |
Medium-cycle; standard indicator periods work |
period $\approx 30$-50 |
Long-cycle or trending; period drifting toward upper bound suggests trend |
| Stable value | Regular cyclical market, ideal for oscillator-based strategies |
Performance Profile
Operation Count (Streaming Mode)
| Operation | Count per bar | Notes |
|---|---|---|
| 4-bar WMA | ~5 | 3 MUL + 1 ADD + 1 MUL(×0.1) |
| Hilbert FIR (detrender) | ~7 | 4-tap FIR with period-adaptive coefficients |
| Hilbert FIR (Q1) | ~7 | Same structure applied to detrender buffer |
| Hilbert FIR (jI) | ~7 | Applied to I1 history buffer |
| Hilbert FIR (jQ) | ~7 | Applied to Q1 history buffer |
| Phasor EMA (I2, Q2) | ~8 | 2 SUB/ADD + 4 FMA |
| Homodyne mixing + EMA | ~12 | 4 MUL + 2 ADD/SUB + 2 FMA |
| ATAN | ~15 | Math.Atan transcendental |
| Period division (2π/θ) | ~2 | 1 DIV |
| Clamp + EMA smoothing | ~4 | 2 comparisons + 1 FMA |
| Buffer management | ~10 | 4 circular buffer writes + index arithmetic |
| Total | ~84 | O(1) fixed; identical pipeline to HOMOD |
Batch Mode (SIMD Analysis)
| Aspect | Assessment |
|---|---|
| SIMD vectorizable | No: full Hilbert cascade is sequentially dependent IIR chain |
| Bottleneck | Math.Atan transcendental + 4 Hilbert FIR passes per bar |
| Parallelism | None: each bar's phasor depends on previous bar's EMA state |
| Memory | O(1): 4 circular buffers (7 elements each) + 6 scalar EMA states (~280 bytes) |
| Throughput | Moderate; ~3× slower than simple EMA; matches HOMOD performance |
Resources
- Ehlers, J.F. Rocket Science for Traders. Wiley, 2001.
- TA-Lib
TA_HT_DCPERIOD()reference implementation. - Ehlers, J.F. Cybernetic Analysis for Stocks and Futures. Wiley, 2004.