50 financial news headlines with a human sentiment label and two machine scores (LLM and lexicon)

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.)

u/MicheleSanta — 2 days ago

Ho punteggiato a mano 50 titoli per controllare la mia AI, e su tre aveva ragione lei

otto giorni fa uno qui mi ha chiesto come faccio il labelling delle notizie e ho dovuto rispondere che non lo faccio, nessun dataset, nessun ground truth, quindi nessun modo di sapere se i punteggi sono giusti.

ieri sera ho preso 50 titoli dal mio archivio e li ho punteggiati a mano, da -1 a +1, con i punteggi delle macchine nascosti mentre lo facevo. il campione non è a caso: venti sono i casi dove i due valutatori automatici litigano di piu, venti presi a caso, dieci dove sono gia d'accordo.

i numeri, su 50 titoli:

modello (gpt-oss-120b)   correlazione +0.76   concorda sul verso 74%
tono lessicale di GDELT  correlazione +0.18   concorda sul verso 36%

la banda del modello va da +0.61 a +0.85. quella di GDELT comprende lo zero, cioe su cinquanta titoli non si distingue dal caso. il tono lessicale nel mio prodotto pesa l'1% ed è un bene.

c'è un numero di controllo che mi serviva e che ho avuto per sbaglio: in un campione precedente sei titoli erano finiti dentro due volte, e li ho punteggiati due volte senza accorgermene. su quelli sono distante 0.17 da me stesso. il modello è a 0.28, cioè 1.7 volte il mio stesso rumore, e sotto 0.17 non puo andare nessuno, nemmeno io.

la parte piu utile pero non è nei numeri. guardando i dieci disaccordi piu grossi, tre non erano errori di punteggio:

"Solana Biofuels reports standalone net loss"   azienda indiana di biocarburanti
"Stellar AfricaGold"                            societa' mineraria
"JPMorgan Cuts CytomX Therapeutics"             la notizia e' su CytomX, JPM e' l'analista

nessun prompt sistema queste. è il filtro che le ha fatte entrare, e finivano dritte nella media di Solana, Stellar e JPMorgan. tre su dieci vuol dire che il prossimo lavoro non è sul modello, è su cosa entra.

e su tre casi il modello aveva ragione lui: un dirigente di Apple che vende 442 mila dollari di azioni (io +0.5, lui -0.2), una vulnerabilità con punteggio di gravita 10 su 10 su SAP Commerce Cloud (io 0, lui -0.8), e un "GE trading up 2.1%, here's why" a cui ho dato +1 quando è la descrizione di un movimento gia' avvenuto, cioè esattamente il caso che io stesso ho scritto nelle regole di schiacciare verso lo zero.

quello che questo NON dice: che il sentiment preveda il prezzo. l'ho misurato separatamente e non lo fa, sette gruppi su sette con la banda che comprende lo zero. dice solo che il punteggio somiglia a un giudizio umano, che è una domanda diversa e piu' piccola.

e vale per una persona sola, cioè me. se qualcuno vuole punteggiare gli stessi 50 titoli, il confronto fra noi due direbbe quanto è soggettiva la domanda, e quel numero mi manca.

reddit.com
u/MicheleSanta — 4 days ago

Ho Ho aperto la parte azioni del mio SaaS, con dentro piazza affari

Tre giorni fa ho scritto qui che cercavo gente per provare Cheruvo, che legge le notizie finanziarie e ne calcola il sentiment. allora c'erano solo le criptovalute. da stasera ci sono anche le azioni.

17 titoli con notizie vere nelle ultime 48 ore. In azzurro le europee, che è la parte che mi interessava di più: Eni, UniCredit, Ferrari, ASML, Shell, SAP. gli strumenti anglofoni saltano piazza affari, e se uno investe in Italia si ritrova a leggere il sentiment di Nvidia e niente sul titolo che ha in portafoglio.

una cosa sui numeri di quell'immagine, perché è quella che mi è costata di più. Il conteggio delle notizie conta una volta solo le riprese: se lo stesso lancio d'agenzia esce su venti testate, per la media è un giudizio solo, non venti. l'ho scoperto misurando, e non era un dettaglio: in un campione da 300 righe, 61 erano lo stesso articolo su Intel ripreso da 61 giornali. Il 37% di tutto erano riprese, e la media giornaliera le contava tutte.

