Positive Volume Index

The Positive Volume Index (PVI) is a cumulative indicator that tracks price changes on days when trading volume increases from the previous day. Based on the theory that informed investors (institutional "smart money") tend to trade on days with increasing volume, PVI focuses exclusively on these higher-volume periods while ignoring price movements on days when volume decreases.

Developed by Paul Dysart in the 1930s and popularized by Norman Fosback in the 1970s, PVI is designed to identify trends driven by institutional activity. The indicator assumes that retail investors are more active during declining volume periods, while professional traders dominate on days with rising volume.

PVI works as a cumulative measure, meaning it maintains a running total that updates only on days when volume increases. When volume rises, the indicator calculates the percentage change in price and adds it to the previous PVI value. When volume stays flat or decreases, the PVI value remains unchanged. This selective updating creates a trend line that reflects price movements during periods of presumed institutional interest.

What It Measures

The Positive Volume Index measures cumulative price changes that occur specifically on days when trading volume increases from the previous day. It captures the percentage price change multiplied by the previous PVI value, creating a running total that reflects trends during rising volume periods.

When to Use

Interpretation

Usage Notes

Unlike most technical indicators, PVI doesn't require period selection or smoothing parameters. It's a pure cumulative measure that responds only to volume increases. The starting value (typically 0.0) serves as the baseline, and all subsequent values represent the accumulated effect of price changes on rising-volume days.

The indicator is most powerful when:

Default Usage

use rust_ti::strength_indicators::bulk::positive_volume_index;

pub fn main() {
    // fetch the data in your preferred way
    // let close = vec![...];  // close prices
    // let volume = vec![...]; // volume data
    
    let previous_pvi = 0.0;  // starting value for first calculation
    let pvi = positive_volume_index(&close, &volume, previous_pvi);
    println!("Positive Volume Index: {:?}", pvi);
}
import pytechnicalindicators as pti

# Positive Volume Index calculation
previous_pvi = 0.0  # starting value for first calculation
pvi = pti.strength_indicators.bulk.positive_volume_index(
    close, volume, previous_pvi
)
print("Positive Volume Index:", pvi)
import init, { 
    strength_bulk_positiveVolumeIndex
} from 'https://cdn.jsdelivr.net/npm/ti-engine@latest/dist/web/ti_engine.js';

await init();

// fetch the data in your preferred way
// const close = [...];  // close prices
// const volume = [...]; // volume data

const previousPvi = 0.0;  // starting value for first calculation
const pvi = strength_bulk_positiveVolumeIndex(close, volume, previousPvi);
console.log("Positive Volume Index:", pvi);

Interactive Chart

Use the interactive playground below to explore how different parameters affect the indicator's behavior.