Files

115 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HT_DCPHASE: Ehlers Hilbert Transform Dominant Cycle Phase
> *Dominant cycle phase tracks where price sits within its current cycle — the angular position of the market's heartbeat.*
| Property | Value |
| ---------------- | -------------------------------- |
| **Category** | Cycle |
| **Inputs** | Source (close) |
| **Parameters** | None |
| **Outputs** | Single series (HT_DCPHASE) |
| **Output range** | Varies (see docs) |
| **Warmup** | `LOOKBACK` bars |
| **PineScript** | [ht_dcphase.pine](ht_dcphase.pine) |
- HT_DCPHASE measures the instantaneous phase angle 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_DCPHASE measures the instantaneous phase angle of the dominant market cycle using Ehlers' Hilbert Transform cascade. The output ranges from $-45°$ to $315°$, with phase discontinuities at cycle completions marking the transition from one cycle to the next. Compatible with TA-Lib's `HT_DCPHASE` function, the indicator enables cycle-position timing for entries and exits based on where price currently sits within the dominant cycle.
## Historical Context
John Ehlers developed the Hilbert Transform cycle indicators in *Rocket Science for Traders* (2001) as extensions of David Hilbert's 1905 mathematical transform to financial data. While HT_DCPERIOD measures *how long* a cycle takes, HT_DCPHASE measures *where within the cycle* the market currently sits. This distinction matters for timing: a 20-bar cycle at phase 0° (bottom) has different implications than the same cycle at phase 180° (top). The TA-Lib implementation uses a DFT-like accumulation over the smoothed period to compute the DC phase from smoothed price history, requiring 63 bars of lookback for stable output. QuanTAlib matches TA-Lib within floating-point tolerance.
## Architecture & Physics
### 1. Hilbert Transform Cascade
Identical pipeline to HT_DCPERIOD: 4-bar WMA smoothing, Hilbert FIR detrender with coefficients $A = 0.0962$, $B = 0.5769$, phasor component extraction ($I_2$, $Q_2$), and homodyne period estimation.
### 2. Smoothed Period
The dominant cycle period from the homodyne discriminator, clamped to $[6, 50]$ and EMA-smoothed ($\alpha = 0.33$).
### 3. DC Phase via DFT Accumulation
Over the smoothed period $P$, accumulate weighted contributions from the price history:
$$RealPart = \sum_{i=0}^{P-1} \sin\!\left(\frac{2\pi i}{P}\right) \cdot SmoothPrice_{t-i}$$
$$ImagPart = \sum_{i=0}^{P-1} \cos\!\left(\frac{2\pi i}{P}\right) \cdot SmoothPrice_{t-i}$$
$$DCPhase_{raw} = \arctan\!\left(\frac{RealPart}{ImagPart}\right) \cdot \frac{180°}{\pi}$$
### 4. Phase Adjustment
If $ImagPart > 0$: $DCPhase \mathrel{-}= 180°$
Final unwrapping: $DCPhase \mathrel{+}= 90°$, then if $DCPhase < -45°$: $DCPhase \mathrel{+}= 360°$.
Result is wrapped to $[-45°, 315°]$.
### 5. Complexity
$O(P)$ per bar where $P$ is the smoothed period (typically 6-50), due to the DFT accumulation loop over the price history. Memory is approximately 1.2 KB per instance for circular buffers and state. Warmup: 63 bars (TA-Lib lookback).
## Mathematical Foundation
### Parameters
| Parameter | Description | Default | Constraint |
|-----------|-------------|---------|------------|
| (none) | No user-configurable parameters | | |
All internal constants are fixed by the TA-Lib specification.
### Phase Quadrant Interpretation
| Phase Range | Cycle Position |
|-------------|----------------|
| $-45°$ to $45°$ | Bottom zone (start of uptrend) |
| $45°$ to $135°$ | Rising phase (mid-uptrend) |
| $135°$ to $225°$ | Top zone (start of downtrend) |
| $225°$ to $315°$ | Falling phase (mid-downtrend) |
| $315°$ to $-45°$ jump | Cycle completion (discontinuity) |
### Output Interpretation
| Condition | Meaning |
|-----------|---------|
| Phase advancing steadily | Regular cyclical market |
| Phase stuck or slow | Trending market (cycle suppressed) |
| Rapid phase change | Potential reversal imminent |
| Discontinuity ($315° \to -45°$) | One cycle complete, new cycle begins |
## Performance Profile
### Operation Count (Streaming Mode)
| Operation | Count per bar | Notes |
|-----------|--------------|-------|
| Hilbert cascade (WMA + 4×FIR + phasor + homodyne) | ~84 | Same as HT_DCPERIOD pipeline |
| DFT sin/cos evaluation | 2P | `Math.Sin` + `Math.Cos` per iteration (~15-20 cycles each) |
| DFT multiply-accumulate | 2P | realPart/imagPart FMA per iteration |
| ATAN phase extraction | ~15 | `Math.Atan` transcendental |
| Phase adjustment + wrapping | ~5 | 2 ADD + 2 comparisons + 1 conditional ADD |
| **Total (P=20 typical)** | **~184** | **O(P) dominated by DFT sin/cos loop** |
| **Total (P=50 worst case)** | **~384** | **Upper bound when period near maximum** |
### Batch Mode (SIMD Analysis)
| Aspect | Assessment |
|--------|------------|
| SIMD vectorizable | Partially: DFT inner loop sin/cos accumulation is vectorizable with precomputed twiddle factors |
| Bottleneck | DFT loop: P transcendental calls per bar; Hilbert cascade is sequential |
| Parallelism | DFT accumulation independent per frequency bin; `Vector<double>` applicable to sin/cos MACs |
| Memory | O(P): ~50-element smooth price circular buffer + Hilbert state (~1.2 KB) |
| Throughput | ~2-4× slower than O(1) Hilbert-only indicators (HOMOD, HT_DCPERIOD) due to variable-length DFT |
## Resources
- **Ehlers, J.F.** *Rocket Science for Traders*. Wiley, 2001.
- **TA-Lib** `TA_HT_DCPHASE()` reference implementation.
- **Ehlers, J.F.** *Cybernetic Analysis for Stocks and Futures*. Wiley, 2004.
- **Hilbert, D.** *Grundzüge einer allgemeinen Theorie der linearen Integralgleichungen*. Teubner, 1912.