Home Verified Methods Reports Papers Methodology About
HomeLearn › VPIN: why BVC and the tick rule disagree on the same tape

VPIN: why BVC and the tick rule disagree on the same tape

Short answer

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.

250 buckets, window 50BVC (dof 3)Tick rule
Control tape (no informed episode): mean VPIN0.45790.1358
Predicted noise floor0.4490.131
Informed tape: mean VPIN0.44100.1779
Informed tape: quiet / active0.3292 / 0.63760.1386 / 0.2259
Detection ratio (active / quiet)1.94×1.63×
Per-bucket imbalance ratio, informed tape: median / 90th pct0.37 / 0.860.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)WindowBVC meanBVC quiet / activeBVC ratioTick meanTick quiet / activeTick ratio
50 (400)100.35070.178 / 0.6033.390.11610.075 / 0.2022.69
100 (200)100.37600.240 / 0.7973.330.13010.095 / 0.2542.69
100 (200)250.40790.242 / 0.5782.390.13720.096 / 0.1811.89
250 (80)100.41250.325 / 0.7932.440.16960.146 / 0.2831.94
250 (80)500.44100.329 / 0.6381.940.17790.139 / 0.2261.63
500 (40)500.45120.366 / 0.7041.920.21280.176 / 0.2911.65
1,000 (20)500.44870.386 / 0.6411.660.27730.246 / 0.3491.42
1,000 (20)1000.45360.392 / 0.6231.590.27810.246 / 0.3351.36

The full 34-cell grid is in outputs/grid.csv. Reading it:

Part C: BVC's degrees of freedom

Student-t dofInformed tape: meanQuiet / activeRatioControl tape: meanPredicted floor
10.36640.275 / 0.5281.920.37850.372
3 (published)0.44100.329 / 0.6381.940.45790.449
30 (≈ normal)0.48220.361 / 0.6951.930.50420.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

Reproduce

cd quantmedia-research/vpin-classifier-sensitivity
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