Files
QuanTAlib/lib/channels/apz/apz.md
T
Miha Kralj 4ab3a7fb53 doc headers
2026-02-27 07:48:12 -08:00

7.2 KiB
Raw Blame History

APZ: Adaptive Price Zone

Property Value
Category Channel
Inputs OHLCV bar (TBar)
Parameters period, multiplier (default 2.0)
Outputs Multiple series (Upper, Lower)
Output range Tracks input
Warmup period bars

TL;DR

  • APZ constructs a volatility-adaptive envelope using double-smoothed exponential moving averages with an aggressive smoothing factor derived from $...
  • Parameterized by period, multiplier (default 2.0).
  • Output range: Tracks input.
  • Requires period bars of warmup before first valid output (IsHot = true).
  • Validated against TA-Lib, Skender, and Tulip reference implementations where available.

APZ constructs a volatility-adaptive envelope using double-smoothed exponential moving averages with an aggressive smoothing factor derived from \sqrt{\text{period}}, making it significantly faster than standard EMA-based channels. The center line is a double-EMA of price; the band width is a double-EMA of the high-low range, scaled by a multiplier. Designed specifically for mean-reversion trading in non-trending markets, APZ identifies overbought/oversold extremes where price is likely to reverse rather than continue. A closing price outside the zone signals an immediate overshoot, not a breakout.

Historical Context

Lee Leibfarth created the Adaptive Price Zone and published it in Technical Analysis of Stocks & Commodities (September 2006) under the article "Trading With An Adaptive Price Zone." Leibfarth recognized that most indicators fail in choppy, range-bound markets: trend followers get whipsawed, and oscillators saturate at extremes. APZ fills this gap by adapting its bandwidth dynamically to statistical noise, allowing traders to fade extremes in consolidation phases.

The critical design decision is the square-root smoothing factor: \alpha = 2 / (\sqrt{P} + 1). For a period of 20, \sqrt{20} \approx 4.47, producing \alpha \approx 0.365, which behaves like an EMA of period $\sim$3.5. This makes APZ extremely responsive compared to a standard 20-period EMA (\alpha = 0.095). The double-smoothing (EMA of EMA) adds some lag back, but the net result is still far faster than conventional approaches. The compound warmup compensator e = \beta^{2t} (where \beta = 1 - \alpha) ensures accurate values from bar 1 without the typical EMA initialization bias.

Architecture & Physics

1. Aggressive Smoothing Factor

\alpha = \frac{2}{\sqrt{P} + 1}, \quad \beta = 1 - \alpha

2. Center Line (Double-Smoothed EMA of Price)

First EMA:

\text{EMA1}_t = \alpha \cdot x_t + \beta \cdot \text{EMA1}_{t-1}

Second EMA (double-smoothing):

\text{Center}_t = \alpha \cdot \text{EMA1}_t + \beta \cdot \text{Center}_{t-1}

3. Adaptive Range (Double-Smoothed EMA of High-Low)

R_t = H_t - L_t \text{EMA1R}_t = \alpha \cdot R_t + \beta \cdot \text{EMA1R}_{t-1} \text{SmoothRange}_t = \alpha \cdot \text{EMA1R}_t + \beta \cdot \text{SmoothRange}_{t-1}

4. Band Construction

\text{Width}_t = F \cdot \text{SmoothRange}_t \text{Upper}_t = \text{Center}_t + \text{Width}_t \text{Lower}_t = \text{Center}_t - \text{Width}_t

5. Warmup Compensation

To eliminate EMA initialization bias, a compound compensator tracks the accumulated decay:

e_t = \beta^2 \cdot e_{t-1}, \quad e_0 = 1

During warmup (e > 10^{-10}):

\text{Center}_t^* = \frac{\text{Center}_t}{1 - e_t}, \quad \text{SmoothRange}_t^* = \frac{\text{SmoothRange}_t}{1 - e_t}

6. Complexity

O(1) per bar: 4 EMA updates (2 for price, 2 for range), plus band arithmetic. The square root is computed once at initialization. No buffers required.

Mathematical Foundation

Parameters

Parameter Description Default Constraint
period Input period (P); \sqrt{P} used for smoothing 20 > 0
multiplier Band width factor (F) 2.0 > 0
source Input price series close

Effective EMA Period

The actual smoothing period experienced by the double-EMA is much shorter than the input period:

P_{\text{effective}} = \sqrt{P} \approx \frac{2}{\alpha} - 1

For P = 20: P_{\text{eff}} \approx 4.47. For P = 100: P_{\text{eff}} \approx 10.

Pseudo-code

function APZ(source, high, low, period, multiplier):
    validate: period > 0, multiplier > 0

    alpha = 2 / (√period + 1)
    beta = 1 - alpha

    // Double-smoothed EMA of price
    ema1_price = alpha * source + beta * ema1_price
    center     = alpha * ema1_price + beta * center

    // Double-smoothed EMA of range
    range      = high - low
    ema1_range = alpha * range + beta * ema1_range
    smooth_range = alpha * ema1_range + beta * smooth_range

    // Warmup compensator
    e *= beta²
    if e > 1e-10:
        compensator = 1 / (1 - e)
        center *= compensator
        smooth_range *= compensator

    // Bands
    width = multiplier * smooth_range
    upper = center + width
    lower = center - width

    return [center, upper, lower]

Output Interpretation

Output Description
center Double-smoothed EMA of price (fast center line)
upper Center + scaled adaptive range (overbought zone)
lower Center - scaled adaptive range (oversold zone)

Performance Profile

Operation Count (Streaming Mode)

APZ runs four EMA updates (double-smoothed price + double-smoothed range) plus warmup compensation and band arithmetic:

Operation Count Cost (cycles) Subtotal
SUB (H - L for range) 1 1 1
FMA (EMA1 price) 1 4 4
FMA (EMA2 price → center) 1 4 4
FMA (EMA1 range) 1 4 4
FMA (EMA2 range → smoothRange) 1 4 4
MUL (multiplier × smoothRange) 1 3 3
ADD/SUB (center ± width) 2 1 2
Total (hot) 8 ~22 cycles

During warmup (compensator active):

Operation Count Cost (cycles) Subtotal
MUL (e × β²) 1 3 3
SUB (1 - e) 1 1 1
DIV (center / compensator) 1 15 15
DIV (smoothRange / compensator) 1 15 15
CMP (e > threshold) 1 1 1
Warmup overhead 5 ~35 cycles

Total during warmup: ~57 cycles/bar; Post-warmup: ~22 cycles/bar.

Batch Mode (SIMD Analysis)

All four EMA recursions are state-dependent, preventing SIMD parallelization across bars:

Optimization Benefit
FMA instructions 4 hardware FMAs per bar; no software emulation
State locality 4 EMA states + compensator fit in registers
Band arithmetic Vectorizable in a post-pass across output arrays

Resources

  • Leibfarth, L. "Trading With An Adaptive Price Zone." Technical Analysis of Stocks & Commodities, September 2006. (Original APZ specification)
  • Mulloy, P. "Smoothing Data with Less Lag." Technical Analysis of Stocks & Commodities, February 1994. (Double-smoothed EMA theory)