Blog / A Developer's Guide to Building an Earnings Call Sentiment M…
Reading earnings callsQuant signals

A Developer's Guide to Building an Earnings Call Sentiment Model

Mar 5, 2026 · Sophie Müller

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:

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:

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:

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:

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:

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:

Each is an argument for more labeled edge cases, not a different architecture.

Step 7: Ship It

Once the model clears validation:

Hard-Won Details

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

250,000 earnings calls via API

Full transcripts, speaker segments, full-text search. Quarterly plans from $145.

Get an API key
← PreviousAI Summaries of Earnings Calls: Cut the Reading, Keep the Signal