Systemicalpha

Percentage Volume Oscillator

systemic:core-pvoIndicatorsfunction1 cr

Inputs

NameTypeDescription
Slow WindowintegerThe period for the slow Exponential Moving Average (EMA) of volume.
Fast WindowintegerThe period for the fast Exponential Moving Average (EMA) of volume.
Signal WindowintegerThe period for the signal line EMA, calculated from the PVO values.
VolumefloatarrayThe trading volume data for each period.

Outputs

NameTypeDescription
PVOfloatarrayThe percentage difference between fast and slow volume EMAs.
SignalfloatarrayAn EMA of the PVO line, used for crossover signals.
HistogramfloatarrayThe difference between the PVO line and the Signal line.

Volume: The Market's Conviction

Every price move carries a message, but volume reveals how many voices are behind it. A stock can rise 5% on 100,000 shares or 10 million shares — the price change is identical, but the conviction behind each move is radically different.

The core insight: Price tells you what is happening. Volume tells you who cares.

The Percentage Volume Oscillator (PVO) quantifies this by measuring whether current trading volume is above or below its recent average, expressed as a percentage. It's the MACD of volume — applying the same dual-EMA concept to volume instead of price.

PVO=EMAfast(Volume)−EMAslow(Volume)EMAslow(Volume)×100\text{PVO} = \frac{\text{EMA}_{\text{fast}}(\text{Volume}) - \text{EMA}_{\text{slow}}(\text{Volume})}{\text{EMA}_{\text{slow}}(\text{Volume})} \times 100

Why Percentage?

Volume varies wildly between assets. Apple might trade 50 million shares daily while a small-cap trades 50,000. A raw volume oscillator can't compare them. But if Apple's current volume is 20% above its average and the small-cap is also 20% above its average, both are experiencing the same relative surge in activity.

This percentage normalization is what makes PVO powerful for:

  • Comparing volume momentum across different assets
  • Building cross-market volume-based screening systems
  • Identifying which assets are seeing unusual participation

How It Works

flowchart TD
    subgraph Input["Volume Data"]
        V["Trading Volume"]
    end
    
    subgraph EMAs["Volume Moving Averages"]
        F["Fast EMA (12 periods)"]
        S["Slow EMA (26 periods)"]
    end
    
    subgraph Calc["PVO Calculation"]
        D["(Fast - Slow) / Slow × 100"]
    end
    
    subgraph Signal["Signal Components"]
        SL["Signal Line (9-period EMA)"]
        H["Histogram = PVO - Signal"]
    end
    
    V --> F & S
    F & S --> D
    D --> SL
    D & SL --> H

Interpreting PVO Values

PVO ValueWhat It Means
> 0Recent volume is above its longer-term average — heightened activity
< 0Recent volume is below average — quiet period
RisingVolume momentum is increasing
FallingVolume momentum is decreasing
Extreme positivePotential climax — everyone is piling in
Extreme negativeDisinterest — no one is paying attention

The Three Outputs

1. PVO Line

The percentage difference between fast and slow volume EMAs.

2. Signal Line

A 9-period EMA of the PVO, used for crossover signals.

3. Histogram

The difference between PVO and Signal — shows whether volume momentum is accelerating or decelerating.

Histogram BehaviorInterpretation
Growing positiveVolume momentum accelerating up
Shrinking positiveVolume momentum decelerating
Growing negativeVolume momentum accelerating down
Shrinking negativeVolume momentum recovering

Missing Data

Both EMAs run over observed bars only and are reindexed back to the full input grid:

  • Closed-market gaps (e.g. weekends) stay gaps, and bridge. A missing volume slot produces None on all three outputs — never a carried-forward (stale) PVO value, and a missing bar is never treated as zero volume: it is excluded from the EMAs entirely rather than pulling them toward zero.
  • Warm-up is None, never 0.0. The first window_slow − 1 observed bars are honestly undetermined for the PVO line; the Signal line needs window_signal further valid PVO readings on top of that before it settles.
  • A zero slow EMA has no percentage base. PVO divides by the slow EMA; on the rare bar where that EMA is exactly 0 (e.g. a genuine zero-volume bar), the ratio is undefined and all three outputs go None at that slot — never a fabricated 0.0 or an unbounded spike.
  • Live mode. PVO returns exactly one value per output for a live request: the most recent slot's reading, or None if that slot is a closed-market gap or still inside warm-up.

Volume-Price Confirmation

This is where PVO shines. Volume should confirm price:

