⚙️ Portfolio Engine — Modello Matematico
⬅️ Torna a Panoramica Metriche di Performance
💡 Panoramica
Questa pagina definisce formalmente il modello matematico alla base del motore di calcolo del portafoglio di LibreFolio. Tutte le altre pagine relative alle metriche (NAV, Book Value, Period P&L, PMC, Deposited Capital) fanno riferimento a questa pagina per le loro precise regole di computazione.
📐 1. Notazione e Insiemi
| Simbolo | Significato |
|---|---|
| \(V(u)\) | Tutti i broker visibili all'utente \(u\) |
| \(S \subseteq V(u)\) | Ambito dei broker selezionati (filtrati) |
| \(A\) | Insieme degli asset con posizioni |
| \(C^*\) | Valuta target |
| \([t_0, t_1]\) | Frame di valutazione richiesto |
| \(q(a,b,t)\) | Quantità dell'asset \(a\) presso il broker \(b\) alla data \(t\) |
| \(p(a,t)\) | Prezzo di valutazione dell'asset \(a\) alla data \(t\) |
| \(\mathrm{fx}(c_1, c_2, t)\) | Tasso di cambio dalla valuta \(c_1\) alla \(c_2\) alla data \(t\) |
📐 2. Prezzo di Valutazione
- \(p_{\text{mkt}}\) = riempimento a ritroso (backward-fill) da PriceHistory (ultima chiusura con data \(\leq t\))
- \(p_{\text{buy}}\) = prezzo unitario dell'acquisto (BUY) più recente di \(a\) tra tutti i broker in \(V(u)\), con data \(\leq t\)
- Il PMC non viene mai utilizzato come prezzo di valutazione
📐 3. Stato della Posizione
Per ogni posizione \((a, b)\) con \(q(a,b,t) > 0\):
Dove \(w(a,b,t)\) è il prezzo medio di carico (PMC) per la posizione \((a,b)\) alla data \(t\).
📐 4. Aggiornamento Iterativo PMC
Mantenuto per singola posizione \((a,b)\) con stato del pool \((\hat{q}, \hat{c})\):
Acquisizione (qty \(> 0\), costo unitario \(u\)):
Riduzione (qty \(< 0\)):
Ordinamento
Entro la stessa data: le aggiunte vengono elaborate prima delle riduzioni. Questo assicura che l'operazione di SELL legga il PMC corretto, inclusi gli ACQUISTI dello stesso giorno.
📐 5. Aggregazione del Portafoglio
📐 6. Modello Cash a Tre Pool — Per Broker \((K_b, R_b, W)\)
Tre pool di accumulo tracciano la provenienza della liquidità. \(K\) e \(R\) sono mantenuti per broker \(b\); \(W\) è globale (esce completamente dal sistema).
| Pool | Ambito | Significato |
|---|---|---|
| \(K_b\) | Per broker | Capitale esterno ancora presente nel broker \(b\) come cash |
| \(R_b\) | Per broker | Rendimenti generati ancora presenti nel broker \(b\) come cash |
| \(W\) | Globale | Rendimenti che hanno lasciato il sistema (nascosti, recuperabili al ri-deposito) |
Proprietà chiave
Un acquisto (BUY) sul broker \(b_1\) può consumare solo \(R_{b_1}\), mai \(R_{b_2}\). La liquidità non si "teletrasporta" tra i broker — solo i trasferimenti espliciti spostano i saldi dei pool.
Regole di aggiornamento (per transazione sul broker \(b\), cronologiche)
| Icona e Tipo | Formule di Aggiornamento | Logica e Descrizione |
|---|---|---|
DEPOSITO \(D > 0\) |
\(r = \min(D,\, W)\) \(R_b \mathrel{+}= r\) \(W \mathrel{-}= r\) \(K_b \mathrel{+}= D - r\) |
Ripristina i rendimenti precedentemente prelevati dal tracker globale \(W\) prima di aggiungere il restante al capitale \(K_b\). |
PRELIEVO \(X > 0\) |
\(k = \min(X,\, K_b)\) \(K_b \mathrel{-}= k\) \(\rho = \min(X - k,\, R_b)\) \(R_b \mathrel{-}= \rho\) \(W \mathrel{+}= \rho\) |
Consuma prima il capitale \(K_b\), poi sposta i rendimenti rimanenti \(\rho\) nel tracker globale \(W\). |
DIVIDENDO / INTERESSE \(I > 0\) |
\(R_b \mathrel{+}= I\) | I rendimenti incrementano direttamente il pool dei rendimenti \(R_b\). |
COMMISSIONE / IMPOSTA \(F > 0\) |
\(R_b \mathrel{-}= F\) \(\text{se } R_b < 0\text{: } K_b \mathrel{+}= R_b,\; R_b = 0\) |
Consuma prima i rendimenti \(R_b\); se \(R_b\) diventa negativo, attinge dal capitale \(K_b\). |
ACQUISTO \(B > 0\) |
\(\rho = \min(B,\, R_b)\) \(R_b \mathrel{-}= \rho\) \(K_b \mathrel{-}= (B - \rho)\) |
Consuma prima i rendimenti \(R_b\), poi preleva il resto dal capitale \(K_b\). |
VENDITA |
\(G = P - C\) \(K_b \mathrel{+}= C\) \(R_b \mathrel{+}= G\) \(\text{se } R_b < 0\text{: } K_b \mathrel{+}= R_b, \quad R_b = 0\) |
Il costo di base $C = |
TRASFERIMENTO DI LIQUIDITÀ (Interno, \(s \to d\), \(X > 0\)) |
Tratta di uscita (\(s\)): \(\rho = \min(X,\, R_s)\) \(R_s \mathrel{-}= \rho\) \(\kappa = X - \rho\) \(K_s \mathrel{-}= \kappa\) Tratta di arrivo (\(d\)): \(K_d \mathrel{+}= \kappa\) \(R_d \mathrel{+}= \rho\) |
I trasferimenti interni di liquidità spostano le allocazioni dei pool (\(R_s \to R_d\), \(K_s \to K_d\)) in proporzione al saldo di partenza. Il tracker globale \(W\) non viene mai toccato (il capitale rimane nel sistema). |
Se le date di uscita e arrivo differiscono, il trasferimento è in transito (in-transit): sottratto da \(s\) nel giorno di partenza, aggiunto a \(d\) nel giorno di arrivo. Tra queste date, \(\sum K_b + \sum R_b < \mathrm{Cash}_{\text{like}}\) per l'importo in transito — gestito tramite riconciliazione proporzionale.
Aggregazione per l'output
Invariante di riconciliazione
Viene applicato uno scaling proporzionale per broker se il drift è \(> 0.01\) (dovuto ad arrotondamenti FX o timing in-transit).
📐 7. Contributo di Periodo
Per il periodo \([t_0, t_1]\), per posizione \((a,b)\):
Insieme delle posizioni che contribuiscono:
Le voci non allocate (commissioni/redditi senza asset_id) sono raggruppate per broker.
📐 8. Guadagno/Perdita Realizzata (Realized Gain/Loss)
Su SELL di \(|q_s|\) unità dalla posizione \((a,b)\):
Dove \(w_{\text{pre}}\) è il PMC prima della riduzione del pool (stesso valore usato dalla regola SELL a 3 pool sopra).
📐 9. Architettura Pre-Frame / Frame
| Fase | Intervallo date | Calcola |
|---|---|---|
| Pre-frame | \([t_{\mathrm{first}},\ t_0)\) | Cash, qty, PMC, pool — nessuna valutazione di mercato |
| Frame | \([t_0,\ t_1]\) | Completo giornaliero: prezzi, FX, stati delle posizioni, stati del portafoglio |
Le transazioni nel pre-frame aggiornano gli accumulatori (libro cassa, pool PMC, modello a 3 pool K/R/W) senza consumare dati di prezzo o FX. Ciò consente un caching efficiente basato su range.
📐 10. Metriche di Performance (Layer 2)
Calcolate dopo gli stati giornalieri, come passaggio separato:
| Metrica | Formula | Riferimento |
|---|---|---|
| PnL Totale | \(\mathrm{NAV}(t) - \text{DepositedCapital}(t)\) | Deposited Capital |
| PnL di Periodo | \(\mathrm{NAV}(t_1) - \mathrm{NAV}(t_0) - \text{ECF}_{[t_0,t_1]}\) | Period P&L |
| TWRR | \(\prod_i (1 + r_i) - 1\) (catena di sotto-periodi) | TWRR |
| MWRR | XIRR risolvendo \(\sum \frac{CF_i}{(1+r)^{d_i/365}} = 0\) | MWRR |
| Simple ROI | \((\mathrm{NAV} - \text{NetInvested}) / \text{NetInvested}\) | ROI |
| Timing Effect | \(\text{MWRR}_{\text{cum}} - \text{TWRR}_{\text{cum}}\) | Timing Effect |
🔗 Correlati
- 💼 NAV — valutazione istantanea (snapshot)
- 📖 Book Value — aggregato del costo di base
- 📊 Period P&L — guadagni/perdite in una finestra temporale con contributo
- 💸 Deposited Capital — dettagli sui 3 pool ed esempi pratici
- 📈 PMC — metodo di costo iterativo