Volume Price Trend
systemic:core-vptIndicatorsfunction1 crInputs
| Name | Type | Description |
|---|---|---|
| Smoothing Factor | integer | The number of periods to use when applying a moving average to the raw VPT output. This creates a smoother line that's easier to interpret and trade. |
| Price | floatarray | The closing price series for the asset you're analyzing. Each value should represent the final traded price at the end of each period (daily close, hourly close, etc.). |
| Volume | floatarray | The trading volume series corresponding to each price period. This represents the total number of shares, contracts, or tokens traded during each interval. |
Outputs
| Name | Type | Description |
|---|---|---|
| VPT | floatarray | A time series of cumulative Volume Price Trend values, one for each input data point. |
The Volume Price Trend indicator measures the balance between a security's supply and demand by combining price movement with volume. Unlike simpler volume indicators, VPT weights each day's volume contribution by how much the price actually moved—giving you insight into whether large price swings are backed by conviction or whether small moves are hiding significant accumulation.
Developed as an evolution of On-Balance Volume (OBV), VPT answers a critical question: Is the money flowing into this asset proportional to the price movement, or is something else happening beneath the surface?
The Core Formula
Where:
- = Volume Price Trend at time
- = Previous VPT value (starts at 0)
- = Current period's volume
- = Current closing price
- = Previous closing price
The term is the percentage price change (or rate of change). This is the key innovation: volume is weighted proportionally to how much the price moved, not just whether it went up or down.
Worked Example: AAPL December 2025
Let's calculate VPT step-by-step using real Apple (AAPL) daily data:
| Date | Close ($) | Volume | Price Change (%) | Volume × Change | Cumulative VPT |
|---|---|---|---|---|---|
| Dec 22 | 270.97 | — | — | — | 0 (start) |
| Dec 23 | 272.36 | 29,641,999 | +0.513% | +152,063 | +152,063 |
| Dec 24 | 273.81 | 17,910,574 | +0.532% | +95,340 | +247,403 |
| Dec 26 | 273.40 | 21,521,802 | −0.150% | −32,227 | +215,176 |
Calculation for Dec 23:
Notice how the Dec 26 decline contributed a smaller negative value (−32K) despite higher volume than Dec 24, because the percentage drop (−0.15%) was smaller than Dec 24's gain (+0.53%). VPT captures this nuance that simple volume analysis misses.
Why VPT Beats OBV
On-Balance Volume (OBV) treats volume as binary: if price goes up, add all volume; if price goes down, subtract all volume. This creates a problem:
flowchart LR
subgraph OBV["OBV Logic"]
direction TB
O1["Price up $0.01?<br/>Add ALL volume"]
O2["Price down $0.01?<br/>Subtract ALL volume"]
end
subgraph VPT["VPT Logic"]
direction TB
V1["Price up 0.01%?<br/>Add 0.01% of volume"]
V2["Price up 5%?<br/>Add 5% of volume"]
end
O1 ~~~ V1
O2 ~~~ V2
Example: If a stock rises 5.00 on 10 million shares:
- OBV treats both days identically (+10M each)
- VPT correctly assigns far more weight to the $5 move
This proportional weighting makes VPT more sensitive to the conviction behind price moves.
Reading the VPT Line
The absolute value of VPT is less important than its direction and relationship to price:
Trend Confirmation
flowchart TD
subgraph Confirmed["✓ Trend Confirmed"]
C1["Price ↑ + VPT ↑<br/>Strong uptrend"]
C2["Price ↓ + VPT ↓<br/>Strong downtrend"]
end
subgraph Warning["⚠ Warning Signs"]
W1["Price ↑ + VPT →/↓<br/>Rally lacks volume support"]
W2["Price ↓ + VPT →/↑<br/>Decline lacks selling pressure"]
end
When price and VPT move together, the trend has volume conviction. When they diverge, pay attention.
Divergence: The Reversal Signal
Divergence between price and VPT often precedes trend reversals:
| Divergence Type | Price Action | VPT Action | Signal |
|---|---|---|---|
| Bullish | Making lower lows | Making higher lows | Selling exhaustion → potential reversal up |
| Bearish | Making higher highs | Making lower highs | Buying exhaustion → potential reversal down |
Why this works: If price makes a new low but VPT doesn't, it means the new low occurred on less volume-weighted selling than before. The bears are losing conviction.
Signal Line Strategy
A powerful technique is applying a moving average to VPT itself, creating a signal line:
- VPT crosses above its MA: Positive money flow accelerating → bullish signal
- VPT crosses below its MA: Negative money flow accelerating → bearish signal
This approach smooths out noise and provides clearer entry/exit signals. The Smoothing Factor input in this module applies this technique.
Combining VPT with Other Indicators
VPT works best as confirmation rather than a standalone signal:
| Pair With | Purpose |
|---|---|
| ADX (Average Directional Index) | Confirm trend strength. ADX > 25 + rising VPT = strong trend |
| Moving Average Crossovers | Validate breakouts. 20-day crosses 50-day + VPT rising = confirmed |
| RSI | Filter divergences. RSI oversold + VPT bullish divergence = higher conviction |
The Smoothing Factor
This module includes an optional smoothing factor that applies a simple moving average to the raw VPT output.
Why smooth VPT?
- Raw VPT can be noisy, especially in volatile assets
- Smoothing reveals the underlying trend
- Creates clearer signal line crossover opportunities
Trade-off: Higher smoothing = smoother line but more lag. Lower smoothing = more responsive but noisier.
For most applications, a smoothing factor between 5-20 periods works well. Start with 10 and adjust based on your timeframe and asset volatility.
Practical Considerations
Cumulative Nature
VPT is cumulative—it has no upper or lower bound. This means:
- You cannot compare VPT values across different time periods directly
- Focus on direction and divergence, not absolute levels
- The starting point is arbitrary (typically 0)
Volume Data Quality
VPT is only as good as your volume data. Be cautious with:
- Cryptocurrencies: Exchange volume can be inflated or manipulated
- Thinly traded stocks: Low volume creates choppy VPT
- After-hours trading: May not be captured in some data feeds
Timeframe Selection
VPT's cumulative nature makes it more reliable on longer timeframes:
- Daily/weekly: Excellent for swing trading and position building
- Intraday: Can work but expect more noise; consider higher smoothing
Real-World Application: Accumulation Detection
One powerful use of VPT is detecting institutional accumulation or distribution before price confirms:
Scenario: A stock trades sideways for weeks, but VPT steadily climbs.
Interpretation: Despite flat price action, more volume is occurring on up-ticks than down-ticks, proportionally weighted. Someone is quietly accumulating—the sideways pattern may break upward.
This is particularly valuable in:
- Crypto markets during consolidation phases
- Stocks before earnings announcements
- Sector rotation detection
Limitations
- Lagging indicator: Based on completed price bars; won't predict the first move
- No overbought/oversold levels: Unlike RSI, VPT doesn't tell you when an asset is "too high"
- Cumulative drift: Over very long periods, the absolute value becomes less meaningful
- Volume dependency: Useless for assets without reliable volume data
Missing Data
Gaps in Price or Volume (closed-market weekends/holidays, missing prints) are None — never a sentinel, never a stale-carried cumulative value:
| Scenario | Output |
|---|---|
| Closed-market gap | None at that slot; the next observed bar's price change bridges back to the last observed close (a real Friday→Monday move, never read as "unchanged") |
| Warm-up (first observed bar; no prior price to diff against) | None |
| Smoothing Factor warm-up (< smoothing-factor observed VPT values seen) | None — never a partial-window average |
| All bars missing | Every slot None, no crash |
| Live tick on a gap slot | [None] — correct and non-starving, never the last carried cumulative value |
VPT is cumulative: a None slot contributes nothing to the running total, which resumes cleanly at the next well-defined bar (an undefined price-zero division behaves the same way — it never poisons every later value to infinity).
Further Reading
- Volume Price Trend - Investopedia
- Understanding Money Flow in Trading - CFI
- On-Balance Volume (OBV) - Investopedia
Indicator Assessment
%%{init: {'theme': 'base', 'themeVariables': { 'cScale0': '#2563eb', 'cScale1': '#7c3aed'}}}%%
quadrantChart
title VPT Indicator Assessment
x-axis Low Complexity --> High Complexity
y-axis Low Reliability --> High Reliability
quadrant-1 High Value
quadrant-2 Specialized
quadrant-3 Limited Use
quadrant-4 Accessible
Stocks: [0.35, 0.70]
Crypto: [0.35, 0.55]
| Dimension | Stocks | Crypto | Notes |
|---|---|---|---|
| Popularity | 7/10 | 6/10 | Well-known among volume analysts, but overshadowed by OBV due to its simpler formula |
| Reliability | 7/10 | 5.5/10 | Excellent in liquid markets with accurate volume; crypto volume reporting can be unreliable |
| Complexity | 3.5/10 | 3.5/10 | Simple concept—percentage change × volume—but interpretation requires understanding divergences |
| Versatility | 7/10 | 6/10 | Works across timeframes and asset classes; most effective in trending markets |
| Recent Interest | 6/10 | 7/10 | Steady usage in traditional markets; growing interest in crypto for accumulation/distribution detection |