
50 financial news headlines with a human sentiment label and two machine scores (LLM and lexicon)
I maintain a small financial news sentiment tool and until this week it had no ground truth. An LLM assigned every score and nothing checked it. So I scored 50 headlines by hand, with the machine scores hidden while I did it.
I am releasing the labels because I could not find a set like this anywhere, and because 50 is small enough that anyone can re-label it in twenty minutes.
Link: https://gist.github.com/MicheleSanta00/ef891e48db23c1521e90cd2458ec844e
Columns
ticker the asset the headline was matched to (23 distinct)
headline the original headline, in its original language
human_label my label, one of -1, -0.5, 0, +0.5, +1
llm_score openai/gpt-oss-120b via Groq, continuous, same range
gdelt_tone GDELT's document tone divided by 10 and clipped to [-1, +1]
50 rows. The question I asked myself for each headline was: if you held this asset, is this good news or bad news for you? That is not the same as "is the tone positive", and the two come apart on things like a company being acquired, or a stock falling on news that was itself neutral.
Label distribution
-1.0 5
-0.5 9
0.0 16
+0.5 12
+1.0 8
How the sample was drawn
Not at random. 20 headlines where the LLM and the lexicon disagree the most, 20 random, 10 where they already agree. A random sample of a financial news archive is mostly neutral filler and would have measured my patience rather than the scorers.
Languages are mixed because the source feed is multilingual: 25 English, 19 German, 3 Spanish, and one each of French, Vietnamese and Hindi. Six more headlines were dropped because I could not read the language at all, so **this set is easier than the real distribution** and the numbers below are optimistic. The three I kept in languages I do not read I labelled from names, numbers and cognates, which is worth knowing if you look at those rows.
What I found
openai/gpt-oss-120b Pearson +0.76 (95% CI 0.61 to 0.85) sign agreement 74%
GDELT lexical tone Pearson +0.18 (CI includes zero) sign agreement 36%
Sign agreement uses a dead zone: anything between -0.1 and +0.1 counts as neutral, so the three classes are negative, neutral and positive. I am spelling this out because without it you will get a different number from mine. Treating exact zero as the only neutral gives 76% and 36%; dropping the 16 rows I labelled 0 gives 94% and 50%. Mean absolute distance is 0.28 for the model and 0.51 for the lexicon.
I also got a noise floor by accident, and I think it is the most useful number here. An earlier version of the sample contained six duplicates by mistake, so I scored those six headlines twice without realising. My own test-retest distance is 0.17 on this scale. The model sits at 0.28, about 1.7x my own inconsistency. Without that floor, 0.28 is unreadable.
Three of the ten largest disagreements were not scoring errors at all. They were headlines about the wrong company:
"Solana Biofuels reports standalone net loss" an Indian biofuel producer
"Stellar AfricaGold" a mining company
"JPMorgan Cuts CytomX Therapeutics" news about CytomX, with JPMorgan as the analyst
Name matching pulled them in and they were going straight into the daily averages. The third case generalises: banks get quoted constantly as a source of opinions about other companies, so matching on a bank's name brings in news that is not about the bank.
In three other cases the model was right and I was wrong. An Apple executive selling $442k of stock, which I labelled +0.5 and it scored -0.2. A CVSS 10.0 vulnerability in SAP Commerce Cloud, which I labelled 0 because I did not know what CVSS 10.0 meant. And "GE trading up 2.1%, here's why", which I labelled +1 although it describes a move that already happened.
Limitations, plainly
One annotator, which is me, so this measures resemblance to one person and not correctness. 50 rows, so the intervals are wide. Stratified, so it is not representative of the archive. Six headlines in languages I cannot read were dropped, which makes this easier than reality. And the headlines come from a 7-day window in August 2026, so there is no seasonality in it at all.
It also says nothing about whether headline sentiment predicts price. I measured that separately and it does not.
Licence
Headlines come from the GDELT Project's Global Knowledge Graph, which permits commercial reuse. The file contains headline text only, no article bodies. The labels are mine, do what you like with them.
What I would like back
If anyone labels the same 50 headlines, the agreement between two annotators would say how subjective this task actually is. That number does not exist as far as I know, and I cannot produce it alone. Post your labels and I will compute it and report it here.
Disclosure: the tool these came from is a project of mine. I am not linking it because it is not the point of this post.
(English is not my first language, I used an LLM to translate and tidy this text. The data and the analysis are mine.)