Volume-price analysis

Price tells you where the market went. Volume tells you how hard it had to work to get there. Comparing the two is one of the oldest ideas in technical analysis — and one of the few where we can now show you exactly which parts survive measurement and which parts do not.

Effort versus result

Effort is volume: how many contracts or shares changed hands. Result is how far price moved while that was happening. The entire method is reading the ratio between them.

That is the whole conceptual apparatus. Everything below is a way of making it precise enough to count.

What Wyckoff and Weis were actually claiming

Richard Wyckoff was a stock operator writing in the 1900s–1930s. His central claim was about who, not what: markets are moved by large, well-informed participants who have to accumulate and distribute positions gradually, because doing it all at once would move the price against them. That gradual process leaves a footprint in the relationship between volume and price, and a careful reader can see it.

Note that this is a mechanical argument, not a mystical one, and it does not require anyone to be clairvoyant. A fund that needs to buy a large position cannot simply take every offer — it would pay far more than it wanted to. So it buys into weakness, absorbs supply, waits. That behaviour is different from what a crowd of small participants does, and the difference shows up in the data. Whether it shows up strongly enough to be worth anything is an empirical question, and that is what this page is about.

David Weis spent decades developing a specific presentation of these ideas. His insight was about visualisation: bar-by-bar volume is close to unreadable, because each bar's volume depends on time of day, news, expiries and noise. Group the bars into waves instead, sum the volume within each wave, and the comparison becomes obvious to the eye.

Both men were explicit that this was interpretive, not mechanical — a way of forming a view, not a rule that fires. That framing turns out to be well supported by what we measured. Quant Data is independent research and is not affiliated with or endorsed by David Weis or any Wyckoff organisation.

What a wave is

A wave is a run in one direction that continues until price reverses by more than a threshold. Reverse by less and you are still in the same wave; reverse by more and a new wave begins in the other direction. Then you total the volume that traded inside each wave.

heavy very light heavy light price wave volume wave 1 · up wave 2 · down wave 3 · up wave 4 · down

A schematic. Wave 1 travels a long way on heavy volume. Wave 2 gives back a fraction of it on very light volume — few people selling into the pullback. Wave 3 pushes to a new high on heavy volume again. This is the shape the tradition reads as buyers in control.

The threshold is the only parameter that matters, and picking it badly ruins everything. Set it too tight and every wiggle becomes a wave; too loose and a whole session is one wave. Quant Data sets the reversal threshold at 0.3937 × ATR(60) on closing prices — a coefficient calibrated on S&P 500 E-mini futures. Because it is expressed as a multiple of recent average range rather than in points, the same setting behaves consistently on a $30 stock and a 6,000-point index. Nothing here is re-tuned per instrument, which is deliberate: re-tuning per asset is how you manufacture results that do not replicate.

The five events

Once you have waves, you can define specific configurations the tradition considers meaningful. Quant Data detects five. Descriptions first — the scoreboard comes after, and the order matters.

EventThe configurationWhat the tradition reads into it
cib_long A heavy-volume up-wave that travels a long way, followed immediately by a pullback on a small fraction of that volume Buyers pushed hard and nobody wanted to sell it back. Bullish.
cib_short The mirror: heavy down-wave, then a light bounce Sellers in control. Bearish.
no_supply_long A down-wave whose volume dries up to a quarter of recent normal, and which fails to break below the previous down-wave's low Nobody left who wants to sell. Bullish.
no_demand_short An up-wave on very light volume that fails to exceed the previous up-wave's high The rally has no buyers behind it. Bearish.
sot_short "Shortening of the thrust": each successive push travels less distance, in fewer bars, on less volume The trend is running out. Bearish.

Read those descriptions on their own terms first. Every one of them is a reasonable story about market behaviour, and each has been taught in books and courses for decades.

The honest scoreboard

Now the measurement. Pre-registered tests on S&P 500 E-mini futures, 5-minute bars, 2010–2026, using symmetric ±3×ATR barriers — the outcome is whichever barrier price hits first, so there is no bias from asymmetric targets. Corrected for the number of tests run. Required to hold with the same sign in both halves of the period.

The baseline is 49.3% — the win rate of any wave flip at all, with no event condition. That is the number every row below has to beat.

EventMeasuredn Verdict against the tradition
cib_long 51.8%13,867 confirmed matches the claim (p=1.6e-5)
no_supply_long 51.4%23,077 confirmed matches the claim (p=3e-5)
no_demand_short 45.6%22,262 reversed the bullish read is right, at 54.4%
sot_short 47.6%9,427 reversed fading the trend does not work
cib_short 48.6%12,642 below baseline — no edge

Two confirmed. Two reversed.

The bullish half of the tradition holds up. Both confirmed events are small — 51.8% and 51.4% against a 49.3% baseline is roughly a two-point edge — but they are measured on thirteen and twenty-three thousand samples, which is enough to see two points.

