The dream, stated plainly: build a point-in-time dossier of a company before an earnings call (or any event), pair it with the realized post-event return, and train a transformer on that corpus to predict the reaction. The whole bet rests on one idea — that markets price the change in expectations about the future, so the features have to capture forward posture, not just what a company already did.
Last quarter's numbers — the beat, the margins — set the bar. The stock moves on the delta off that bar: raised guidance, an expansive tone, a capex commitment, a "we're in talks to…". A great past with a cautious future falls; a good past with an expansive future runs.
The arithmetic on "a report before every earnings call for 20 years": ~10–15k names × ~4 events/yr × 20 yr, filtered to usable (price history + PIT-clean features) ≈ 200–400k labeled examples. That's the ceiling — and it reframes the whole project, because the answer to "is it enough" is entirely about which model:
| Model | Data it wants | 400k enough? |
|---|---|---|
| Gradient-boosted treesthe quant workhorse for tabular returns | 10k–1M rows | plenty |
| Small tabular transformerFT-Transformer | 100k–1M | workable |
| Fine-tune a PRETRAINED modelon the raw dossier text | 1k–10k+ | plenty |
| Transformer FROM SCRATCHthe naive reading of "the dream" | millions–billions | no — wrong tool |
Row count isn't even the binding constraint — three things are: signal-to-noise (returns are ~98% noise, good models get R²≈0.01–0.05 — this IS the "priced in" problem quantified), non-stationarity (20 years = many regimes; old data helps less than its count suggests), and feature sparsity (our agreements signal is non-null on only ~10–20% of rows, and the informative divergence subset far fewer).
The reframe: the goal was never "train a transformer" — it's "do the forward features beat a baseline out-of-sample?" That's testable now with GBMs + event studies (§07) on thousands-to-tens-of-thousands of clean rows, not a transformer's worth. The corpus is a valuable labeled research asset regardless of the final model; the transformer is the endpoint (fine-tune on text), not the test. Aim GBM-first, transformer later.
Freeze a company as-of the day before its call and read it across a handful of PIT dimensions. Worked example — Applied Materials (AMAT), frozen 2026-08-05, reports ~08-13 (semis-equipment: a pure forward-narrative name that also gets read-through from every chip name that already printed):
| Dimension | Reading (PIT as-of 2026-08-05) |
|---|---|
| Track recordbackward | Beats own trend 7 of 8 quarters; latest SUE +1.44, revenue SUE
+2.31; sue_trend −0.12 (slightly
decelerating) |
| Reaction patternPEAD base-rate | Sell-the-news, then grind up — recent beats printed negative day-1 (−14.3%, −6.5%) yet the 41-day drift after a positive SUE is +1,329 bps. The print is a poor guide; the drift is the signal. |
| Forward wordstheir own filings | Expansive but hedged. Hard guide: "grow our semiconductor equipment business over 20 percent this calendar year" · secular: "large-scale adoption of AI will drive substantial investment… in the years ahead." But the latest 10-Q hedges: "the timing and amount of investments by our customers related to AI… is difficult to forecast." |
| Insider postureForm 4, discretionary | Lightening into it — net −$170M discretionary, 5 C-suite sellers (CEO $105M), zero buyers, not 10b5-1 (partly monetizing a big run) |
| Tape read-throughnews / peers | Cautious near-term — "Micron, SK Hynix stocks sink as AI chip sell-off deepens" (07-28); a cyclical air-pocket against the secular story |
The read: a structurally strong, secularly-favored name whose forward posture is expansive-but-hedged, that reliably dips on the print and drifts up after — walking in with insiders trimming and a wobbly chip tape. The whole setup is one tension: secular AI-capex bull vs cyclical wobble. That tension is the pre-announcement state.
Assembling the AMAT fingerprint from tools that already exist surfaced two things that turn "research project" into "data-assembly job":
Every forward sentence AMAT filed fired ARGOS classifiers — is_backlog_building is_demand_accelerating is_deal_size_increasing versus is_customer_spending_declining is_demand_softening is_bookings_deceleration. Those are directional forward-posture tags, cooked across ~8,000 companies. We don't build sentiment from scratch — we aggregate them into a posture score per filing, PIT. The expansive-vs-cautious delta is already in the data.
earnings_surprise_history returns the pre-event fingerprint (beat rate, SUE, posture)
and the realized abn_drift_41_bps that follows — PIT-validated (+106 bps, t 5.9). So a
training pair is: freeze the as-of-T-1 fingerprint → label = the drift after. Loop over
(company, quarter) and the corpus writes itself.
Everything forward in the fingerprint so far is soft — tone classifiers, news narrative, even guidance (the company's own projection). Signed agreements are the hard version: a costly, bilateral, binding commitment about the future. Cheap talk gets discounted; a signature doesn't. On the forward ladder they sit above even guidance revisions — a revision is still the company's own forecast; an agreement is a fact a counterparty also signed.
Most signals give you one. A signed agreement gives domain (8-K material agreements /
exhibits) × deterministic extraction (value, term, start date, milestones — numbers, not
sentiment) × linkage (it's inherently a customer_of / supplier_of /
partner_of EDGE — the #1 commercial-edge wishlist, minted with hard evidence instead of scraped
from rumor).
Why it maps straight onto earnings:
"in talks to acquire" news phrase is the rumored version; a signed agreement is the
consummated, hard-evidence one.Status: in progress — the agreements project (+ kee) is pushing hard on processing; the dataset isn't built up yet, so this is a wired-in-waiting feature, not a live one.
Agreements are the top of a ladder. Just below them sits a signal the sections project is well-placed to extract: forward plans stated in filings — "we plan to open a factory next year," "we intend to enter the EU market," "we expect to bring $400M of capacity online." Softer than a signature (unilateral, not binding) but far harder than a CEO on a call: written, specific, dated, liability-bearing. It fills the exact middle of the forward ladder:
is_backlog_building …) we already haveStated plan → signed commitment → realized result. Line those up by date and you can measure whether a company actually converts what it says into what it signs into what it delivers — a per-company credibility score. If X converts 80% of its stated plans into signed deals within a year and Y converts 20%, then X's next "we plan to…" is a real signal and Y's is discountable. We calibrate the softness empirically instead of guessing — the same move as the priced-in note, pointed at the company's own honesty. This feature only exists if both projects run.
Graph-native the same way agreements are: a stated plan is a forward-event edge
(plans_facility_in / intends_to_enter / plans_to_acquire) — the
pre-signature version of the agreement edge, so the graph captures the whole lifecycle.
The hard part: filings drown in PSLRA boilerplate ("this document contains forward-looking statements…"). The job isn't finding forward language — it's everywhere — it's isolating the specific, actionable plans (a real what/where/when) from the legal fog and vague aspiration ("we seek to grow"). That specificity filter is the quality bar.
The obvious objection to any forward signal: how much is already priced? It's real — but it's the same truth the thesis rests on. The signal is never the level, it's the surprise — an agreement (or a guide, or a tone shift) only matters to the degree it beats what was already expected. So "priced in" isn't a new problem; it's the delta-off-the-bar we're already built around.
We train on the realized forward drift, so the model learns which signals, in which contexts, actually moved the stock. One that was already priced shows ~0 forward return → the model discounts it; one that wasn't → it moves → the model weights it. We never define "priced in" a priori — we learn the empirical residual. And we label on the drift after the initial pop, not the pop itself — the pop may be efficient, but the slow re-rating is exactly where the market is late (the same reason PEAD exists).
And structurally, agreements are less priced than most signals:
And the "everyone has a different impact estimate" worry flips into the opportunity: for EPS there's a tight Street consensus, so only the surprise moves the stock; for agreement impact there's no consensus number, so the market's expectation is fuzzy and slow to converge — no consensus estimate = no efficient price.
Honest caveat: big, well-covered names with headline deals are priced in seconds — no edge there. The edge is the tail, the read-through, and the flow-delta. So we aim the features at those regimes — an own-history "unusually big for this company" surprise (same shape as earnings SUE) + a coverage proxy for how un-watched the name is — and let the label sort the rest.
The "priced in" section says a signal only pays where it diverges from the price. This is the cleanest place to look for that divergence, and the first falsifiable experiment the agreements layer makes possible:
A low multiple means the market is skeptical or not watching. Improving contracts mean the forward reality is getting better. That gap is maximum divergence between price and forward-fact — the un-priced corner. If the signal works anywhere it's here, not in a priced-for-perfection name (AFRM), where a new contract just confirms the multiple and adds nothing.
Two design points that make it real (and both are why the 2024–2025 backfill matters):
| Screen component | Definition | Needs |
|---|---|---|
| Valuation filter | Low P/S and/or P/E (skeptical / under-watched) | price panel |
| Contract-quality Δ | Mix-shift → commercial, ↑amount, inflow, credible counterparty — vs the filer's own baseline | agreements census incl. 2024–25 |
| Immediate reaction | abnormal return [0,+1d] around filing | price panel |
| Drift | abnormal return [+2,+40d] | price panel |
The gating dependency: price data shows up in three places — the low-P/S filter, the [0,+1] reaction, and the [+2,+40] drift — so even the screen's entry filter needs it. Both prerequisites are in flight: the agreements 2024–2025 backfill is running (was ~5–9% of census in the past vs ~census in 2026); the event-return price panel (atlas) is the remaining gate. When both land, this is the first scoreable test of the whole thesis.
semantic_search nails a company's own forward words cleanly; classifiers = the posture tags (Discovery 1).
Beat rate, SUE, PEAD drift base-rate — and the realized abn_drift_41 label (Discovery 2).
Discretionary buy/sell breadth into the print — the "5 C-suite sold, 0 bought" tell.
14.6M rows via tunnel; lexical is noisy for concepts → we embed a narrowed slice. Precise for phrases ("in talks to acquire").
Commercial / relational edges — read-through a supplier's print onto a customer; forward statements mint the edges.
Signed contracts = binding forward commitments (value / term / counterparty). Land as typed MARS edges → free pickup by the catalog walk. Dataset building now.
Structured forward events from filings ("open a factory," "enter market X") — the ladder's middle. Pair with agreements → follow-through credibility. Note out to the sections team.
as_of / filed_before
cutoff, and post-publication enrichment is suppressed. A fingerprint built "as-of T-1" must contain only what
was knowable then. (This is exactly why we asked signals to bake in as_of, and why we won't
hand-roll SQL against their DB.)Every call is stamped as-of, direction + confidence, logged, then scored against the realized reaction. The scored log is the training corpus.
Next steps, in order:
{as-of fingerprint → realized drift} rows, so the training set is visible and real.outcome in pre_earnings_calls.jsonl.Open risks: overfitting the past (out-of-sample discipline); the analyst-consensus gap ("beat" = own-trend, not Street — a known hole); news lexical noise (needs our embeddings); corpus coverage holes (specialist trade press thin).