Headline numbers from an earnings release are priced in within seconds. The language around those numbers is not. How management describes a miss, how defensively a CFO answers a margin question, how often "uncertainty" creeps into prepared remarks - this is signal that sits in plain sight, and it's extractable at scale with a sentiment model. Quant desks have run this play for years; the tooling has now become accessible enough that a single developer can build a credible version.
Here's the full build, step by step: sourcing transcripts, preprocessing, choosing a modeling approach, labeling, training, evaluation, and putting the output to work.
Why Transcript Tone Is Worth Modeling
Three properties make earnings call language a useful input:
- Word choice is deliberate. Executives rehearse these calls. A shift from "strong demand" to "stabilizing demand" is rarely accidental.
- Tone leads price. Sentiment expressed on a call often front-runs the market's fuller digestion of the quarter, particularly for mid- and small-caps with thin analyst coverage.
- Q&A is unscripted. Prepared remarks are polished; answers under questioning are where hedging, deflection, and genuine confidence leak through.
A sentiment model converts these qualitative reads into numbers you can backtest, rank, and combine with fundamentals.
Defining the Model
An earnings call sentiment model takes transcript text and emits polarity scores - typically positive/negative/neutral, or a continuous score - at one or more levels of resolution:
- Per sentence or utterance, for fine-grained analysis
- Per speaker, separating management tone from analyst tone
- Per call, as a single aggregate for screening and ranking
Which resolution you need depends on the downstream use: a screening tool can live on call-level scores; a research tool benefits from speaker-level breakdowns.
Step 1: Get the Transcripts
Everything downstream inherits the quality of this step. You want transcripts that are complete, historical, and - critically - speaker-attributed, because "who said it" is a first-class feature in this domain.
EarningsAPI covers 250,945 earnings calls across 12,728 companies, already decomposed into 11.9 million speaker segments with roles attached. Fetching a call's segments looks like this:
import requests
resp = requests.get(
"https://earningsapi.io/api/v1/speakers",
headers={"X-API-Key": "YOUR_KEY"},
params={"ticker": "NVDA", "role": "Executive"},
)
segments = resp.json()["results"]
Pull several years of history for your target universe - sentiment models need enough quarters per company to learn what "normal" sounds like. The full endpoint reference is at /docs.
Step 2: Preprocess
Even clean transcripts need conditioning before modeling:
- Lowercase and strip punctuation (for classical approaches; transformer tokenizers handle their own casing).
- Drop operator boilerplate ("Our next question comes from...") - it's noise in every call.
- Decide what to do with stop words: remove them for bag-of-words features, keep them for transformer inputs.
- Tokenize, and lemmatize if you're using frequency-based features, so "declined" and "declining" collapse to one signal.
spaCy or NLTK handles all of this in a few lines. Keep the preprocessing pipeline versioned - silent changes here are a classic source of irreproducible results.
Step 3: Pick an Approach
Dictionary-based scoring
Match words against a polarity lexicon and aggregate. Fast, transparent, zero training data required. The catch: general-purpose lexicons misread finance. "Liability" is neutral vocabulary in a 10-K discussion; VADER thinks it's bad news. If you go this route, use the Loughran-McDonald financial lexicon rather than a general one.
Learned models
Train a classifier - logistic regression on TF-IDF as a baseline, or a fine-tuned transformer for real performance. FinBERT, a BERT variant pre-trained on financial text, is the standard starting point and understands that "beat expectations" and "margin compression" carry sentiment that generic models miss.
A sane build order: lexicon-based prototype first to validate the pipeline end to end, then swap in FinBERT once the plumbing works.
Step 4: Labels
Supervised learning needs ground truth, and there are three practical sources:
- Expert annotation of a sample - highest quality, slowest, most expensive.
- Market-reaction proxies - label calls by the stock's abnormal return over the following days. Noisy (returns reflect more than tone) but free and unlimited.
- Crowdsourced labels - viable with strict quality controls, risky without them.
The pragmatic answer is usually a blend: proxy labels for volume, a smaller expert-annotated set for validation and calibration.
Step 5: Features and Training
Feature options in ascending order of power:
- TF-IDF vectors - the honest baseline; surprisingly competitive on this task.
- Static embeddings (Word2Vec, GloVe) - add semantic similarity.
- Contextual embeddings (FinBERT) - resolve meaning from context, which financial language demands constantly ("charge", "guidance", "exposure" all depend on their sentence).
Train with standard discipline: stratified splits, cross-validation, and - important in this domain - time-based splits. Testing a model on 2022 calls after training on 2024 calls leaks future vocabulary and inflates your metrics.
Step 6: Evaluate Honestly
Track accuracy, but lean on precision, recall, and F1 per class - the neutral class dominates earnings calls, and a model that predicts "neutral" everywhere scores deceptively well on accuracy alone.
Expect these recurring failure modes:
- Mixed-sentiment calls (great quarter, grim guidance) that resist a single label
- Polite-but-negative analyst phrasing that reads as neutral
- Corporate euphemism ("rightsizing", "transitory") that lexicons can't see through
Each is an argument for more labeled edge cases, not a different architecture.
Step 7: Ship It
Once the model clears validation:
- Score new calls as they publish and alert on outliers versus each company's own history - deviation from baseline is a stronger signal than absolute score.
- Feed scores into ranking or screening, alongside fundamentals and estimate revisions.
- Chart sentiment over time per company - a three-quarter downtrend in management tone is exactly the pattern that's invisible call by call and obvious on a chart.
Hard-Won Details
- Model prepared remarks and Q&A separately. They are different genres with different baselines.
- Score analyst questions too - skeptical questioning is its own leading indicator.
- Retrain on a schedule. The vocabulary of corporate optimism mutates every few years.
- Don't over-trust single-call scores; sentiment works best as a time series and a cross-sectional rank.
Closing
None of the individual steps here is exotic - the edge comes from executing all of them carefully on complete, speaker-attributed data. Get the transcript layer right and the rest is standard applied NLP.
If you want to skip the data-collection grind, EarningsAPI's REST API (docs at /docs) and MCP server at mcp.earningsapi.io provide the transcript foundation; plans are at /#pricing.
Related reading
- Building AI Pipelines on Structured Earnings Call Transcripts
- Automating Company Lookup by Ticker: A Developer's Guide
- Building an Earnings Dashboard on Transcript Data: A Practical Guide
- Transcript APIs in Practice: How Developers Speed Up Financial Research Workflows
- The Best Earnings Call Transcript APIs for Developers: Ship Faster, Analyze Deeper