Systemicalpha

Volume Price Trend

systemic:core-vptIndicatorsfunction1 cr

Inputs

NameTypeDescription
Smoothing FactorintegerThe 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.
PricefloatarrayThe 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.).
VolumefloatarrayThe trading volume series corresponding to each price period. This represents the total number of shares, contracts, or tokens traded during each interval.

Outputs

NameTypeDescription
VPTfloatarrayA 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

VPTt=VPTt−1+Vt×Pt−Pt−1Pt−1VPT_t = VPT_{t-1} + V_t \times \frac{P_t - P_{t-1}}{P_{t-1}}

Where:

  • VPTtVPT_t = Volume Price Trend at time tt
  • VPTt−1VPT_{t-1} = Previous VPT value (starts at 0)
  • VtV_t = Current period's volume
  • PtP_t = Current closing price
  • Pt−1P_{t-1} = Previous closing price

The term Pt−Pt−1Pt−1\frac{P_t - P_{t-1}}{P_{t-1}} 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:

DateClose ($)VolumePrice Change (%)Volume × ChangeCumulative VPT
Dec 22270.97———0 (start)
Dec 23272.3629,641,999+0.513%+152,063+152,063
Dec 24273.8117,910,574+0.532%+95,340+247,403
Dec 26273.4021,521,802−0.150%−32,227+215,176

Calculation for Dec 23:

VPT=0+29,641,999×272.36−270.97270.97=29,641,999×0.00513=152,063VPT = 0 + 29{,}641{,}999 \times \frac{272.36 - 270.97}{270.97} = 29{,}641{,}999 \times 0.00513 = 152{,}063

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 0.01on10millionshares,thenrises0.01 on 10 million shares, then 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 TypePrice ActionVPT ActionSignal
BullishMaking lower lowsMaking higher lowsSelling exhaustion → potential reversal up
BearishMaking higher highsMaking lower highsBuying 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 WithPurpose
ADX (Average Directional Index)Confirm trend strength. ADX > 25 + rising VPT = strong trend
Moving Average CrossoversValidate breakouts. 20-day crosses 50-day + VPT rising = confirmed
RSIFilter 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:

ScenarioOutput
Closed-market gapNone 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 missingEvery 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


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]
DimensionStocksCryptoNotes
Popularity7/106/10Well-known among volume analysts, but overshadowed by OBV due to its simpler formula
Reliability7/105.5/10Excellent in liquid markets with accurate volume; crypto volume reporting can be unreliable
Complexity3.5/103.5/10Simple concept—percentage change × volume—but interpretation requires understanding divergences
Versatility7/106/10Works across timeframes and asset classes; most effective in trending markets
Recent Interest6/107/10Steady usage in traditional markets; growing interest in crypto for accumulation/distribution detection
Rendering diagrams...
© 2026 WanoLabs. All rights reservedAlpha build v0.1.5