Price MoveVolume (PVO)Verdict
Rally + PVO risingStrong uptrend — buyers committed
Rally + PVO fallingWeak rally — buyers retreating
Decline + PVO risingStrong downtrend — sellers aggressive
Decline + PVO fallingWeak decline — sellers exhausted

The most dangerous scenario for bulls: price making new highs while PVO makes lower highs. This bearish divergence suggests the rally is running on fumes.


Trading Applications

1. Breakout Validation

Not all breakouts are created equal:

Breakout TypePVO StatusReliability
Price breaks resistancePVO > 0, risingHigh — volume supports the move
Price breaks resistancePVO < 0, fallingLow — may be a false breakout

2. Divergence Trading

DivergencePricePVOMeaning
BullishLower lowHigher lowSelling on declining volume — sellers exhausted
BearishHigher highLower highBuying on declining volume — buyers retreating

3. Volume Climax Detection

Extreme PVO readings often mark turning points:

  • Spike high: Everyone who wants to buy/sell has done so — exhaustion
  • Spike low: Complete disinterest — often precedes a quiet accumulation phase

Creative Applications

Quiet Before the Storm

Low PVO readings (extreme negative) often precede major moves. When volume contracts significantly, it suggests consolidation — energy building before the next directional move. Screeners that flag assets with PVO at multi-month lows can identify candidates for impending volatility.

Participation Shift Detection

Compare PVO readings between related assets. If one stock in a sector shows rising PVO while peers show falling PVO, capital may be rotating into that specific name. This works particularly well for:

  • ETF components vs the ETF itself
  • ADRs vs their home market listing
  • Crypto pairs on different exchanges

Volume-Adjusted Momentum

Combine PVO with a price oscillator (like PPO) for a two-dimensional view:

PPOPVOInterpretation
BullishRisingStrong momentum, high participation — go signal
BullishFallingWeak momentum — wait for volume confirmation
BearishRisingStrong selling — avoid or short
BearishFallingSelling pressure easing — watch for reversal

Parameters

ParameterDefaultPurpose
Fast Window12Short-term volume EMA
Slow Window26Long-term volume EMA
Signal Window9EMA of PVO for crossovers

These defaults match MACD conventions, allowing traders to apply familiar MACD strategies to volume.


When It Works, When It Struggles

Excels In:

  • Equity markets — Reliable volume data makes PVO highly effective
  • Breakout strategies — Confirming or rejecting price breakouts
  • Divergence detection — Early warning when participation wanes
  • Cross-asset comparison — Percentage basis enables apples-to-apples analysis

Struggles In:

  • Forex spot — No centralized volume; PVO is unreliable
  • Low-volume assets — Erratic readings in thinly traded securities
  • Holiday/pre-market periods — Distorted volume produces false signals
  • Index/ETF rebalancing days — Artificial volume spikes

Summary

AspectKey Point
Core insightVolume reveals conviction behind price moves
What it measuresPercentage difference between fast and slow volume EMAs
PVO > 0Recent volume above average
PVO < 0Recent volume below average
Best signalDivergence between price and volume
Best useConfirming or questioning price breakouts

Indicator Assessment

%%{init: {"quadrantChart": {"titleFontSize": 14}, "themeVariables": {"quadrant1Fill": "#e8f5e9", "quadrant2Fill": "#fff3e0", "quadrant3Fill": "#ffebee", "quadrant4Fill": "#e3f2fd"}}}%%
quadrantChart
    title Percentage Volume Oscillator Assessment
    x-axis Low Popularity --> High Popularity
    y-axis Low Reliability --> High Reliability
    quadrant-1 High potential  
    quadrant-2 Established
    quadrant-3 Niche
    quadrant-4 Widely used
    Stocks: [0.65, 0.70]
    Crypto: [0.45, 0.40]
DimensionStocksCryptoExplanation
Popularity6.5/104.5/10More established in equity markets; less known in crypto due to volume data concerns
Reliability7.0/104.0/10Excellent with reliable volume data; struggles in crypto where volume is fragmented across exchanges
Complexity4/104/10Simple EMA-based calculation, identical to MACD logic
Versatility6/103/10Best for equities with centralized volume; limited forex applicability, problematic for crypto
Recent Interest5/104/10Stable interest; volume analysis seeing modest revival with algorithmic trading

Key Insight: PVO's reliability is directly tied to volume data quality. In equity markets with centralized exchanges, it's highly effective. In cryptocurrency markets where volume is fragmented across hundreds of exchanges (and often reported inaccurately), PVO signals can be misleading. Consider aggregated volume feeds when applying to crypto.


Further Reading

Rendering diagrams...
© 2026 WanoLabs. All rights reservedAlpha build v0.1.5