VPIN (Volume-Synchronized Probability of Informed Trading) estimates the likelihood that order flow in a market contains informed traders. High VPIN means market makers face elevated adverse selection risk — they are likely trading against counterparties who know more than they do. Market makers respond by widening spreads and withdrawing liquidity, which can trigger cascading volatility. VPIN is one of the few indicators designed explicitly to measure this feedback mechanism.
Section 1: Core Mechanics
The foundational concept behind VPIN is adverse selection. Every market maker knows some trades come from informed participants who have private information about future price. When informed trading is high, the market maker consistently loses on those trades — the informed side knows which way price will move. The market maker's only defense is to widen spreads.
VPIN is derived from PIN (Probability of Informed Trading), developed by Easley and O'Hara in the 1990s. The key innovation by Easley, de Prado, and O'Hara (2012): instead of measuring trading in calendar time (trades per hour), VPIN measures in volume time — equal-volume buckets regardless of how many minutes they take to fill.
Formula
Divide the trading day into equal-volume buckets (default: , each bucket = 1/50 of average daily volume).
For each bucket , classify total volume into buy volume and sell volume , where (total bucket volume, equal for all buckets).
Where:
- is the constant bucket size (equal-volume)
- is the absolute order flow imbalance per bucket
- The sum is over the most recent completed buckets (rolling window)
VPIN approaches 1.0 when every bucket is dominated entirely by one side (all buy or all sell). VPIN approaches 0.0 when each bucket has perfectly balanced buy and sell volume — no informed trading.
Bulk Volume Classification — The BVC Method
VPIN's original paper uses the Bulk Volume Classification (BVC) method to split volume without requiring individual trade-level quote data:
Where is the standard normal CDF, is price change during bucket , and is the standard deviation of price changes across buckets. This allows VPIN computation from OHLCV data alone — no tick-level data required.
Parameters
| Parameter | Default | Range | Impact |
|---|---|---|---|
| Number of buckets (N) | 50 | 20–100 | More buckets = smoother VPIN, slower reaction to sudden changes |
| Bucket size (V) | 1/50 of ADV | Adjust to asset ADV | Too small = noisy; too large = misses intraday events |
| Volume classification | BVC | BVC / Lee-Ready | BVC works without tick data; Lee-Ready more accurate with tick data |
Section 2: Interpretation & Signals
Signal Zones
| VPIN Level | Interpretation | Expected Behavior |
|---|---|---|
| Below 0.30 | Low informed trading | Market makers comfortable, tight spreads, liquid market |
| 0.30–0.50 | Moderate informed flow | Normal institutional activity, slightly elevated caution |
| 0.50–0.70 | Elevated informed trading | Market makers widening spreads, volatility beginning to rise |
| Above 0.70 | High informed trading | Adverse selection risk elevated; expect spread widening, potential liquidity withdrawal |
| Rapid rise in VPIN | Informed flow accelerating | Potential directional move imminent; direction = imbalance direction |
Entry and Exit Rules
Avoid entry (risk reduction): VPIN > 0.70 and rising = market makers are pulling liquidity. If you must trade, use limit orders only and expect wider fills.
Entry confirmation: VPIN declining from elevated levels (dropping from 0.65 to 0.45) = informed trading subsiding = liquidity returning = normal trading conditions resuming. This is often a good re-entry signal for trend trades that have consolidated.
Directional signal: When VPIN is high and rising, check the cumulative direction of the imbalance (which buckets are buy-dominated vs. sell-dominated). Sustained buy-dominated buckets = likely price rise. Sustained sell-dominated = likely decline.
VPIN as a Volatility Predictor
VPIN's theoretical value is as a forward-looking volatility signal. When VPIN rises sharply, it signals that informed participants are taking large positions — which implies they expect a significant move. The market maker response (spread widening, liquidity reduction) creates the conditions for volatile execution.
VPIN Elevated Before Volatility Spike — Risk Management Signal
Section 3: Pass vs. Live — Real-Time Reliability
On an active stock with 10 million average daily volume, a 50-bucket VPIN updates approximately every 200,000 shares. During the first hour of trading, this might be every 5–10 minutes. During the midday lull, a single bucket can take 30–60 minutes to fill. VPIN is not a high-frequency real-time indicator — it runs in volume time, not clock time.
Section 4: Practical Use Cases
Setup: VPIN monitor alongside tick chart; alert when VPIN crosses above 0.65 Signal: VPIN drops from elevated level (>0.65) back to below 0.50 = liquidity returning after informed-flow episode Entry: First buy signal from primary indicator (OFI, price action) after VPIN normalizes Exit: If VPIN spikes above 0.70 during open position — immediately tighten stop or exit Key rule: Do not scalp when VPIN > 0.65 — execution quality is too poor; you will face slippage and potentially wide spreads
Setup: Daily VPIN computed at end of day; monitor weekly trend of VPIN Signal: Multi-day decline in VPIN from elevated levels = informed selling has completed = potential bottom; or multi-day rise = accumulation building Entry: VPIN declining with price stabilizing = smart money has finished selling = contrarian long opportunity Exit: VPIN rising again while position is profitable = new informed flow episode = tighten stop Key rule: Use 5-day average VPIN to smooth daily noise; a 3-consecutive-day rise in VPIN is more meaningful than a single-day spike
Setup: Weekly VPIN aggregated across entire week's trading Signal: Multi-week elevated VPIN (>0.60 sustained for 2+ weeks) = structural informed trading = major directional move likely Entry: Direction of the imbalance (sustained buy buckets vs. sell buckets) gives directional bias; enter after VPIN begins to moderate Exit: VPIN drops back to below 0.35 and holds = informed flow has completed = potential exhaustion of the move Key rule: At position timescale, VPIN is best used for identifying major regime changes — not routine position management
Real example: During the week of 2024-08-05 (yen carry trade unwind), VPIN on SPY futures reached 0.84 on August 5th — the highest reading in 6 months. Informed sellers (likely funds unwinding leveraged positions) dominated order flow. The extreme VPIN reading signaled that the selling was not retail panic but coordinated institutional flow. VPIN began declining on August 6th–7th (0.74 to 0.58), signaling the informed selling was exhausting — SPY subsequently recovered 8% over the next 10 trading days.
Section 5: Pseudo Code
INPUT:
volume_data[] # OHLCV bars: (timestamp, open, high, low, close, volume)
bucket_count = 50 # number of buckets N
lookback = 50 # rolling window of buckets for VPIN calculation
PROCESS:
Step 1: Compute average daily volume (ADV) from last 20 trading days
adv = mean(daily_volumes[-20:])
bucket_size = adv / bucket_count # V
Step 2: Accumulate volume into equal-size buckets
current_bucket_volume = 0
buckets = []
for each bar in volume_data:
current_bucket_volume += bar.volume
if current_bucket_volume >= bucket_size:
# bucket complete — classify volume
dp = bar.close - bar.open
sigma_dp = std_dev(price_changes_recent)
z_score = normal_cdf(dp / sigma_dp) # BVC method
buy_vol = bucket_size * z_score
sell_vol = bucket_size * (1 - z_score)
buckets.append((buy_vol, sell_vol))
current_bucket_volume = 0 # reset for next bucket
Step 3: Compute VPIN over rolling N buckets
recent_buckets = buckets[-lookback:]
vpin = sum(abs(b[0] - b[1]) for b in recent_buckets) / (lookback * bucket_size)
Step 4: Generate alerts
if vpin > 0.70:
alert = "HIGH_VPIN_RISK"
elif vpin > 0.50:
alert = "ELEVATED_VPIN"
else:
alert = "NORMAL"
OUTPUT: vpin — float between 0 and 1; alert — risk level string
EDGE CASES:
- Insufficient history for ADV: use first available 5 days as proxy; flag as estimated
- Zero-volume bar: skip; do not contribute to bucket
- Market close gap: start new bucket accumulation at next open
- Very low ADV stock: bucket_size < 1000 shares = unreliable BVC classification
Section 6: Parameters & Optimization
Standard Configuration
| Setting | Value | Rationale |
|---|---|---|
| Bucket count (N) | 50 | Standard from original Easley, de Prado, O'Hara (2012) paper |
| Rolling lookback | 50 buckets | Corresponds to one full day of average activity |
| BVC sigma window | 50 buckets | Same window for consistent normalization |
| Alert threshold | 0.70 | Above this level, market makers historically widen spreads significantly |
Parameter Impact
| Change | Effect | When to Apply |
|---|---|---|
| Increase N to 100 | Smoother VPIN, reacts more slowly to sudden changes | Low-volatility regimes where noise is the main problem |
| Decrease N to 20 | More reactive, higher false alert rate | High-volatility regimes, fast-moving markets |
| Use Lee-Ready instead of BVC | More accurate classification but requires tick data | When tick data is available — BVC is the fallback |
How does volume time differ from calendar time?
Calendar-time measures assume trading is uniformly distributed throughout the day. In reality, the first and last 30 minutes have 3–5x more volume than midday. A calendar-time model treating a 1-minute midday bar the same as a 1-minute open bar systematically underestimates informed trading at the open. Volume time normalizes for this — each VPIN bucket represents the same amount of information (same trading activity), regardless of how many minutes it takes to fill.
What is the connection between VPIN and the Flash Crash?
Easley, de Prado, and O'Hara (2012) showed that VPIN for E-mini S&P 500 futures reached its 99.99th historical percentile on the morning of May 6, 2010 — before the Flash Crash occurred. They argued this was a predictive signal. Subsequent research (Andersen and Bondarenko, 2015) challenged this finding, showing that VPIN spikes frequently without a subsequent crash and that the statistical significance was overstated. The honest assessment: VPIN is a useful risk indicator but not a reliable crash predictor.
Section 7: Synergies & Conflicts
| Works Well With | Avoid Combining With | |
|---|---|---|
| Bid-Ask Spread | VPIN rises → market makers widen spreads → both confirm deteriorating liquidity conditions simultaneously | — |
| Order Flow Imbalance | VPIN measures extent of imbalance; OFI measures direction — combine for complete picture | — |
| Cumulative Delta | Rising VPIN with positive cumulative delta = informed buying; rising VPIN with negative delta = informed selling | — |
| VIX / Implied Volatility | VPIN rising ahead of VIX spike = leading indicator confirmation — market stress building | — |
| RSI and MACD | — | Different timescales and data inputs — VPIN is a market quality metric, not a price momentum indicator |
| Chart patterns alone | — | A head-and-shoulders pattern has no relationship to informed trading probability — different analytical frameworks |
Section 8: Common Mistakes
| Mistake | Root Cause | Solution |
|---|---|---|
| Treating VPIN as a directional signal | VPIN measures magnitude of informed flow, not direction | Combine VPIN level with OFI or cumulative delta for directional bias |
| Using VPIN on illiquid stocks | BVC classification breaks down with few trades | Restrict VPIN to stocks with ADV > 2 million shares; small-caps yield unreliable readings |
| Trusting VPIN > 0.70 as a sell signal | High VPIN can precede moves in either direction | High VPIN = reduce size and protect positions, not necessarily exit |
| Computing VPIN on daily OHLCV without intraday data | Daily buckets are too coarse — miss intraday dynamics | Use at minimum 30m bars for VPIN calculation; 5m bars for high-frequency use |
| Ignoring academic debate on VPIN reliability | Taking the indicator at face value based on original paper | Apply VPIN as a risk filter with acknowledged uncertainty, not a proven edge |
Section 9: Cheat Sheet
USE WHEN: Risk monitoring before entering positions in volatile conditions, assessing market quality before large order execution, identifying informed flow episodes in quantitative research
AVOID WHEN: Used as a standalone entry/exit trigger; applied to stocks with ADV below 2 million shares; treated as a crash predictor
ENTRY SIGNAL: VPIN declining from elevated levels (>0.65 to below 0.45) = informed flow episode ending = safer trading conditions returning
EXIT SIGNAL: VPIN spike above 0.70 during an open position = adverse selection risk elevated = tighten stop or reduce size immediately
PARAMETERS: N=50 buckets, bucket size = ADV/50, BVC classification; rolling 50-bucket window for VPIN calculation
CONFLUENCE: Bid-Ask Spread (confirm widening) + Cumulative Delta (direction of informed flow) + VIX (macro volatility context)
RISK: Mixed academic evidence — use as risk filter, not as edge; false positives are common above 0.65
BEST TIMEFRAME: Intraday risk monitoring (5m–30m buckets); daily aggregation for swing trade pre-screening