The Company File
A single company, graded on Buffett-style criteria as of its vintage year, then asked: what does the engine predict for the next decade — and why?
Company Lab
Build a profile from scratch — or start from a real company today: its grades pre-set the knobs, and you can argue with any of them. Disagree the leadership's a 4? Drop it to 2 and watch the forecast move. The engine predicts from whatever you give it: no required fields, no retraining.
Does the thesis hold?
Across — point-in-time company observations, which features most predict landing in the 'great' outcome bucket? An aito.relate query, ranked by lift.
News Reaction
A real event feed: every 8-K a company files is material news, timestamped, tagged by the SEC with an item code that is the theme. We measure how the stock reacts at +1 day, +1 week, and +20 days — and whether the first move continues or reverts.
| News theme | Events | Day-1 winners → 1d · 20d · 1yr | Day-1 losers → 1d · 20d · 1yr | 1-yr gap | Verdict |
|---|
The cohorts above split on the day-1 price — but a trader wants to anticipate that move from the content, the second the release hits. So we let an LLM read each earnings press release and extract the signals a human skims for — headline tone, beat/miss framing, guidance change, EPS direction — then ask which of them actually separate the reaction. Sorted by how much each signal moves the day-1 tape.
Factor Explorer
Every feature — LLM judgments, sector, valuation, growth, leverage, momentum — ranked by its lift toward the great bucket (upside) and toward poor / disaster (downside). A factor strong on one side and quiet on the other is a clean signal; one that lifts both is just volatility.
| Feature | N | Lift → great (upside) | Lift → poor/disaster (downside) |
|---|
Historical Analogues
Given a focal company, find historical observations with the closest feature profile. Then read what actually happened to them. A native Aito similarity query.
How good is it, honestly?
Every number here comes from Aito's _evaluate, which hides each test company from the model and scores its blind prediction — a random cross-year 5-fold split with no company in both train and test. No in-sample flattery.
Two bars to clear: guessing the most common outcome, and the naive "throw every feature at it." Accuracy is the easy one; information gain — do the predicted probabilities actually beat the base rate? — is the honest one.
Features added in order of individual usefulness (one held-out fold). Information gain peaks around — features, then erodes — extra features stop informing and start overfitting. The demo doing model selection in the open.
The figures above are the default-inference floor that _evaluate reports. The demo's live predictions use Aito's ai: high grouping mode, which collapses correlated features into single votes — on the full 16-feature set it lifts held-out information gain further (≈ +0.04 → +0.08 measured separately), i.e. "throw every feature at it," made calibrated.
Where does it fail?
Held-out predictions marked right or wrong, then loaded back into Aito. A single relate query asks: which input features go with the engine being wrong? Pick a bucket to scope it with $on. The same predictive database, pointed at itself.
Does it beat the market?
Accuracy is a lab number. The honest question is a fund. Take every held-out company, rank it by the engine's predicted expected outcome, buy the top N, hold to today. No look-ahead: folds are grouped by ticker, so a company never scores its own other-vintage result. Here is what the picks actually returned.
▏ black line = the equal-weight market (every graded company). Bars are mean total return over the holding window; the number to the right is annualized (CAGR).
On Methodology
Every line in this demo is reproducible. Every concession to imperfection is documented. The demo is the methodology; the numbers are the consequence.
Point-in-time universe
Constituents reconstructed from Wikipedia's historical S&P 500 edits as of January 1, 2014 / 2017 / 2020 — what an investor could actually have bought, not today's index. Each constituent is then tracked to its terminal state: still trading, acquired, or delisted.
The survivorship trap — and where we still half-fall in
The unit of analysis is a snapshot: grade a company from its filing at the vintage date, then observe what the position returned years later. A bankruptcy isn't a new data point — it's the outcome of a snapshot that already existed. The naïve study screens today's index and silently inherits the winners; we start from the point-in-time roster, so the Chesapeakes and Frontiers are present at vintage and graded from their pre-bankruptcy 10-K like any other name.
The leak is on the outcome side: our return source (yfinance) has no price history after a stock is cancelled, so a Chapter 11 that wipes out common holders returns null and would drop from every statistic — re-introducing the bias through the back door, this time hiding the losers. "Can't find the ticker → mark it gone" is the right instinct but unsafe alone: acquisitions vanish from the feed too, usually at a premium. So we resolve the reason a stock disappeared from its SEC record (Chapter 11 filing → common cancelled → booked at −100% from vintage to the filing date) and leave premium buyouts and take-unders to the price source. Scope is deliberately narrow — only confirmed equity-zeroing Chapter 11s (Frontier, Chesapeake, Windstream, Denbury, Diamond Offshore, Noble, Valaris, Rowan, Peabody). The disaster bucket now holds real −100% outcomes — but treat the absolute bankruptcy rate as a floor, not a census.
LLM grading discipline
Qualitative features extracted from contemporary 10-K and proxy excerpts only. Every prompt instructs the model to grade from the documents alone and not to use post-vintage knowledge. All four features are graded in a single structured-output call per company; rationale strings are preserved as explainability columns.
Lookahead stress test
The 2020 vintage is held out as a future-leakage probe. If feature lift is comparable across all three vintages, LLM lookahead bias is bounded. Reported in the calibration plot.
Outcome bucketing
Five buckets, not regression on returns. Aligned with how investors actually think (disaster / poor / market / good / great). Yields calibrated probabilities rather than meaningless point forecasts.
Why this is not a trading signal
Twelve-year horizon, ~800 observations, no microstructure features, no transaction cost model, no consideration of capacity. This is a hypothesis test about long-horizon business quality — not an alpha generation system. The demo's value is architectural, not financial.
The transferable lesson
The architecture — LLM-extracted qualitative features feeding a predictive database — generalises to any domain where unstructured judgment meets structured outcomes. Credit underwriting, M&A diligence, talent assessment, supplier risk. Equity research is the vehicle, not the destination.
- · SEC EDGAR (10-Ks, proxies, point-in-time)
- · Wikipedia historical S&P 500 constituent edits
- · yfinance (prices, returns, survival)
- · SimFin free tier (fundamentals)
- · OpenAI gpt-5-mini for LLM feature extraction
- · aito.ai predictive database
- · Single endpoint, no training pipeline
- · Open repository: aito-equity-demo
Live Query
The same engine, the same endpoint, the same wire format you'd hit from your own code. Edit the body, hit Run, see the response and timing. Copy the curl and walk away with it.
/api/v1/_predict directly works here, as long as from = "companies".
// run a query to see the response
The Universe
Every (ticker, vintage) row the predictive database holds. Filter by sector, vintage, or outcome bucket; sort by any column. Companies graded by the LLM show their qualitative grades; those without grades show the realised outcome only.