l'altra cosa che ho cambiato in questi giorni è che il sito adesso dice quando non sa. Il coefficiente di correlazione fra sentiment e prezzo non compare sotto i venti giorni di dati: prima ne bastavano cinque, e su cinque giorni togliendone uno il numero cambiava segno.

è gratis, non chiede la carta e non serve un account per guardare la classifica. cheruvo.com

se provate e trovate qualcosa che non torna scrivetelo pure qui, che le due correzioni più grosse di questa settimana sono uscite esattamente così.

u/MicheleSanta — 5 days ago

Tra poco grande release

A oggi sto costruendo un enorme dataset di notizie finanziarie all'incirca 7100 oggi, sto parlando di https://cheruvo.com un SaaS gratuita che aggrega e analizza e fornisce una vista del mercato, per ora è orientato alle crypto e presto si aprirà anche alle azioni.

Ma la grande novità è tra poco sto costruendo uno strumento che rileva anomalie nel sentiment, per costruirlo mi servono giorni e giorni di raccolta dati, se qualcuno ha conoscenza di API con licenza commerciale gratuita per la raccolta news mi scriva qua nel post o in privato.

Spero di colpire più persone col mio prodotto sto pubblicizzando la mia campagna, ovvero a chi si iscriverà prima dell'uscita del piano pro che comprenderà il rilevatore di anomalie, avrà il piano pro gratuito a vita.

u/MicheleSanta — 6 days ago

Ho tolto tre numeri dal mio prodotto perché non reggevano

Sviluppo da solo Cheruvo, un sito che legge le notizie finanziarie e ne calcola il sentiment giorno per giorno. Qualche giorno fa ho scritto qui che cercavo gente disposta a provarlo.

Questo è l'aggiornamento, ed è al contrario di come vanno di solito: ho tolto roba invece di aggiungerne.

Nel pannello mostravo la correlazione fra il sentiment e il prezzo. Su NVDA diceva -0.712, scritta a tre decimali, grande, in rosso, con sotto "Forte negativa". Sono andato a contare su quanti giorni era calcolata: cinque.

Togliendo un giorno solo su cinque, il 3 agosto, la correlazione passa da -0.74 a +0.24. Cambia segno. E su 200.000 coppie di serie casuali lunghe cinque un valore assoluto sopra 0.74 esce nel 15% dei casi, quindi per vedere quel numero non serviva nemmeno che una relazione esistesse.

Sono andato a cercare gli altri punti dove facevo la stessa cosa e ne ho trovati due. Uno stava dietro quello che era il piano a pagamento: due riquadri che dicevano "rendimento medio dopo i giorni bullish" e lo stesso per i bearish, colorati di verde o di rosso.

Li ho misurati su sei ticker. Sette medie calcolabili su sette comprendono lo zero, cioè nessuna distingue un effetto dal caso. E due di quelle che si vedevano a schermo erano la variazione di un giorno solo presentata come una media.

Quindi ho tolto:

  • la correlazione non compare più sotto i 20 giorni, e quando compare ha accanto la sua banda al 95%
  • se la banda comprende lo zero adesso c'è scritto, invece di colorarsi di rosso
  • via gli aggettivi "forte" e "moderata": davano un giudizio di intensità a numeri che spesso non erano distinguibili dal caso
  • le medie di rendimento non escono sotto i 30 giorni
  • la retta di regressione nel grafico a dispersione si disegna solo se la correlazione regge, perché una riga in diagonale dentro una nuvola di otto punti afferma più del numero che le sta accanto

Il risultato è che il prodotto adesso mostra meno roba di prima e in parecchi punti dice "non lo so".

Non l'ho fatto per nobiltà. Se lascio in giro un numero che non regge, il primo che va a controllare me lo smonta, e a quel punto non conta più niente di quello che ho fatto bene.

La cosa che mi porto dietro è che quella soglia di cinque giorni l'avevo scritta io, mesi fa, senza pensarci. Nessun test la copriva, perché non c'era niente da testare: era una scelta di come mostrare le cose, non di come calcolarle. Se non fosse arrivato il mio primo utente a usarlo sul serio e a fare le domande giuste, stava ancora lì.

u/MicheleSanta — 9 days ago
▲ 0 r/u_MicheleSanta+1 crossposts

Cerco utenti di prova

Ciao, sono un fondatore SaaS e la mia prima volta ho 18 anni e vorrei fare carriera nel settore, ho creato un software che analizza il sentiment di crypto e azioni e analizza il mercato, ho bisogno di pareri e consigli https://cheruvo.com

u/MicheleSanta — 12 days ago