🔬 Analisi dei Lotti FIFO
L'analisi dei lotti FIFO è il complemento per lotto del Prezzo Medio di Carico (PMC).
Il PMC risponde: "Qual è il mio prezzo medio di carico per questa posizione?" L'analisi dei lotti FIFO risponde a una domanda diversa: "Come sta andando ogni singolo lotto di acquisto nel tempo?"
Invece di fondere tutti gli acquisti in un unico pool, LibreFolio traccia ogni lotto attraverso il suo ciclo di vita — aperto, parzialmente chiuso, completamente chiuso — e abbina le vendite in ordine FIFO (first in, first out).
Complemento, non sostituzione
Il PMC è aggregato e a livello di posizione. L'analisi dei lotti FIFO è granulare e a livello di lotto. Entrambe le viste sono utili: una per il prezzo medio di carico, l'altra per l'attribuzione economica lotto per lotto.
💡 Cos'è l'Analisi dei Lotti FIFO?
Un lotto è un gruppo di acquisto: ad esempio, un ACQUISTO di 100 azioni, o un trasferimento in entrata che preserva il costo storico.
Quando si verifica una VENDITA, i lotti più vecchi ancora aperti vengono chiusi per primi. Questo crea una storia lotto per lotto:
- quanto di ogni lotto è ancora aperto
- quanto è già stato venduto
- quanto ricavo di vendita quel lotto ha generato
- quanto reddito è stato guadagnato mentre quel lotto era detenuto
- quanto rendimento è derivato dalla variazione di prezzo rispetto al reddito da capitale
Questo rende l'analisi dei lotti FIFO particolarmente utile quando due posizioni nello stesso asset sono state acquistate a prezzi o date molto diverse.
La cronologia Vita e Custodia Lotti sopra rende visibile il ciclo di vita: ogni barra è un lotto, colorata in base al broker che lo detiene attualmente, con spessore proporzionale alla quantità ancora detenuta in quel segmento. Una barra che termina a metà grafico è un lotto completamente chiuso; una barra che arriva a "oggi" è ancora aperta.
🧮 Rendimento Non Realizzato per Lotto
Il Rendimento Non Realizzato isola il movimento solo di prezzo di un lotto rispetto al suo prezzo di riferimento di apertura.
In pratica:
- se esiste una quotazione di mercato alla data di apertura del lotto, quella quotazione di apertura diventa
reference_unit_price - se il lotto è stato aperto prima della prima quotazione di mercato disponibile, il sistema utilizza come riferimento il costo di apertura del lotto stesso, scalato alle unità della quotazione di mercato
reference_price_sourceregistra se il riferimento eraexact,fallbackounavailable
Questa metrica esclude dividendi, interessi e ricavi di vendita realizzati. Risponde: "Quanto si è mosso il prezzo di mercato da quando questo lotto è stato aperto?"
Fallback del prezzo di riferimento
Quando non esiste una quotazione di mercato del giorno di apertura, LibreFolio utilizza il prezzo di acquisto del lotto come base di riferimento, scalato alla convenzione di quotazione dell'asset. Questo evita rendimenti percentuali fuorvianti su strumenti quotati per 100 unità nominali.
Il fallback è \(\text{OpeningUnitPrice}\times qbq\). Per qbq = 100, un'obbligazione acquistata a 0.992 viene confrontata sull'asse della quotazione di mercato come 99.20, non 0.992.
Il grafico PMC / Prezzo di Mercato traccia ogni lotto come una bolla sulla linea del prezzo di mercato: il colore della bolla indica il broker presso cui il lotto è stato aperto, la dimensione della bolla scala con il valore di apertura del lotto. Un lotto valutato solo al costo (senza prezzo di mercato in tempo reale) viene disegnato con un contorno tratteggiato.
💰 Rendimento Totale per Lotto
Il Rendimento Totale è più ampio del Rendimento Non Realizzato. Include il valore corrente di mercato del lotto, eventuali ricavi di vendita già realizzati da quel lotto e qualsiasi reddito allocato ricevuto mentre il lotto era detenuto.
La matematica dei lotti di LibreFolio utilizza questi elementi costitutivi esatti:
Per il riepilogo scalare del lotto, la percentuale di rendimento è:
Per la cronologia dei rendimenti nel tempo, LibreFolio utilizza:
Questo risponde: "Qual è il rendimento economico completo di questo lotto, inclusi sia il movimento di prezzo che il rendimento da cassa?"
Il grafico di confronto Valore/Rendimento, passato alla modalità Rendimento, traccia esattamente questa percentuale — una linea per lotto, ciascuna misurata dalla propria data di apertura, sull'insieme di lotti attualmente selezionato.
⚙️ Ridimensionamento qbq
Alcuni strumenti sono quotati per quantità base, non per singola unità. LibreFolio chiama questa quantità base qbq (quote_base_quantity).
- Per la maggior parte delle azioni,
qbq = 1 - Per molte obbligazioni,
qbq = 100
La regola di valutazione esatta è:
Il ridimensionamento qbq è importante
Supponiamo che un'obbligazione abbia una quantità nominale di 1.000 e sia quotata a 101,50 per 100 nominali.
qbq = 100- quantità lotto =
1.000 - valore di mercato =
(1.000 / 100) × 101,50 = 1.015,00
Se confronti direttamente 101,50 con un costo di carico per singola unità come 0,992, ottieni risultati privi di senso perché i due numeri vivono su scale diverse.
Il confronto corretto ridimensiona il costo del lotto sull'asse della quotazione di mercato:
Quindi il confronto di prezzo significativo è 101,50 vs 99,20, non 101,50 vs 0,992.
Senza questo ridimensionamento, i rendimenti e le valutazioni delle obbligazioni possono essere errati di ordini di grandezza.
🛟 Stimato al Costo
Se non è disponibile un prezzo di mercato in tempo reale per un asset, LibreFolio non interrompe l'analisi. Invece, valuta temporaneamente la parte ancora aperta del lotto al costo:
Implicazione pratica:
- il lotto mostra ancora il valore residuo
- i ricavi già realizzati rimangono ancora visibili
- i dividendi o gli interessi allocati rimangono ancora visibili
- la volatilità non realizzata è temporaneamente sottostimata
value_source = ESTIMATED_AT_COSTmarket_pnl = 0- codice problema qualità dati:
CURRENT_PRICE_ASSUMED_AT_COST
Interpretazione
La stima al costo è un fallback operativo conservativo. Significa: "Sappiamo quanto hai pagato, ma non sappiamo attualmente quanto pagherebbe il mercato."
💸 Allocazione del Reddito tra i Lotti
I dividendi e gli interessi collegati a un asset vengono allocati pro-rata tra i lotti in acquisto ammissibili al giorno precedente la data del reddito (D-1), e solo tra i lotti detenuti presso il broker pagatore.
Regola di allocazione esatta:
Dove:
- \(I\) = importo del reddito ricevuto alla data \(D\)
- \(\text{Converti}(I, val, D)\) = reddito convertito nella valuta di destinazione alla data \(D\)
- \(\text{QtàAmmissibile}_i(D)\) = quantità del lotto \(i\) aperta presso il broker pagatore al \(D-1\) (la quantità in trasferimento in uscita da quel broker conta comunque come originata lì)
- solo i lotti in acquisto partecipano al denominatore
La regola D-1 mantiene puntuale la data di rilevazione: un acquisto effettuato nel giorno del reddito non matura quella distribuzione, e nemmeno un lotto venduto il giorno precedente. I lotti ammissibili più grandi ricevono una quota maggiore; i lotti detenuti presso altri broker, o non ancora (o non più) ammissibili, non ricevono nulla.
Modificato in FIFO v5
Le versioni precedenti utilizzavano la data del reddito stessa con tutti i broker (\(\text{QtàAperta}_i(t)\) su ogni lotto). Il motore attuale utilizza l'ammissibilità al D-1 limitata al broker pagatore. Se nessun lotto è ammissibile, il reddito viene mantenuto come reddito orfano a livello di asset (mai perso, mai assegnato al lotto sbagliato).
Regola di conservazione
Gli importi dei lotti allocati sommati restituiscono esattamente il totale dell'evento di reddito convertito. Il reddito viene distribuito, non creato.
La riga Reddito Asset della modale di dettaglio del lotto è esattamente \(\text{Reddito}_i\) della formula sopra — la quota pro-rata che questo lotto specifico ha ricevuto. Quando il lotto non ha un prezzo di mercato in tempo reale, la stessa modale mostra anche il badge Stimato al Costo della sezione precedente.
💸 Costi e Metriche Nette
Le FEE e TAX collegate a un asset vengono allocate ai lotti tramite una scala deterministica di abbinamento
alle operazioni, per poi essere sottratte e produrre le cifre nette insieme a quelle lorde.
🧭 Allocazione deterministica dei costi
Un pool di costo (stesso broker, stesso giorno, stesso tipo) viene abbinato al primo target non vuoto in questo ordine:
| Costo | Ordine di abbinamento |
|---|---|
FEE |
operazioni dello stesso giorno → operazioni del giorno precedente → posizioni aperte → orfano a livello di asset |
TAX |
reddito dello stesso giorno → operazioni dello stesso giorno → reddito del giorno precedente → operazioni del giorno precedente → posizioni aperte → orfano a livello di asset |
All'interno di un'operazione abbinata, il costo passa esattamente ai lotti toccati da quell'operazione — il costo di un ACQUISTO finisce sul lotto che ha aperto, il costo di una VENDITA finisce sui lotti consumati in FIFO — quindi l'attribuzione del costo non contraddice mai l'abbinamento FIFO stesso. Gli importi vengono convertiti nella valuta di destinazione e memorizzati come magnitudini positive.
Conservazione
Per pool, \(\sum_i \text{Costo}_i + \text{Orfano} = \text{Converti}(\text{pool}, val, D)\). Un costo che non trova alcun lotto ammissibile (es. una commissione registrata dopo che la posizione è stata completamente chiusa) diventa costo orfano a livello di asset invece di essere scartato o forzato su un lotto non correlato.
⚖️ Lordo vs netto
Con i costi attribuiti per lotto, LibreFolio riporta sia la performance lorda che quella netta:
$$ \text{RendimentoTotaleNetto}_i = \frac{\text{PnL Totale Netto}_i}{\text{ValoreIniziale}_i}
$$
Il rendimento annualizzato del lotto utilizza il rendimento netto, non quello lordo:
con \(d_i\) dalla data di apertura alla data di chiusura per i lotti chiusi, o alla data di fine analisi per i lotti aperti. Finestre inferiori a 30 giorni non restituiscono un valore annualizzato; vedi Rendimento Annualizzato Netto.
dove \(\text{PnL Totale}_i\) include già il reddito (PnL di mercato + PnL realizzato + reddito da asset). La serie storica del valore per lotto riporta invece un PnL netto solo di capitale, \(\text{pnl}_i - \text{Commissioni}_i - \text{Tasse}_i\), che esclude il reddito — ogni riga netta rispecchia la propria controparte lorda meno i costi.
Numeri esemplificativi
ACQUISTO 10×100, VENDITA 4×120, prezzo corrente 110, dividendo 50, commissioni 8, imposte 5: P&L Totale Lordo \(= 60 + 80 + 50 = 190\); P&L Totale Netto \(= 190 - 13 = 177\); su un valore iniziale di 1.000 corrisponde a un rendimento totale del 19% lordo contro il 17,7% netto.
I costi con asset_id = null non fanno parte di questa vista a livello di lotto — sono a livello di
portafoglio e gestiti dal Portfolio Engine. Vedi
Commissioni e Imposte per la teoria a livello di strumento.
📝 Esempio Pratico
Esempio: due lotti, un dividendo, un prezzo di mercato
Supponiamo stesso titolo, stessa valuta, qbq = 1.
| Data | Evento | Q.tà Aperta Lotto A | Q.tà Aperta Lotto B | Note |
|---|---|---|---|---|
| 2 Gen | ACQUISTO 100 @ $10 | 100 | 0 | Il lotto A si apre con costo originale $1.000 |
| 10 Feb | ACQUISTO 50 @ $14 | 100 | 50 | Il lotto B si apre con costo originale $700 |
| 15 Mar | DIVIDENDO $30 | 100 | 50 | Entrambi i lotti sono ancora aperti |
| 1 Apr | Prezzo di mercato = $16 | 100 | 50 | Valuta entrambi i lotti |
Passo 1 — Alloca dividendo pro-quota
Passo 2 — Rendimento Aperto per ogni lotto
Passo 3 — Valore di mercato e Rendimento Totale
Poiché nessuna azione è stata ancora venduta, i ricavi e il PnL realizzato sono entrambi zero.
Passo 4 — Rendimento aggregato tra i lotti visualizzati
Anche se entrambi i lotti appartengono allo stesso asset, hanno basi di costo e date diverse, quindi producono percentuali di rendimento significativamente diverse.
📚 Dai Lotti alle Metriche Aggregate
I rendimenti a livello di lotto possono essere aggregati in una serie di rendimenti aggregati, ma le percentuali non devono essere sommate direttamente.
LibreFolio utilizza questa regola aggregata esatta tra i lotti visualizzati:
Questa vista a livello di lotto aiuta a spiegare da dove proviene il rendimento. Metriche di livello superiore come ROI e TWRR rispondono a domande di portafoglio più ampie:
- ROI si concentra sul guadagno relativo al capitale investito
- TWRR neutralizza la tempistica dei flussi di cassa esterni
- L'analisi dei lotti FIFO spiega il contributo e il percorso all'interno di una posizione
La ricerca dei prezzi è volutamente esterna al motore FIFO. Il motore produce lotti e chiusure; LotsAnalysisService applica il risolutore unificato (Risoluzione dei prezzi) e il fallback stimato al costo quando ricava le metriche di valutazione.
La Tabella Lotti Unificata elenca esattamente le righe per lotto \(i\) su cui le formule aggregate sopra eseguono la somma — data di apertura, rendimento totale, valore corrente, custodia e stato, tutte filtrabili allo stesso insieme di lotti visibili utilizzato dai grafici.
🔗 Correlati
- 📊 Prezzo Medio di Carico (PMC) — vista del costo medio di carico
- 🔁 Acquisto & Vendita — breve panoramica sull'abbinamento FIFO
- 💸 Dividendo & Interesse — fonte degli eventi di reddito legati all'asset
- 💰 Tassazione — contesto delle plusvalenze e dell'abbinamento dei lotti
- ⚙️ Servizio di Analisi dei Lotti — approfondimento sull'implementazione per sviluppatori