Free key · 10 calls/day

Is there volume behind this move?

The Weis Wave API — named for David Weis, who adapted the technique from Richard Wyckoff's method — answers by summing volume per price swing instead of per bar, so effort can be compared against result. Five named events, each shipped with the win rate we actually measured on 16 years of data, including the two that came back backwards.

Get free API key View a real response

What a Weis wave is

Volume printed under each bar is close to useless: it flickers, it spikes on nothing, and it tells you about one minute rather than about a move. David Weis, working from Richard Wyckoff’s much older method, proposed a fix. Chop the chart into swings — every stretch where price is going mostly up, then every stretch where it is going mostly down — and add up all the volume inside each swing. Now one number describes one move.

That makes a comparison possible that a price chart cannot show you: effort versus result. If a 20-point rally takes 130,000 contracts and the next 20-point rally takes 40,000, something changed. If a sell-off runs out of volume before it runs out of price, somebody stopped selling. Wyckoff called this reading accumulation and distribution; the modern plain-English version is just “how much work did the market have to do to get here.”

Our implementation is a zero-dependency analyzer — no charting library, no vendor indicator. Waves are built by a close-price zigzag: price has to reverse by more than 0.3937 × ATR(60) before we call it a new wave. That coefficient was calibrated on ES and is expressed as a multiple of average true range, which makes it scale-free: the same rule segments a $6,400 futures contract and a $30 stock sensibly, with nothing to tune. Volume is summed per wave, and five named events are detected on top of the wave sequence.

The endpoint

Base URL https://api.quantdata.uk, one header X-API-Key: qd_.... The $149 full plan opens every endpoint on the site — the Brooks Events API's price-action events and the options-positioning pair, /v1/maxpain and /v1/gamma. The $9.90 Brooks-only product does not include Weis. Full parameter and error tables are in the API reference.

GET /v1/weis/{symbol}

Returns the wave state of the instrument right now: how many complete waves exist in the window, the unfinished wave currently forming, the last eight completed waves, and any events that fired — each with its reference statistics attached so an agent never has to guess how much the event is worth.

$ curl -H "X-API-Key: qd_9f3c..." \
       https://api.quantdata.uk/v1/weis/ES=F

{
  "symbol": "ES=F",
  "session": "2026-07-24",
  "session_window": "rth",
  "bars": 812,
  "source": "leandata",
  "waves_total": 63,
  "current_wave": {
    "dir": "up",
    "bars": 7,
    "move": 12.25,
    "volume": 41822.0,
    "vol_vs_median20": 0.63
  },
  "recent_waves": [
    { "dir": "down", "move": -21.75, "bars": 14,
      "volume": 128640.0, "end_time": "2026-07-24 10:35:00-04:00" },
    { "dir": "up",   "move":  18.5,  "bars":  9,
      "volume":  74210.0, "end_time": "2026-07-24 11:20:00-04:00" },
    { "dir": "down", "move": -11.25, "bars": 12,
      "volume":  38955.0, "end_time": "2026-07-24 12:15:00-04:00" }
  ],
  "events": [
    {
      "type": "no_supply_long",
      "dir": "long",
      "time": "2026-07-24 12:15:00-04:00",
      "price": 6404.75,
      "reference": {
        "es_win": 0.514,
        "es_n": 23077,
        "es_p": "3e-5",
        "verdict": "CONFIRMED(ES)",
        "warning": "reverses on BTC (48.3%) — do not port across assets"
      }
    }
  ],
  "disclaimer": "Wave/event analytics derived from Weis Wave methodology. Reference stats are ES-futures-specific (2010-2026, pre-registered tests); edges do NOT transfer across assets (verified: BTC null/reversed). Educational analytics, not investment advice."
}

Field notes. waves_total is the number of completed waves in the fetched window. current_wave.vol_vs_median20 compares the in-progress wave’s volume against the median of the last twenty — 0.63 means this move is being made on a bit less than two-thirds of normal effort. recent_waves always returns the eight most recent completed waves (trimmed to three above). events returns up to ten, most recent last, and each carries the pre-registered reference block rather than a confidence score we made up.

The five events

Win rates below are measured on ES 5-minute data, 2010 to 2026, with symmetric ±3 ATR exit barriers. The baseline — the win rate of taking a position at any arbitrary wave flip — is 49.3%. Two events confirmed after Bonferroni correction and a same-sign check on both halves of the sample. Two came back reversed: the tradition reads them one way, the data reads them the other.

