VPIN: why BVC and the tick rule disagree on the same tape
On the same 20,000-trade synthetic tape, VPIN averages 0.4410 with bulk volume classification (BVC) and 0.1779 with the tick rule. Neither number measures toxicity on its own: each classifier has a noise floor, the VPIN it reports when there is nothing to detect, and the floors differ by construction. BVC maps every bucket's net price change through a CDF, so on pure noise it reads about 0.45 (exactly 0.50 with a normal CDF). The tick rule sums roughly 80 trade signs per bucket that mostly cancel, so its floor is √(2/π)/√k ≈ 0.13. Both predictions land within 0.01 of the control tape. Bucket size moves the tick rule's level and barely touches BVC's; BVC's t-distribution setting moves its level and barely touches its detection ratio. A VPIN threshold quoted without classifier, bucket size and window is not a number.
The question the verification report left open
The VPIN verification report showed the estimator responding to a planted informed episode and noted, as a limit, that the two classifiers give 0.4410 and 0.1779 on identical data. It suggested varying bucket size and window as the next experiment. This note does that, and first explains the gap, with the same tape, the same implementation and a control tape that has the planted drift removed. Everything is synthetic.
Setup
The tape is the report's: 20,000 trades, Gaussian price steps with σ = 0.01, lognormal sizes, a persistent upward drift of 0.004 per trade on trades 8,000–11,999. The control tape subtracts the cumulative drift from the price path and keeps every step and every volume, so the two tapes differ only in the informed episode. The published setting is 250 equal-volume buckets of 21,376 shares (80 trades per bucket on average) and a 50-bucket window. “Quiet” is the mean VPIN over buckets 15–35% of the way through the tape, “active” over 42–62%, as in the report.
Part A: where the gap comes from
VPIN over a window of equal-volume buckets is the average per-bucket imbalance ratio |Vbuy − Vsell| / V. The two classifiers produce that ratio in different ways.
- BVC assigns each bucket a buy fraction T(ΔP / σΔP) using a Student-t CDF, so the imbalance ratio is |2T(z) − 1| for one standardised price change z per bucket. If z were standard normal and T the normal CDF, T(z) would be uniform on [0, 1] and the expected ratio would be exactly 0.5, regardless of bucket size, tape or anything else. With the t-distribution at 3 degrees of freedom the Monte Carlo expectation is 0.449.
- The tick rule signs each trade by its price change and sums signed volume within the bucket. With k independent fair signs the expected absolute sum is √(2/π)·√(∑vi²), which divided by bucket volume gives the floor. Computed on the actual bucketed volumes of this tape, that is 0.131.
| 250 buckets, window 50 | BVC (dof 3) | Tick rule |
|---|---|---|
| Control tape (no informed episode): mean VPIN | 0.4579 | 0.1358 |
| Predicted noise floor | 0.449 | 0.131 |
| Informed tape: mean VPIN | 0.4410 | 0.1779 |
| Informed tape: quiet / active | 0.3292 / 0.6376 | 0.1386 / 0.2259 |
| Detection ratio (active / quiet) | 1.94× | 1.63× |
| Per-bucket imbalance ratio, informed tape: median / 90th pct | 0.37 / 0.86 | 0.14 / 0.33 |
Two things follow. First, the difference between 0.44 and 0.18 is almost entirely the difference between the two floors, 0.45 and 0.13; the informed episode adds a comparable amount to each. Second, BVC's quiet reading on the informed tape (0.3292) is below its own floor (0.4579). That is not a paradox: BVC standardises by the dispersion of price changes across the whole tape, and the informed episode inflates that dispersion from 0.0872 to 0.1492. Quiet buckets are then divided by a larger σ, their z shrinks, and their imbalance reads lower. The level of BVC in one part of a tape depends on what happened elsewhere on it.
Part B: bucket size and window
Bucket counts 50, 100, 250, 500 and 1,000 (400 down to 20 trades per bucket) crossed with windows 10, 25, 50 and 100 buckets, on the informed tape. Cells where the window is longer than the quiet segment have no quiet mean and are omitted.
| Buckets (trades each) | Window | BVC mean | BVC quiet / active | BVC ratio | Tick mean | Tick quiet / active | Tick ratio |
|---|---|---|---|---|---|---|---|
| 50 (400) | 10 | 0.3507 | 0.178 / 0.603 | 3.39 | 0.1161 | 0.075 / 0.202 | 2.69 |
| 100 (200) | 10 | 0.3760 | 0.240 / 0.797 | 3.33 | 0.1301 | 0.095 / 0.254 | 2.69 |
| 100 (200) | 25 | 0.4079 | 0.242 / 0.578 | 2.39 | 0.1372 | 0.096 / 0.181 | 1.89 |
| 250 (80) | 10 | 0.4125 | 0.325 / 0.793 | 2.44 | 0.1696 | 0.146 / 0.283 | 1.94 |
| 250 (80) | 50 | 0.4410 | 0.329 / 0.638 | 1.94 | 0.1779 | 0.139 / 0.226 | 1.63 |
| 500 (40) | 50 | 0.4512 | 0.366 / 0.704 | 1.92 | 0.2128 | 0.176 / 0.291 | 1.65 |
| 1,000 (20) | 50 | 0.4487 | 0.386 / 0.641 | 1.66 | 0.2773 | 0.246 / 0.349 | 1.42 |
| 1,000 (20) | 100 | 0.4536 | 0.392 / 0.623 | 1.59 | 0.2781 | 0.246 / 0.335 | 1.36 |
The full 34-cell grid is in outputs/grid.csv. Reading it:
- The tick rule's level is a function of trades per bucket. From 200 trades per bucket to 20 its mean rises from 0.13 to 0.28, because fewer signs cancel. Its floor scales like 1/√k. Any tick-rule VPIN threshold therefore only means something for one bucket size.
- BVC's level barely moves (0.35 to 0.45 across the same range, 0.41 to 0.45 for windows of 25 or more). One z per bucket is one draw from roughly the same distribution whatever the bucket size; the floor does not depend on k.
- Detection favours few, large buckets and short windows. The best active/quiet ratio in the grid is 3.39× (BVC, 50 buckets, window 10); the published 250/50 setting gives 1.94×; 1,000 buckets with a 100-bucket window gives 1.59×. Small buckets dilute the episode across more readings and long windows average it away. The price of the sharpest setting is 10 readings per window on a 50-bucket tape, which is not a series anyone would trade on.
- BVC beats the tick rule on detection in every cell of this tape, by 0.2–0.7 in ratio terms. On this tape; the informed episode is a smooth drift, which is the case BVC is designed for.
Part C: BVC's degrees of freedom
| Student-t dof | Informed tape: mean | Quiet / active | Ratio | Control tape: mean | Predicted floor |
|---|---|---|---|---|---|
| 1 | 0.3664 | 0.275 / 0.528 | 1.92 | 0.3785 | 0.372 |
| 3 (published) | 0.4410 | 0.329 / 0.638 | 1.94 | 0.4579 | 0.449 |
| 30 (≈ normal) | 0.4822 | 0.361 / 0.695 | 1.93 | 0.5042 | 0.494 |
The degrees-of-freedom setting shifts the level by 0.12 end to end and leaves the detection ratio at 1.92–1.94. Heavier tails in the CDF compress |2T(z) − 1| for moderate z, lowering the floor, without changing how much the informed episode stands out relative to it. Papers that quote a VPIN “alert level” rarely state the dof; it is worth 0.12 here.
What this does not establish
- One synthetic tape with one shape of informed episode (a steady drift). Informed flow that arrives as bursts, or as volume without a price trend, would change which classifier detects it and by how much.
- Nothing here says whether VPIN forecasts volatility in real markets, the question Andersen and Bondarenko (2014) raised; a synthetic tape cannot address it.
- The tick-rule floor prediction assumes independent signs. Real tick-rule signs are autocorrelated (unchanged prices inherit the previous sign); on this tape the observed floor is 0.136 against 0.131 predicted, so the effect is small here and could be larger elsewhere.
- Level is not detectability. Every table reports both, and the practical use of VPIN depends on the second.
Reproduce
python experiment.py
python ../tests/test_vpin_sensitivity.py # expected: 6 passed
Runtime about two seconds. The 250-bucket, window-50 cells must reproduce the verification report's 0.4410 / 0.1779 / 0.3292 / 0.6376 exactly; the first test checks that. Code and output on GitHub.
References
- Easley, D., López de Prado, M. and O’Hara, M. (2012). Flow Toxicity and Liquidity in a High-Frequency World. Review of Financial Studies, 25(5), 1457–1493.
- Easley, D., López de Prado, M. and O’Hara, M. (2016). Discerning Information from Trade Data. Journal of Financial Economics, 120(2), 269–285 (bulk volume classification).
- Andersen, T. G. and Bondarenko, O. (2014). VPIN and the Flash Crash. Journal of Financial Markets, 17, 1–46.
- Lee, C. M. C. and Ready, M. J. (1991). Inferring Trade Direction from Intraday Data. Journal of Finance, 46(2), 733–746 (the tick rule).