Methodology
This page exists so you can argue with us. Every figure quoted anywhere on this site is produced the way it is described here, and where a test failed, the failure is written down in the same detail as the successes.
Three rules everything follows
- Held-out years. A model is never scored on data it was fitted to. We split by calendar year, not by random rows — shuffling intraday bars leaks tomorrow into today and inflates everything.
- Pre-registration. For the claim and event tests, the rule, the entry, the barriers and the success definition are all written down before the outcome is computed. This is what stops you from quietly trying eleven variants and reporting the one that worked.
- Publish the failures. A win rate is only informative if you know how many things were tested. The failures are on this page in the same tables as the confirmations.
The day-type model
A day type is a coarse description of how a session behaved: did it trend one way all day, chop sideways, grind upward inside a channel, or reverse. Experienced chart readers name these on sight. The model does the same thing, in probabilities.
- Data. S&P 500 E-mini futures (ES), minute bars from 2010 to 2026, resampled to 5-minute bars, sliced into US regular-hours sessions. Roughly 3,900 sessions.
- Labels. Five classes — TrendUp, TrendDown, Range, TrendingRange, Reversal — assigned from the shape of the completed session. The majority class covers 37% of days, which is the baseline any honest accuracy number has to beat.
- Features. 18 per-bar values describing where price sat within the session so far, how far it had travelled, and how the current bar related to the previous session's close. No indicators, no news, no order-flow data.
- Model. A small sequence classifier — 3 layers, width 96, dropout 0.15 — that reads the session's bars in order and pools them. It is deliberately small: with a few thousand labelled sessions, a bigger model would memorise rather than generalise.
- Calibration. Raw classifier scores are overconfident. We fit a single temperature parameter on validation data so the stated probability matches observed frequency. Measured calibration error is under 10 percentage points, meaning when the API says 70% the outcome happens roughly 70% of the time.
Results, on years the model never saw
The 90-minute number is the one that matters for live use, and it is the smaller one. Two hours into a session the market has not decided yet, and a model that claimed otherwise would be lying.
Single stocks are out of distribution. The model was fitted to index futures. When you
call /v1/read/NVDA it will answer, because comparing your own read against it is a
useful exercise, but that answer has not been validated on single-stock behaviour and carries
no accuracy claim. Same for Hong Kong listings, A-shares and non-index futures: descriptive
only.
The price-action claims fact-check
Trading courses are full of confident probabilities. We took the ones that are specific enough to be testable, wrote each as an explicit rule before measuring anything, and ran it over 3,946 ES trading days of 5-minute data, 2010–2026.
| Claim | Traditionally quoted | Measured |
|---|---|---|
| 90 minutes after the open, one of the day's two extremes is already set | 90% | 81.2% |
| On a bull day, the low of the day forms early in the session | 90% | 83.3% |
| After an opening-range breakout, the opposite extreme holds | 90% | 83.5% |
| Trading-range breakouts fail (the famous "80% rule") | 80% | 52% / 62% / 70% |
The last row is measured within 5, 10 and 20 bars respectively — the claim's truth depends entirely on how long you are willing to wait, which the claim never says.
Meta-verdict: the directions are right and the numbers are inflated, consistently, by
roughly 7 to 10 percentage points. That is a useful thing to know about an entire genre of
teaching material. It is also, quietly, a compliment: these were people describing real market
behaviour from memory, and they got the sign right every time. The measured rates ship in
/v1/claims so an agent can quote the tested number rather than the folklore one.
Weis Wave events
A Weis Wave chart throws away the time axis and groups price into up-waves and down-waves, labelling each with the total volume that traded inside it. The idea, from the Wyckoff tradition, is that a rally on shrinking volume and a sell-off on heavy volume mean different things.
Wave construction
- A close-price zigzag: a new wave begins when price closes more than a threshold away from the running extreme in the opposite direction.
- Threshold = 0.3937 × ATR(60). Using a multiple of average true range rather than a fixed number of points makes the wave definition scale-free, so the same rule works on a $4 stock and on Nasdaq futures without retuning. The coefficient itself was calibrated once on ES and then frozen — it is not refitted per symbol, which is the whole point of the cross-market tests below.
- Each completed wave records direction, cumulative volume and price displacement.
The five events
- cib_long / cib_short — a wave with unusually heavy volume and displacement, immediately answered by a much lighter wave in the other direction. The "counter-attack" shape: a big push that fails to follow through.
- no_supply_long — a down-wave on notably light volume: nobody is pressing the sell side.
- no_demand_short — the mirror image: an up-wave on light volume, traditionally read as a warning that the rally is unsupported.
- sot_short — the shortening-of-thrust family: successive pushes covering less ground.
How they were tested
Pre-registered before measurement: entry on the event bar, symmetric barriers at ±3 × ATR, and a win defined as reaching the barrier in the event's claimed direction first. Run over ES 5-minute data, 2010–2026, with multiple-comparison correction across the family of events.
| Event | Win rate | n | p | Verdict |
|---|---|---|---|---|
| cib_long | 51.8% | 13,867 | 1.6e-5 | Confirmed on ES |
| no_supply_long | 51.4% | 23,077 | 3e-5 | Confirmed on ES |
| cib_short | 48.6% | 12,642 | — | Not confirmed |
| no_demand_short | 45.6% | 22,262 | — | Reversed |
| sot_short | 47.6% | 9,427 | — | Reversed |
Two of the traditional short signals did not merely fail to work — they came out reliably below 50%, which on a symmetric test means the opposite side was winning. Read carefully: the inverse reading was not pre-registered, so we treat "no-demand is actually bullish information on ES" as a hypothesis produced by this data, not as a confirmed edge. It is in the API as a measured rate with that caveat attached, and nothing more.
A pattern worth noticing: every bearish event underperformed on an index that spent 2010–2026 mostly rising. Some of this is a genuine asymmetry in how index futures behave; some of it is a bull market. We cannot fully separate the two, and we are not going to pretend otherwise.
The one result that replicated: day type as a filter
The strongest finding on this site is not either product alone. It is the day-type read used as a gate on a Weis event — only taking the bullish counter-attack when the model reads the session as trending up.
| Market | Gated | Ungated / opposite | p | Status |
|---|---|---|---|---|
| ES · S&P 500 futures | 56.5% | 50.8% | 0.002 | Trained asset |
| NQ · Nasdaq futures | 56.1% | 45.3% | 2e-6 | Zero-shot |
| QQQ · Nasdaq ETF | 54.3% | 44.3% | 7e-5 | Zero-shot |
Zero-shot means no retraining, no refitting, no per-market threshold tuning: the ES-calibrated model and the ES-calibrated wave threshold pointed at a market they had never seen. That is the test that most published trading research quietly skips, and it is the reason we put more weight on a 54.3% here than on an 80% from a backtest fitted in place.
Where it fails
Gold, Bitcoin and Ethereum share an anti-signature. The same events run on these markets do not merely weaken, they invert — on BTC, zero of eight pre-registered signals confirmed, and no_supply runs the wrong way. Whatever the ES/NQ/QQQ signature is measuring, it is a property of index-type equity markets, not a law of markets.
Classical chart patterns did not survive. We ran Bulkowski-style detectors over 16 years of intraday index-futures data, producing more than 121,000 detections, then trained a model to predict each detection's outcome. AUC 0.54 — barely distinguishable from a coin flip. Pattern shape alone, in this data, carries almost no outcome information.
The Asian session is a pre-registered NO_GO. We tested whether the day-type gate carries into the Asian overnight session on 24-hour futures. It was registered in advance, it did not meet the threshold, and the verdict stands as NO_GO. The API defaults to the US day session for exactly this reason.
Max Pain and the options metrics
The free Max Pain pages are computed, not scraped from anyone's dashboard. Here is precisely what each number is.
- Source data. End-of-day option open interest per contract, for expirations out to about 45 days, plus the end-of-day underlying price. Open interest is the number of contracts currently outstanding at each strike — a slow-moving positioning measure, not a trade feed.
- Cadence. Recomputed nightly after the close. The pages are static and read a stored file, so if a data pull fails the page keeps the previous day's numbers and shows their date rather than going blank or silently drifting.
- Scope. Derived metrics only. We do not redistribute raw quotes or full option chains.
Max pain
Max pain is the settlement price at which the largest amount of open option value expires worthless — equivalently, the price that minimises the total payout option sellers owe option buyers.
For every candidate settlement price K:
payout(K) = 100 * [ SUM over call strikes X of max(K - X, 0) * call_OI(X)
+ SUM over put strikes X of max(X - K, 0) * put_OI(X) ]
max_pain = the K that minimises payout(K)
100 is the contract multiplier. Computed per expiration, over the strikes
that actually have open interest. What it is not: a forecast. It is an arithmetic property of today's open interest, it moves as open interest moves, and the well-known tendency of price to sit near it into expiration is a weak statistical regularity with a contested explanation — not something to trade off on its own.
Put/call ratio and the walls
The put/call ratio here is open-interest based: total put open interest divided by total call open interest for that expiration. The call wall is the strike carrying the most call open interest, the put wall the strike carrying the most put open interest. They are where positioning is concentrated, which is worth seeing, and nothing more than that.
Gamma exposure (GEX)
Gamma measures how fast an option's directional exposure changes as the underlying moves. Gamma exposure aggregates that across every open contract to estimate how much hedging flow a 1% move would mechanically generate.
Per contract i, at end of day, with spot S:
1. solve Black-Scholes for the implied volatility that reproduces the
contract's end-of-day price
2. take gamma at that implied volatility
3. GEX_i = gamma_i * OI_i * 100 * S^2 * 0.01 (positive for calls,
negative for puts)
Net GEX = sum of GEX_i. Contracts whose open interest and quote disagree,
or where the IV solve does not converge, are dropped rather than guessed.
Gamma flip = the price level where net GEX(x) crosses zero, searched on a
grid from 0.9*S to 1.1*S, taking the crossing nearest spot. Sign convention: calls positive, puts negative, which is the common dealer-long-calls convention. Net GEX above zero is usually described as a dampening regime and below zero as an amplifying one. Treat that as a widely used heuristic, not as something we have independently verified — we publish the computation, not a claim about what it predicts.
Cross-check. The pipeline was validated against optioncharts.io on SPY and matched on 15 of 15 expirations before any of this went live. We compute gamma ourselves rather than reading an upstream field, so this check is what stands between the formula and a silent error.
What none of this tells you
It does not tell you what to buy, when to enter, how much to size, or where to stop. It has no view on your account, your horizon, or your risk tolerance, and it never will — that is the line between analytics and advice, and it is not a formality.
It also does not tell you that a 56% base rate is profitable. Costs, slippage, the distribution of winners against losers, and your own behaviour all sit between a base rate and a result. A real edge of a few percentage points is a starting point for research, not a conclusion.
If you find an error in anything on this page, email us. Corrections get published.
Convinced by the method?
If the numbers above are the size you expected from an honest test, the API is $30 a month per product and $50 for both.
Email quantdata@agentmail.to See pricing
No signup form, no card on this site. Keys are issued by hand, one at a time. Max Pain pages stay free and need no key at all.