Event What the analyzer sees Measured ES win Verdict
cib_long A heavy-volume up wave, then a pullback on at most 40% of that volume. Change in behaviour: the sellers who should have answered the rally never showed up. 51.8%
n=13,867 · p=1.6e-5
Confirmed
no_supply_long A down wave whose volume dries to at most 25% of the recent median, and which fails to break the previous down wave’s low. Nobody is left to sell. 51.4%
n=23,077 · p=3e-5
Confirmed
cib_short The mirror image: a heavy-volume down wave followed by a feeble bounce. The tradition reads it as bearish. 48.6%
n=12,642
Below baseline
no_demand_short An up wave on at most 25% of median volume that fails to exceed the previous up wave’s high. The tradition reads it as bearish: no buyers. 45.6%
n=22,262
Reversed
sot_short Shortening of the thrust: each successive up leg travels less, in fewer bars, on less volume. The tradition reads it as exhaustion. 47.6%
n=9,427
Reversed

The reversals are a feature, not an embarrassment. Every bearish reading in this family lands below 50% on ES, and no_demand_short is the clearest case: the short side measured 45.6%, while going long after a no_demand event — the exact opposite of the traditional reading — measured 54.4% across the same 22,262 samples (p=8e-40). In a market with a long upward drift and a squeeze-prone structure, “this rally looks weak” is simply not a reason to be short. The API ships the measured number attached to the event, so your agent reads 45.6% and behaves accordingly instead of inheriting the folklore.

Honest framing on magnitude: 51.8% with symmetric barriers means gross expectancy is roughly the size of trading costs. An event on its own is not a trade. It is a weighting layer — which is how David Weis described using the method himself. Which brings us to the interesting part.

The combination finding

The strongest result in the entire project is not either read alone. It is what happened when a Weis event and a day-type read were required to agree. Take the confirmed bullish event cib_long, and only count it when the day-type model — the read /v1/brooks serves in its day_type block — read TrendUp on top:

ES · trained asset
56.5%
vs 50.8% in the opposite context — p=0.002
NQ · zero-shot
56.1%
vs 45.3% under TrendDown — +10.8pt, p=2e-6
QQQ · zero-shot
54.3%
vs 44.3% under TrendDown — +10.0pt, p=7e-5

Read the comparisons for what they are: context versus context, not gated versus ungated. On NQ, 56.1% (n=1,536) is the event under a TrendUp read and 45.3% (n=689) the same event under TrendDown; on QQQ the split is 54.3% (n=1,200) against 44.3% (n=592). Unconditionally on ES, cib_long runs 51.8% — the two contexts sit on opposite sides of that rate.

Zero-shot means the gate was never fitted on NQ or QQQ; the day-type model trained on ES was pointed at a different instrument and the same separation appeared. Two independent replications of a finding is the closest thing to evidence this field offers. The general principle underneath it: unconditional volume carries no information, conditional volume does. Five different ways of asking “does volume predict anything on average” came back null. Asking “does volume predict anything when this specific structure appears on this kind of day” came back positive immediately. The information lives in the condition, not in the feature.

This finding is why Weis remains inside the full plan rather than becoming a separate Weis-only product. The information lived in combining reads, not in volume alone. The full key opens Weis alongside Brooks price-action events and the options pair /v1/maxpain and /v1/gamma — $149 a month, the first 3 days free. Brooks can also be purchased alone for the AI-workspace workflow, but that smaller product does not unlock this endpoint. (The day-type read the study gated on is the day_type block of /v1/brooks, served for the day session; the study itself stays published on the methodology page.)

Get free API key Brooks Events API

Honest limits

The edge is asset-specific

We ran eight pre-registered transfer tests on Bitcoin. Zero confirmed. Worse, no_supply — one of the two events that works on ES — reverses outright on BTC to 48.3%. Gold and ETH show the same anti-signature under the same frozen test protocol. The edge belongs to index-type assets. Every response carries this warning in its disclaimer, and the reference block on no_supply_long repeats it, so an agent cannot miss it.

It needs real volume

The whole method is volume. If the data source returns no volume — some index feeds, some delayed quotes — the endpoint returns an explicit error rather than a plausible wrong answer. Spot FX is the permanent case: currency pairs trade over the counter, so no consolidated volume exists anywhere, and the endpoint declines them (the refusal is not charged). The CME currency futures do carry exchange volume — EURUSD → 6E=F, GBPUSD → 6B=F, USDJPY → 6J=F, AUDUSD → 6A=F. It also needs at least 120 bars of history to compute ATR properly.

Events need 46 waves

