Come funziona lo scoring
Dal testo grezzo di un articolo alla raccomandazione finale BUY / HOLD / SELL
Articolinews scraping
→
Scoreper articolo
→
Aggregatomedia ticker
→
SegnaleBUY/HOLD/SELL
→
Confidence0 – 1
Dettaglio fase per fase
1
Score per articolo
GPT
FinBERT
Hybrid
Ogni articolo riceve uno score in [-1.0 … +1.0].
Il metodo dipende dal
provider in config.json:
| Provider | Come produce lo score |
|---|---|
GPT openai |
GPT assegna un numero −1/+1 e una label positive / negative / neutral. Lo score è estratto dal testo via regex. |
FinBERT finbert |
Il modello locale restituisce 3 probabilità softmax (pos, neg, neu).score = p_positive − p_negative → range [−1, +1]. Zero costo API. |
Hybrid hybrid |
FinBERT produce score e confidence. ≥ hybrid_gpt_threshold (0.80) → solo FinBERT.< soglia → GPT aggiunge key_points e reasoning; lo score resta quello di FinBERT. |
2
Score aggregato del ticker
Gli score di tutti gli articoli vengono mediati:
average_score = Σ score_i / N articoli
La label aggregata segue la stessa soglia (±0.3) sull'
Vengono contati anche positive_count, negative_count, neutral_count — usati per il calcolo della confidence.
average_score.Vengono contati anche positive_count, negative_count, neutral_count — usati per il calcolo della confidence.
3
Segnale — BUY / HOLD / SELL
Logica a priorità decrescente (primo match vince):
| Condizione | Segnale |
|---|---|
average_score ≥ 0.70 | BUY |
average_score ≤ −0.50 | SELL |
average_score > 0.30 AND price_change_5g > +2% | BUY momentum |
average_score < −0.30 AND price_change_5g < −2% | SELL momentum |
| nessuna delle precedenti | HOLD |
price_change_5g = variazione % rispetto al prezzo di 5 sedute fa, su dati reali yFinance (storico 3 mesi).
Se il prezzo non è disponibile le righe momentum non vengono valutate.
4
Confidence (0 – 1)
Somma di tre contributi, clamped in [0, 1]:
confidence = 0.50 (base)
+ |average_score| × 0.30 (forza del sentiment)
+ agreement_ratio × 0.20 (concordanza articoli, se N ≥ 3)
+ |average_score| × 0.30 (forza del sentiment)
+ agreement_ratio × 0.20 (concordanza articoli, se N ≥ 3)
agreement_ratio = max(positive_count, negative_count) / total_articles
| Scenario esempio | Confidence |
|---|---|
| score 0.0, 1 articolo | 0.50 |
| score 0.7, 1 articolo | 0.71 |
| score 0.7, 5 articoli tutti positivi | 0.91 |
| score −0.9, 5 articoli tutti negativi | → clamped a 1.00 |
5
Indicatori tecnici (contesto)
Calcolati da yFinance su 3 mesi di storico — mostrati in dashboard, non modificano il segnale:
| Indicatore | Formula |
|---|---|
| RSI 14 | Rolling 14 giorni gain/loss medi (Wilder smoothing) |
| OBV | Σ Volume × segno(variazione giornaliera) |
| Prezzo attuale | Ultimo close · usato per il calcolo del momentum (price_change_5g) |
Soglie configurabili — config.json
| Chiave | Default | Significato |
|---|---|---|
| threshold_buy | 0.70 | Score minimo per BUY diretto |
| threshold_sell | −0.50 | Score massimo per SELL diretto |
| momentum_buy_score | 0.30 | Score minimo per BUY da momentum |
| momentum_sell_score | −0.30 | Score massimo per SELL da momentum |
| momentum_price_change_pct | 2.0 % | Variazione prezzo 5g per attivare il momentum |
| provider | openai | Algoritmo sentiment: openai / finbert / hybrid |
| hybrid_gpt_threshold | 0.80 | Confidence FinBERT sotto cui si chiama GPT (solo modalità hybrid) |