Bulk Volume Classification
A way to estimate what share of trading volume was buyer-initiated versus seller-initiated using only price and volume bars, without needing trade-by-trade quote data.
To measure order flow imbalance — how much of the volume in a stock was driven by aggressive buyers versus aggressive sellers — the traditional approach (the tick rule, or Lee-Ready) looks at each individual trade and compares its price to the prevailing quote. That requires trade-by-trade data with tight time-stamping, which isn't always available or affordable, especially for research spanning many symbols and years. Bulk volume classification (BVC) solves a cheaper version of the same problem: given only volume bars — total volume and the price change over each bar — estimate the buy/sell split for the whole bar at once, without ever looking at an individual trade.
The core idea
BVC assumes that within a bar, the fraction of volume that was buyer-initiated is related to how much the price moved during that bar, relative to how volatile prices are moving between bars generally. A bar where price rose sharply is assumed to have been dominated by aggressive buying; a bar where price fell sharply, by aggressive selling; a bar where price barely moved is assumed close to a 50/50 split. Formally, the buy fraction for a bar is estimated using the standardized price change run through the normal cumulative distribution function, , where is the price change over the bar and is the standard deviation of price changes across bars. In plain English: a price move is converted into a "how extreme is this move, in standard-deviation terms" score, and that score is mapped onto a 0-to-1 buy-fraction using the normal distribution's shape — a huge upward move maps close to 1 (almost all buying), a huge downward move maps close to 0 (almost all selling), and a flat bar maps near 0.5.
Worked example
Over one hour, a stock trades 500,000 shares in 10 volume bars of 50,000 shares each. In one bar the price rises by 1.5 standard deviations of the bar-to-bar price-change distribution. Plugging gives an estimated buy fraction of about 93%: roughly 46,500 shares classified as buyer-initiated and 3,500 as seller-initiated for that bar, entirely from the price move and the volume total — no trade-level data was used. Sum that estimate across all 10 bars in the hour and you get an aggregate order flow imbalance for the period, which is the quantity BVC is built to produce, typically compared against a threshold to flag hours where flow was unusually one-sided.
What this means in practice
BVC is widely used to build flow-toxicity measures like VPIN (volume-synchronized probability of informed trading), because it can be computed cheaply across huge histories where full tick-level trade classification would be impractical. It's an approximation, not a measurement — it infers direction from price behavior rather than observing which side crossed the spread, so it can misclassify bars where price moved for reasons unrelated to that bar's own order flow (a gap from overnight news, for instance). Its value is in aggregate, statistical use — flagging periods of one-sided flow across a large panel of symbols — rather than as ground truth for any single trade.
Bulk volume classification estimates the buy/sell split of trading volume from price change and volatility alone, using a normal-CDF mapping — a cheap, data-light substitute for trade-by-trade classification, useful at scale but only an approximation of true order flow.
BVC needs a choice of bar size (fixed time, fixed volume, or fixed dollar value) before it can run — volume or dollar bars are generally preferred over time bars because they normalize for the fact that trading activity is uneven across the day, giving each bar a more comparable amount of information.
Related concepts
Practice in interviews
Further reading
- Easley, López de Prado, O'Hara, Flow Toxicity and Liquidity in a High-Frequency World, Review of Financial Studies (2012)