Event detection compares each wave to a rolling history of forty previous waves, so the analyzer must see at least 46 completed waves before anything can fire. On a quiet instrument in a short window you will get wave structure and a note explaining that more history is required, rather than a fabricated signal.

What errors and thin data look like

{ "error": "no volume data from source; Weis analysis requires volume" }

{ "error": "insufficient bars (98<120)" }

{ "waves_total": 31, ...,
  "note": "only 31 waves in window; event detection needs >=46 (more history required)" }

Who this is for

A good fit

  • People learning Wyckoff or Weis who want the classic patterns detected consistently instead of eyeballed, with the real base rate next to each one.
  • Agent builders who want a volume read their model can cite honestly, numbers included.
  • Anyone building a confirmation layer — the measured lift in this project appeared only under conditioning, in the day-type gating study published on the methodology page.

A bad fit

  • Crypto, gold and FX traders. We tested it; it does not transfer, and we will not pretend otherwise.
  • Anyone who wants a standalone entry signal. At 51.8% the edge is thinner than costs.
  • Anyone who wants the traditional Weis interpretation confirmed. Two of the five events come back reversed, and we print that on the box.

Frequently asked

What is a Weis wave?

A Weis wave is one swing of price with all the volume that traded during it added up. Instead of looking at volume bar by bar — where it is mostly noise — you segment the chart into up-swings and down-swings, then attach a single volume total to each swing. That lets you compare effort against result: a 20-point rally on 130,000 contracts and a 20-point rally on 40,000 contracts are very different events, even though the price chart looks identical. The idea comes from David Weis, who adapted it from Richard Wyckoff. Our implementation defines a swing with a volatility-scaled threshold — 0.3937 times the 60-bar ATR — so the same rule works on any instrument and any timeframe without hand-tuning.

Why does the API ship numbers that contradict the method it is named after?

Because that is what the data said. We pre-registered five event definitions, ran them over 16 years of S&P 500 E-mini 5-minute data with symmetric exit barriers, and applied a Bonferroni correction plus a same-sign requirement across both halves of the sample. Two bullish events confirmed. Two bearish events came back below 50%, which means the tradition has them backwards — on this market, "the rally looks weak" is not a reason to sell. We could have quietly dropped the failures. Shipping the measured number next to the event is more useful, and it is the whole point of paying for this instead of reading a forum post.

Does this work on Bitcoin, gold or ETH?

No, and we tested it properly rather than guessing. Of eight pre-registered transfer tests on BTC, zero confirmed, and no_supply — one of the two events that works on ES — reverses outright to 48.3%. Gold and ETH show the same anti-signature under the same frozen test protocol. The honest conclusion is that this edge belongs to index-type assets with a long upward drift and short-squeeze structure, not to crypto or metals. The endpoint will happily analyse BTC-USD waves and volume for you; the reference win rates attached to the events simply do not apply there, and the response says so.

Is a 51.8% win rate worth anything?

Not on its own. At 51.8% with symmetric barriers, gross expectancy is roughly the same size as trading costs, so an event alone is not a trade. It is worth something as a weighting layer: as a tiebreaker on a position you were already considering, or conditioned on context — in the pre-registered day-type gating study the measured rate rose to 56.5%. That matches how David Weis described his own use of the method — as interpretation, not a trigger. Anyone selling you a 90% volume signal is selling you a backtest artefact.

Is this investment advice?

No. Quant Data publishes descriptive analytics and developer tooling for people learning quantitative trading. The Weis Wave API reports wave structure, volume totals and historical base rates. It never returns a buy or sell instruction, a target or a position size. Trading involves risk of loss and past performance does not guarantee future results.

See the event stream in use: a QQQ trading strategy uses cib_long as its trigger — backtested over eight years, now running in a live paper account with every trade published, including the ones its gate declined.

Get a key

No login or card. One email gets a qd_ key with 10 successful calls per UTC day across all four endpoints. Upgrade to $149 a month when you need uninterrupted, batch or unattended access.

Get free API key Buy full API access

Paid access starts with 3 days free after a card is added. The Max Pain and GEX pages stay free and need no key at all.

See pricing →

Questions first? quantdata@quantdata.uk — a person reads it.

An agent can use the key but cannot buy one: the card check at the end of checkout has to be answered by the cardholder, so a person starts the subscription once and the agent takes it from there. And if you already hold one of the old single-product keys, it keeps working at the price you signed up at — email us and we will open the endpoints it is missing on the same key rather than have you pay twice.

Quant Data is an independent research project and is not affiliated with or endorsed by David Weis or any exchange or broker.