The bearish half does not hold up. It does something more interesting than failing: it points the other way. When no_demand_short fires — a weak rally on light volume, the textbook picture of a move with nothing behind it — the market went up 54.4% of the time across 22,262 instances. Betting against that rally lost.

This is the most useful sentence on the page. The textbook says bearish. The data says mildly bullish. Both numbers describe the same event on the same 16 years of the same market, and the difference between them is worth more than any number that merely agreed with the book.

Why? Because of what each kind of result costs you:

And there is a coherent explanation, which matters because a reversal with no mechanism is usually just noise. Every bearish volume-price read tested below 50% on this market. Index products have long-run upward drift and a structure that punishes crowded short positions. In that environment, "the rally looks weak" is simply not a reason to be short — a weak-looking rally in a drifting-up market is what most rallies look like. The asymmetry is a property of the instrument, not a flaw in the detection.

Which also means: do not assume it holds elsewhere. The asymmetry is an explanation, not a law, and the next section is about exactly where it stops.

The strongest result: gating by day type

A volume event on its own is a weak trigger. The same event filtered by the character of the session it happens in is considerably stronger.

Take cib_long and only count the ones that fire on a day the day-type model reads as TrendUp:

Assetcib_long under TrendUp ComparisonGap
ES · S&P 500 futures (trained asset) 56.5%50.8% ungated +5.6pt · p=0.002
NQ · Nasdaq futures (zero-shot) 56.1%45.3% under TrendDown +10.8pt · p=2e-6
QQQ · Nasdaq ETF (zero-shot) 54.3%44.3% under TrendDown +10.0pt · p=7e-5

Zero-shot means the day-type model had never seen a single bar of NQ or QQQ during training. It learned the structure of a trending session on one instrument and that structure transferred to two others it had never met. That is the closest thing here to evidence of a general property rather than a curve fit.

Two details are worth more than the headline. First, adding a third filtering layer on top made results worse — it shrank the sample without adding information. More conditions is not more edge. Second, look at the TrendDown column: 44–45%. The most valuable use of the gate is often not taking the long trigger when the session reads as a downtrend. Avoiding a negative-edge situation is cheaper and more reliable than finding a positive-edge one.

Where this stops working

Publishing this next part is the point of the exercise. If it were missing you would have no way to judge the rest.

Bitcoin: 0 of 8

Eight pre-registered tests, every parameter frozen from the S&P work so nothing could be tuned. Zero confirmations. Worse than null: no_supply_long came back significantly reversed at 48.3%. The event that is mildly bullish on index futures is mildly bearish on BTC.

Gold and Ethereum: the same anti-signature

Both show the same shape as BTC — events without edge, and no_supply leaning reversed. Outside index-type assets, a quiet pullback appears to be a trap rather than an opportunity. Three assets, one consistent pattern.

Chart patterns: AUC 0.54

121,000+ classical chart-pattern detections over 16 years. A model predicting what happened next scored 0.54, where 0.5 is a coin flip. The edge here comes from conditioned volume events gated by day type, not from pattern shapes.

The conclusion is uncomfortable and worth stating flatly: these win rates are a property of index-type assets, not a law of markets. Anyone showing you Weis statistics on crypto without having tested them there is extrapolating, and in this specific case the extrapolation is measurably backwards.

What this is actually good for

A two-point edge sounds like something you could trade. Do the arithmetic and it is not. Gross expectation on these events is roughly the same size as transaction costs — you would be trading to pay your broker.

The honest uses are narrower and they are real:

Which is what Weis said all along. He framed the method as interpretive rather than mechanical, and 16 years of counting agrees with him.

How to practise

  1. Look at waves, not bars. Pick a liquid instrument and mark the swings by hand. Write down each wave's rough volume and how far it travelled. Do it for a week before reading a single event name.
  2. Call the pullbacks before you check. When price pulls back, decide whether it looks like light-volume drift or genuine selling. Then check.
  3. Log the bearish setups especially. Every time you see something that looks like "no demand", write down what you expected and what happened. This is where the measured reversal will show up in your own data, and seeing it yourself is worth more than reading it here.
  4. Always pair it with the day type. A volume event without session context is the ungated 51.8%. With context it is 56.5%. That gap is the single most reliable thing on this page.

Try it

The wave engine is the Weis Wave API — $30/month. It returns the wave in progress with its volume relative to the last twenty, the eight most recent completed waves, and any events that fired, each carrying its measured win rate and sample size so nothing gets quoted from folklore. Pair it with Brooks Daily Bias for the gate; both together are $50/month.

The quantdata-weis-wave Skill teaches an AI agent to read the output correctly — including refusing to call a no_demand_short bearish, which is exactly what an agent working from its training data would otherwise do.

Email for a key How to read these numbers

Next

Educational analytics. Nothing on this page is investment advice or a recommendation to buy or sell anything.