What an AI can and cannot tell you about a stock
The useful part is not the verdict. It is that a model given real data has to quote it — and quoted numbers can be checked.
Most AI-for-investing products fail in the same place. They put a language model in front of a chat box, give it whatever it already learned during training, and let it produce fluent paragraphs about companies. The output reads well and cannot be checked, which is the worst combination available.
Here is what we found actually works, and what does not.
What does not work: asking the model what it knows
A model’s training data has a cutoff, no dates attached to individual facts, and no way to distinguish something it read once from something it read a thousand times. Ask it about a company’s margins and it will answer confidently with a number that was true at some point, or nearly true, or true of a competitor.
There is no repair for this at the prompt level. “Be accurate” is not a constraint, it is a wish.
What works: give it the data, and make it cite
Our assistant receives an evidence pack assembled per request: identity, live price, technicals, price history, fundamentals, SEC filing facts, insider transactions, institutional positions, short interest, macro, the earnings calendar, news, and any measured base rates that apply. Eleven blocks, each number carrying its own date.
Then one rule does most of the work: quote the figure behind every claim.
The effect is not that the model becomes smarter. It is that its output becomes falsifiable. An analysis that invents cannot be caught. One that cites can.
We found that out the useful way. Asked about NVDA, the assistant reported a net margin of 720% — trailing revenue of $16.7bn against net income of $120.1bn. That is not an AI error. It is a defect in our twelve-month aggregation, and the model surfaced it by quoting the numbers it was given. We checked: 116 issuers out of 3,279 had net margins above 100%, and 286 below −500%. There is now a plausibility check that marks the block unusable rather than reasoning on it, and the upstream fix is still open.
A model that had summarised in prose would have written a fluent paragraph about NVIDIA’s exceptional profitability and nobody would ever have known.
What works: telling it what is missing
This is the part almost nobody does, and it is the most important.
If a block of data is absent for a ticker, the pack declares it absent. It does not silently omit it. The difference is enormous: a model that sees no insider data reads it as “nothing happened”, which is a claim, and a wrong one.
The output then carries a coverage figure and a list of blocks present and missing. On the SPY example published on our AI page it reads 67%, with fundamentals, insider, earnings and base rates listed as missing. That number makes the analysis less impressive and considerably more usable.
What we deliberately do not do
No entry price. No exit. No position size. No reference to your situation.
This is enforced in the output schema, not requested in the prompt — the JSON the model is constrained to produce has no field to put an instruction in. A prompt saying “do not give advice” is a request the model can drift away from over a long generation. A schema without the field is a generation constraint.
The reasoning is the product. The instruction would be a liability, and a worse product besides: a number to obey is worth less than an argument you can disagree with.
What we learned about the model itself
Three things, all discovered by reading output rather than by any test passing or failing:
Reasoning tokens break structured output silently. With a JSON schema
enforced, a model that emits thinking tokens produces an empty response. The
request succeeds. Three hundred tokens are spent. content is null. Disabling
thinking on schema calls: 24 tokens, 1.1 seconds, valid JSON.
Classifiers need testing on both classes. Our topic gate had a token budget of 8, which the model spent entirely on thinking without ever emitting the label — so it fell through to its default every single time. Measured: 4 of 9 correct, and the four were only correct because the default happened to match. With thinking disabled: 16 of 16. A gate that always answers the same thing looks like it works until you test the other case.
Confidence must not come from the model. A language model reporting “80% confident” is right about 55% of the time. Ours emits a three-step label, and the real percentage comes from measured base rates: not “I am confident” but “in 446 comparable cases since 1990 this happened N% of the time, t = X”.
The assistant is callable from any screen in the product — a chart, a filing, a currency pair, a flow table — and it analyses what you are looking at.
