Vai al contenuto

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

Cronologia Vita e Custodia Lotti — ogni barra è un lotto, colorata per broker custode, spessore proporzionale alla quantità detenuta

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.

\[ \text{RendimentoRelativo} = \frac{\text{PrezzoMercato}}{\text{PrezzoDiRiferimento}} - 1 \]

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_source registra se il riferimento era exact, fallback o unavailable

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.

Grafico PMC / Prezzo di Mercato — una bolla per lotto, colorata per broker di apertura, dimensionata per valore di apertura, tracciata sulla linea del prezzo di mercato

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:

\[ \text{ValoreIniziale} = \text{CostoOriginale} \]
\[ \text{Ricavi}(t) = \sum \text{Ricavi di Chiusura} \text{ fino a } t \]
\[ \text{ValoreTotale}(t) = \text{ValoreCorrente}(t) + \text{Ricavi}(t) \]
\[ \text{PnL}(t) = \text{ValoreTotale}(t) - \text{CostoOriginale} \]
\[ \text{PnLMercato} = \text{PnL} - \text{PnLRealizzato} \]
\[ \text{PnLRealizzato} = \sum \text{PnL Realizzato di Chiusura} \]
\[ \text{RedditoAsset} = \sum_t \text{Reddito}_i(t) \]
\[ \text{PnL Totale} = \text{PnLMercato} + \text{PnLRealizzato} + \text{RedditoAsset} \]

Per il riepilogo scalare del lotto, la percentuale di rendimento è:

\[ \text{RendimentoTotale} = \frac{\text{PnL Totale}}{\text{ValoreIniziale}} \]

Per la cronologia dei rendimenti nel tempo, LibreFolio utilizza:

\[ \text{RendimentoTotale}(t) = \frac{\text{ValoreTotale}(t) + \text{Reddito}(t)}{\text{CostoOriginale}} - 1 \]

Questo risponde: "Qual è il rendimento economico completo di questo lotto, inclusi sia il movimento di prezzo che il rendimento da cassa?"

Grafico di confronto Valore/Rendimento in modalità Rendimento — rendimento percentuale per lotto dalla data di apertura di ciascun lotto

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 è:

\[ \text{ValoreDetenuto}(qta, prezzo, qbq) = \left(\frac{qta}{qbq}\right)\cdot prezzo \]
\[ \text{ValoreCorrente}(t) = \left(\frac{\text{QuantitàAperta}(t)}{qbq}\right)\cdot \text{PrezzoMercato}(t) \]

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:

\[ 0,992 \times 100 = 99,20 \]

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:

\[ \text{ValoreCorrente} = \text{ValoreIniziale}\cdot \frac{\text{QuantitàAperta}}{\text{QuantitàOriginale}} \]
\[ \text{PnLMercato} = 0 \]

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_COST
  • market_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:

\[ w_i(D) = \frac{\text{QtàAmmissibile}_i(D)}{\sum_j \text{QtàAmmissibile}_j(D)}, \qquad \text{QtàAmmissibile}_i(D) = \text{QtàAperta}_i(D-1) \]
\[ \text{Reddito}_i = \text{Converti}(I, val, D)\cdot w_i(D) \]

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.

Modale dettaglio lotto — la riga Reddito Asset mostra il dividendo/interesse pro-rata allocato a questo lotto specifico, insieme al badge Stimato al Costo quando non è disponibile un prezzo di mercato in tempo reale

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{PnL Totale Netto}_i = \text{PnL Totale}_i - \text{Commissioni}_i - \text{Tasse}_i \]

$$ \text{RendimentoTotaleNetto}_i = \frac{\text{PnL Totale Netto}_i}{\text{ValoreIniziale}_i}

$$

Il rendimento annualizzato del lotto utilizza il rendimento netto, non quello lordo:

\[ \mathrm{AnnualizedReturn}_i = \left(1+\mathrm{NetTotalReturn}_i\right)^{365/d_i}-1 \]

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

\[ w_A = \frac{100}{100 + 50} = \frac{2}{3} \qquad w_B = \frac{50}{100 + 50} = \frac{1}{3} \]
\[ \text{Income}_A = 30 \times \frac{2}{3} = 20 \qquad \text{Income}_B = 30 \times \frac{1}{3} = 10 \]

Passo 2 — Rendimento Aperto per ogni lotto

\[ \text{RelativeReturn}_A = \frac{16}{10} - 1 = 60.00\% \]
\[ \text{RelativeReturn}_B = \frac{16}{14} - 1 \approx 14.29\% \]

Passo 3 — Valore di mercato e Rendimento Totale

\[ \text{OpenValue}_A = 100 \times 16 = 1,600 \qquad \text{OpenValue}_B = 50 \times 16 = 800 \]

Poiché nessuna azione è stata ancora venduta, i ricavi e il PnL realizzato sono entrambi zero.

\[ \text{TotalPnL}_A = (1,600 - 1,000) + 20 = 620 \]
\[ \text{TotalReturn}_A = \frac{620}{1,000} = 62.00\% \]
\[ \text{TotalPnL}_B = (800 - 700) + 10 = 110 \]
\[ \text{TotalReturn}_B = \frac{110}{700} \approx 15.71\% \]

Passo 4 — Rendimento aggregato tra i lotti visualizzati

\[ \text{AggregateReturn} = \frac{620 + 110}{1,000 + 700} = \frac{730}{1,700} \approx 42.94\% \]

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:

\[ \text{PnLAggregato}(t) = \sum_i \left(\text{PnL}_i(t) + \text{Reddito}_i(t)\right) \]
\[ \text{ValoreInizialeAggregato}(t) = \sum_i \text{CostoOriginale}_i \]
\[ \text{RendimentoAggregato}(t) = \frac{\text{PnLAggregato}(t)}{\text{ValoreInizialeAggregato}(t)} \]

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.

Tabella Lotti Unificata — una riga per lotto con data di apertura, rendimento totale, valore corrente, custodia e stato, le esatte righe per lotto su cui le formule aggregate sopra eseguono la somma

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