mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-04 04:07:42 +00:00
136 lines
5.5 KiB
Markdown
136 lines
5.5 KiB
Markdown
# DECO: Ehlers Decycler Oscillator
|
||
|
||
> *Ehlers' decycler oscillator removes the trend and isolates residual oscillation — what remains when the drift is subtracted.*
|
||
|
||
| Property | Value |
|
||
| ---------------- | -------------------------------- |
|
||
| **Category** | Oscillator |
|
||
| **Inputs** | Source (close) |
|
||
| **Parameters** | `shortPeriod` (default 30), `longPeriod` (default 60) |
|
||
| **Outputs** | Single series (Deco) |
|
||
| **Output range** | $0$ to $1$ |
|
||
| **Warmup** | 1 bar |
|
||
| **PineScript** | [deco.pine](deco.pine) |
|
||
|
||
- The Decycler Oscillator (DECO) is a DSP-based oscillator developed by John F.
|
||
- **Similar:** [DPO](../dpo/Dpo.md), [Reflex](../reflex/Reflex.md) | **Complementary:** Cycle analysis | **Trading note:** Ehlers' Decycler Oscillator; removes trend to isolate cycle component for timing.
|
||
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
|
||
|
||
## Overview
|
||
|
||
The Decycler Oscillator (DECO) is a DSP-based oscillator developed by John F. Ehlers that isolates intermediate-frequency market cycles. It computes the difference between two 2-pole Butterworth high-pass filters with different cutoff periods, revealing the spectral band between the two cutoff frequencies.
|
||
|
||
## Origin
|
||
|
||
- **Author:** John F. Ehlers
|
||
- **Source:** "Decyclers", Technical Analysis of Stocks & Commodities, September 2015
|
||
- **Category:** Oscillator / Digital Signal Processing
|
||
|
||
## Formula
|
||
|
||
The DECO uses two 2-pole Butterworth high-pass filters:
|
||
|
||
```
|
||
α = (cos(0.707 × 2π/period) + sin(0.707 × 2π/period) - 1) / cos(0.707 × 2π/period)
|
||
HP[n] = (1 - α/2)² × (x[n] - 2×x[n-1] + x[n-2]) + 2×(1-α) × HP[n-1] - (1-α)² × HP[n-2]
|
||
|
||
DECO = HP_long - HP_short
|
||
```
|
||
|
||
The 0.707 factor (1/√2) places the filter response at the -3 dB Butterworth design point.
|
||
|
||
### Transfer Function
|
||
|
||
Each HP filter has the z-domain transfer function:
|
||
|
||
```
|
||
H(z) = (1-α/2)² × (1 - 2z⁻¹ + z⁻²) / (1 - 2(1-α)z⁻¹ + (1-α)²z⁻²)
|
||
```
|
||
|
||
The DECO output is the difference H_long(z) - H_short(z), which forms a bandpass response isolating cycles between the short and long cutoff periods.
|
||
|
||
## Parameters
|
||
|
||
| Parameter | Type | Default | Range | Description |
|
||
|-----------|------|---------|-------|-------------|
|
||
| shortPeriod | int | 30 | > 0 | Short HP cutoff period (bars) |
|
||
| longPeriod | int | 60 | > shortPeriod | Long HP cutoff period (bars) |
|
||
|
||
## Interpretation
|
||
|
||
The Decycler Oscillator provides several analytical perspectives:
|
||
|
||
- **Zero-Line Crossovers:**
|
||
- Crossing above zero indicates bullish cycle momentum
|
||
- Crossing below zero indicates bearish cycle momentum
|
||
- The zero-crossing timing is relatively lag-free
|
||
|
||
- **Band Isolation:**
|
||
- The oscillator extracts only cycles within the frequency band defined by the two cutoff periods
|
||
- Shorter cycles and longer trends are both rejected
|
||
- This makes the oscillator highly selective
|
||
|
||
- **Divergence Analysis:**
|
||
- Bullish divergence: price makes lower lows while DECO makes higher lows
|
||
- Bearish divergence: price makes higher highs while DECO makes lower highs
|
||
- Indicates potential trend reversal
|
||
|
||
- **Multiple Instance Analysis:**
|
||
- Ehlers recommends using multiple DECO instances with different period pairs
|
||
- Crossovers between instances with different coefficients can identify trend reversals
|
||
|
||
## Warmup Period
|
||
|
||
The indicator requires `longPeriod` bars before producing reliable output. The first two bars always output zero (insufficient price history for the 2-pole HP filter).
|
||
|
||
## Properties
|
||
|
||
- **Range:** Unbounded (oscillates around zero)
|
||
- **Complexity:** O(1) per bar (pure IIR filter, no lookback buffer needed)
|
||
- **Memory:** O(1) — only stores filter state variables
|
||
|
||
## Related Indicators
|
||
|
||
- **Decycler (DECYCLER):** The low-pass complement — removes cycles, keeps trend
|
||
- **SSF-DSP:** Similar concept using Super Smooth Filters instead of HP filters
|
||
- **Roofing Filter:** HP + SSF combination for cycle isolation
|
||
- **BandPass Filter:** Ehlers' direct bandpass approach
|
||
|
||
## Performance Profile
|
||
|
||
### Operation Count (Streaming Mode)
|
||
|
||
DECO (Detrended Correlation Oscillator) subtracts a linear regression from price then computes correlation.
|
||
|
||
| Operation | Count | Cost (cycles) | Subtotal |
|
||
| :--- | :---: | :---: | :---: |
|
||
| Linear regression (O(N) or O(1) with prefix sums) | ~4 | 1 | 4 |
|
||
| SUB (detrend: price − regression) | 1 | 1 | 1 |
|
||
| Correlation pipeline (see CTI) | ~22 | 7 | 156 |
|
||
| **Total** | **~27** | — | **~161 cycles** |
|
||
|
||
Dominated by the correlation computation. ~161 cycles per bar.
|
||
|
||
### Batch Mode (SIMD Analysis)
|
||
|
||
| Operation | Vectorizable? | Notes |
|
||
| :--- | :---: | :--- |
|
||
| Linear regression | Yes | Prefix-sum dot products; VFMADD |
|
||
| Detrend subtraction | Yes | VSUBPD |
|
||
| Correlation | Yes | See CTI batch analysis |
|
||
|
||
Fully vectorizable in batch. Regression and correlation both benefit from AVX2 VFMADD chains.
|
||
|
||
### Quality Metrics
|
||
|
||
| Metric | Score | Notes |
|
||
| :--- | :---: | :--- |
|
||
| **Accuracy** | 9/10 | Exact linear detrend + Pearson r |
|
||
| **Timeliness** | 5/10 | Two N-bar windows compound lag |
|
||
| **Smoothness** | 8/10 | Detrending removes linear drift; correlation bounded |
|
||
| **Noise Rejection** | 8/10 | Linear detrend + correlation is doubly robust to trend contamination |
|
||
|
||
## References
|
||
|
||
1. Ehlers, J. F. (2015). "Decyclers." *Technical Analysis of Stocks & Commodities*, September 2015.
|
||
2. Ehlers, J. F. (2013). *Cycle Analytics for Traders*. Wiley. Chapter 4. |