Files
QuanTAlib/lib/volume/pvo/Pvo.md
T

7.9 KiB

PVO: Percentage Volume Oscillator

Volume precedes price—PVO measures whether the market is inhaling or exhaling.

Property Value
Category Volume
Inputs OHLCV bar (TBar)
Parameters fastPeriod (default 12), slowPeriod (default 26), signalPeriod (default 9)
Outputs Multiple series (Signal, Histogram)
Output range Unbounded
Warmup slowPeriod bars
PineScript pvo.pine
  • The Percentage Volume Oscillator (PVO) measures the difference between two exponential moving averages of volume, expressed as a percentage of the ...
  • Similar: PPO, VO | Complementary: Price oscillators | Trading note: Percentage Volume Oscillator; MACD concept applied to volume. Detects volume surges.
  • Validated against TA-Lib, Skender, and Tulip reference implementations where available.

The Percentage Volume Oscillator (PVO) measures the difference between two exponential moving averages of volume, expressed as a percentage of the slower EMA. Essentially the MACD of volume, PVO identifies whether volume is expanding (accumulation) or contracting (distribution) relative to its recent history. This percentage normalization makes it comparable across instruments with vastly different volume profiles.

Historical Context

PVO emerged as analysts sought to apply the successful MACD framework to volume analysis. While MACD identifies price momentum through the convergence and divergence of moving averages, PVO does the same for volume momentum. The percentage expression (rather than absolute difference) was a deliberate design choice—it allows meaningful comparison whether you're analyzing a penny stock averaging 50,000 shares daily or a mega-cap trading 50 million.

The indicator gained traction in the 1990s as electronic trading made volume data more accessible and reliable. Its three-component structure (PVO line, signal line, histogram) mirrors MACD, making it intuitive for traders already familiar with that framework.

Architecture & Physics

1. Volume Input

PVO operates purely on volume data:


V_t = Volume_t

Non-finite values are replaced with the last valid volume; negative volumes are clamped to zero.

2. Fast and Slow EMAs

Two EMAs of volume with compensated warmup:


\alpha_{fast} = \frac{2}{FastPeriod + 1}, \quad \alpha_{slow} = \frac{2}{SlowPeriod + 1}

EMA_{fast,t} = \alpha_{fast} \times V_t + (1 - \alpha_{fast}) \times EMA_{fast,t-1}

EMA_{slow,t} = \alpha_{slow} \times V_t + (1 - \alpha_{slow}) \times EMA_{slow,t-1}

3. EMA Compensation

During warmup, the exponential compensator corrects for initialization bias:


e_t = e_{t-1} \times (1 - \alpha)

CompensatedEMA_t = \frac{EMA_t}{1 - e_t}

Compensation ends when e < 1e-10.

4. PVO Line

The percentage difference between fast and slow EMAs:


PVO_t = \frac{FastEMA_t - SlowEMA_t}{SlowEMA_t} \times 100

When SlowEMA = 0, PVO returns 0 to avoid division by zero.

5. Signal Line

An EMA of the PVO line for smoothing:


Signal_t = EMA(PVO_t, SignalPeriod)

6. Histogram

The difference between PVO and its signal line:


Histogram_t = PVO_t - Signal_t

Mathematical Foundation

Percentage Normalization

The key insight is expressing the oscillator as a percentage:


PVO = \frac{Fast - Slow}{Slow} \times 100 = \left(\frac{Fast}{Slow} - 1\right) \times 100

This produces values centered around zero:

  • PVO > 0: Fast EMA > Slow EMA (volume expanding)
  • PVO < 0: Fast EMA < Slow EMA (volume contracting)
  • PVO = 0: Fast EMA = Slow EMA (volume stable)

FMA Optimization

Hot path calculations use fused multiply-add:


EMA_t = FMA(\alpha, V_t - EMA_{t-1}, EMA_{t-1})

Equivalent to alpha * (value - ema) + ema with better numerical precision.

Coordinated Warmup Tracking

The implementation tracks warmup using the slowest-decaying compensator:


\beta_{slowest} = \max(\beta_{fast}, \beta_{slow}, \beta_{signal})

e_{slowest,t} = e_{slowest,t-1} \times \beta_{slowest}

Warmup ends when e_slowest < 1e-10, ensuring all three EMAs have converged.

Performance Profile

Operation Count (Streaming Mode, Scalar)

Operation Count Cost (cycles) Subtotal
ADD/SUB 8 1 8
MUL 6 3 18
DIV 2 15 30
CMP 3 1 3
FMA 3 4 12
Total 22 ~71 cycles

Batch Mode (SIMD Considerations)

PVO's recursive EMA structure limits SIMD parallelization. The span-based Calculate method processes sequentially with FMA optimization. For 512 bars:

Mode Cycles/bar Total
Scalar streaming ~71 ~36,352
Scalar with FMA ~65 ~33,280

Quality Metrics

Metric Score Notes
Accuracy 9/10 EMA compensator eliminates warmup bias
Timeliness 7/10 Default 12/26/9 has ~15-bar effective lag
Overshoot 9/10 Percentage normalization bounds typical range
Smoothness 8/10 Signal line provides additional smoothing
Comparability 10/10 Percentage scale enables cross-instrument comparison

Validation

Library Status Notes
TA-Lib N/A Has PPO (price); no volume version
Skender N/A Has PPO (price); no volume version
Tulip Has pvo; formula should match
Ooples May have PVO; EMA warmup may differ

Common Pitfalls

  1. Warmup Period: Requires SlowPeriod bars for meaningful values. The EMA compensator mathematically corrects early bias, but initial signals warrant caution.

  2. Period Constraint: Fast period must be less than slow period (FastPeriod < SlowPeriod). The constructor throws ArgumentException if violated.

  3. Zero Volume Handling: Markets with extended periods of zero volume (pre-market, halted stocks) will produce zero PVO values. Negative volumes are clamped to zero.

  4. Scale Interpretation: Unlike price-based MACD, PVO values are percentages. A PVO of 10 means the fast EMA is 10% above the slow EMA—significant for volume but not comparable to MACD values.

  5. Signal Crossovers: The signal line lags PVO, so crossovers occur after the underlying momentum shift. The histogram turning positive/negative precedes the crossover.

  6. Memory Footprint: Per instance: ~160 bytes for state struct. Three output values (PVO, Signal, Histogram) per update.

Interpretation

  • PVO > 0: Volume expanding (short-term volume exceeds long-term average)
  • PVO < 0: Volume contracting (short-term volume below long-term average)
  • Rising PVO: Volume momentum increasing
  • Falling PVO: Volume momentum decreasing
  • Signal Line Crossover: Bullish when PVO crosses above signal; bearish when below
  • Histogram: Rate of change of PVO momentum; turning points precede crossovers
  • Divergences: Price making new highs with declining PVO suggests weakening conviction
Indicator Input Output Normalization
PVO Volume Percentage Yes (comparable across instruments)
PPO Price Percentage Yes
MACD Price Absolute No (scale varies by price)
OBV Volume + Price Cumulative No

References