From what happened to why it happened
A market database is very good at what. Which stocks fell more than 4% today, how rare that was for each of them, what followed the last three hundred times. EquationDB has answered those in one statement for a while. The question people ask next is the one a table of prices cannot answer by itself: why did it move?
Today that question usually goes to a headline, and the headline is usually written after the move by someone who needed a reason. We wanted the database to answer it with the same discipline as everything else in it: numbers, a method you can read, and a statement that reproduces each claim. This article introduces WHY.
An evidence engine, not a storyteller
WHY takes a move and returns the explanations the data can support. It measures how much of the move each one accounts for, ranks them, and then reports what is left as unexplained.
WHY NVDA LAST 5d
The result is a table. The first row is the move. Then come the drivers, each with its contribution in percentage points, its share of the move, a confidence, a sentence of evidence and a statement. The ranked rows add up to the move exactly, and the last of them is always Unexplained. Rows below that are context: evidence that says something about the move but is given no share of it.
Three rules shape everything else.
- No cause without evidence. If the database holds nothing that accounts for a move, the answer is "unexplained", with its size. That is a correct answer, and often the honest one.
- No hindsight. Sensitivities are estimated only on sessions before the move.
- Every row can be checked. Each driver carries the statement that returns its evidence.
How a move is split
The market, the sector, the themes. A stock rises with the market, with its sector and with the themes it belongs to. WHY measures each of those in order: the market first, then the sector's move beyond the market, then the industry's beyond the sector, then each theme's beyond all of them. EquationDB's own taxonomy and themes matter here: NVIDIA is compared with semiconductors and with the AI-infrastructure theme, each of which has its own index. The stock is removed from an index before it is compared with it, so a company in a five-member group does not explain itself.
The betas come from the 250 sessions before the window. A beta that cannot be told apart from zero is not used at all, and the result lists the factors that were tried and dropped.
The mechanical part. On an ex-dividend date the price falls by the dividend. That part is exact and is shown as its own row.
Company events. For an earnings report, WHY uses the convention of an event study. The part of the session's move that the factors do not explain is the abnormal return, and that is credited to the report: never more. The evidence shows the EPS surprise, how the stock reacted to its earlier reports, and how far the abnormal move stands outside an ordinary day. If nothing stands out, the report is listed as context and gets no share.
EARNINGS NVDA LIMIT 6
In the app, every row of that result has a Why? button that opens WHY NVDA ON <the report date>.
A rating change is treated more cautiously. It is credited only when the stock moved in the rating's direction by more than an ordinary day, and never with high confidence, because a rating dated the same day can follow a move as well as cause it.
Connected companies. Suppliers, customers, competitors and partners come from the graph. When one of them moves far beyond the market, WHY checks whether the two have moved together before. If the link is measurable it is credited with a share. If it is not, the neighbour's move is shown as context, with the sentence "no share of the move is credited".
Context. Stored events with their rarity, volume against normal, how much of the move was already in the opening price, the shape of the session where one-minute bars exist, and precedent: how often the stock has moved this much, and what followed the earlier times whose outcome was known before this one.
What the answer looks like
This is the ranked part of a one-session result on our demo dataset (synthetic prices, so read the shape, not the numbers):
| rank | driver | contribution | share | confidence |
|---|---|---|---|---|
| 1 | Semiconductors | -0.43 pp | 17% | low |
| 2 | Market | -0.21 pp | 8% | high |
| 3 | Artificial Intelligence theme | -0.16 pp | 6% | medium |
| 4 | Unexplained | -1.76 pp | 68% |
Two thirds of that move has no explanation in the data, and the result says so, adding that 1.76 points is within the stock's normal unexplained range. A storyteller would have found a reason. An evidence engine reports that there is none on record, and that no news source is connected.
Shares can be negative: a market that rose while the stock fell worked against the move, and the other rows then add up to more than 100%.
It is still a table
A WHY result can be filtered, sorted and joined like any other.
SELECT driver, contribution_pp, share_pct, confidence FROM (WHY NVDA LAST 1mo) WHERE rank >= 1 ORDER BY abs(contribution_pp) DESC
It also works inside a script. This explains the five largest moves of the session in one request:
LET movers = GET us.movers SELECT symbol, ret SORT abs(ret) DESC LIMIT 5; FOR EACH s IN movers WHY $s LIMIT 4
Themes, sectors and events
The target does not have to be a stock.
WHY TH.AI.INFRA LAST 1mo
For a theme or a sector the factors are the market and the parent theme, and the result adds a composition view: how many members rose, whether the move was broad or carried by a few names, and which members added most. Each member has its own Why?, so you can walk from a theme to a company to that company's supplier.
A stored event works too. EVENTS returns an id in its first column, and WHY evt_… explains the move of that symbol on that session.
In the app, and for agents
Explore › Why shows the result as a panel: the move, a waterfall of where it came from, the ranked drivers, and a list of every source that was looked at, including the ones that could not be. Opening a driver shows its evidence and an Open in Query link for the statement behind it.
There is an optional Explain in words (AI). The model sees only the evidence table. Every number and company name in its text is then checked against that table; if the check fails, you get the database's own summary instead, which is built without AI. The unexplained part and the missing news source are always in the text.
Agents get the same result through the xeno_why tool, with one instruction: quote only what is in the rows.
What it cannot do yet
It cannot read a headline. Earnings-call transcripts are stored but not yet interpreted. It does not say which of two connected stocks moved first within a session. A company's sector and themes are today's, applied to past dates. And a stock with less than three months of history gets no factor split at all. Each of these is stated in the result when it applies.
Text sources, intraday attribution and portfolio-level answers are next. The rule will not change: a cause is only named when the evidence for it can be shown.
Start with a stock you watched today: open Why, or run WHY and its ticker in Query. The reference is WHY.