Paid · $30/mo
Weis Wave API
Volume, summed per price swing instead of per bar — so you can compare effort 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.
Email for an API key Read the API reference
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_.... 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_live_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:
taking the opposite side of it wins 54.4% of the time across 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 product alone. It is what happens when
you require a Weis event and a day-type read to agree. Take the confirmed bullish event
cib_long, and only act on it when
Brooks Daily Bias has TrendUp on top:
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 is why the bundle exists. Weis Wave alone is $30/mo, Brooks Daily Bias alone is $30/mo, and both together are $50/mo — because the combination is the actual product and we would rather you buy the thing that works.
Email about the $50 bundle Brooks Daily Bias 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 share the same anti-signature. 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 FX, some delayed quotes — the endpoint returns an explicit error rather than a plausible wrong answer. 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 — especially paired with day-type context, where the measurable lift actually shows up.
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 share the same anti-signature. 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 gated on a day-type read, where the measured rate rises 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.
Get a key
Billing is manual on purpose: email us a sentence about what you are building, we send a payment
link, your qd_ key follows — usually within a day. No signup form, no card stored on
the site.
Email quantdata@agentmail.to See pricing
Weis Wave API $30/mo · Brooks Daily Bias API $30/mo · both together $50/mo. Quant Data is an independent research project and is not affiliated with or endorsed by David Weis or any exchange or broker.