Percentage Volume Oscillator
systemic:core-pvoIndicatorsfunction1 crInputs
| Name | Type | Description |
|---|---|---|
| Slow Window | integer | The period for the slow Exponential Moving Average (EMA) of volume. |
| Fast Window | integer | The period for the fast Exponential Moving Average (EMA) of volume. |
| Signal Window | integer | The period for the signal line EMA, calculated from the PVO values. |
| Volume | floatarray | The trading volume data for each period. |
Outputs
| Name | Type | Description |
|---|---|---|
| PVO | floatarray | The percentage difference between fast and slow volume EMAs. |
| Signal | floatarray | An EMA of the PVO line, used for crossover signals. |
| Histogram | floatarray | The 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.
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 Value | What It Means |
|---|---|
| > 0 | Recent volume is above its longer-term average — heightened activity |
| < 0 | Recent volume is below average — quiet period |
| Rising | Volume momentum is increasing |
| Falling | Volume momentum is decreasing |
| Extreme positive | Potential climax — everyone is piling in |
| Extreme negative | Disinterest — 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 Behavior | Interpretation |
|---|---|
| Growing positive | Volume momentum accelerating up |
| Shrinking positive | Volume momentum decelerating |
| Growing negative | Volume momentum accelerating down |
| Shrinking negative | Volume 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
Noneon 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, never0.0. The firstwindow_slow − 1observed bars are honestly undetermined for the PVO line; the Signal line needswindow_signalfurther 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 goNoneat that slot — never a fabricated0.0or an unbounded spike. - Live mode. PVO returns exactly one value per output for a live request: the most recent
slot's reading, or
Noneif 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 Move | Volume (PVO) | Verdict |
|---|---|---|
| Rally + PVO rising | Strong uptrend — buyers committed | |
| Rally + PVO falling | Weak rally — buyers retreating | |
| Decline + PVO rising | Strong downtrend — sellers aggressive | |
| Decline + PVO falling | Weak 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 Type | PVO Status | Reliability |
|---|---|---|
| Price breaks resistance | PVO > 0, rising | High — volume supports the move |
| Price breaks resistance | PVO < 0, falling | Low — may be a false breakout |
2. Divergence Trading
| Divergence | Price | PVO | Meaning |
|---|---|---|---|
| Bullish | Lower low | Higher low | Selling on declining volume — sellers exhausted |
| Bearish | Higher high | Lower high | Buying 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:
| PPO | PVO | Interpretation |
|---|---|---|
| Bullish | Rising | Strong momentum, high participation — go signal |
| Bullish | Falling | Weak momentum — wait for volume confirmation |
| Bearish | Rising | Strong selling — avoid or short |
| Bearish | Falling | Selling pressure easing — watch for reversal |
Parameters
| Parameter | Default | Purpose |
|---|---|---|
| Fast Window | 12 | Short-term volume EMA |
| Slow Window | 26 | Long-term volume EMA |
| Signal Window | 9 | EMA 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
| Aspect | Key Point |
|---|---|
| Core insight | Volume reveals conviction behind price moves |
| What it measures | Percentage difference between fast and slow volume EMAs |
| PVO > 0 | Recent volume above average |
| PVO < 0 | Recent volume below average |
| Best signal | Divergence between price and volume |
| Best use | Confirming 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]
| Dimension | Stocks | Crypto | Explanation |
|---|---|---|---|
| Popularity | 6.5/10 | 4.5/10 | More established in equity markets; less known in crypto due to volume data concerns |
| Reliability | 7.0/10 | 4.0/10 | Excellent with reliable volume data; struggles in crypto where volume is fragmented across exchanges |
| Complexity | 4/10 | 4/10 | Simple EMA-based calculation, identical to MACD logic |
| Versatility | 6/10 | 3/10 | Best for equities with centralized volume; limited forex applicability, problematic for crypto |
| Recent Interest | 5/10 | 4/10 | Stable 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.