Vai al contenuto

Piano di ammortamento (loans.amortisation_schedule)

Restituisce il piano di ammortamento di un finanziamento: per ogni periodo la rata, la quota interessi, la quota capitale e il debito residuo, con i totali e la rettifica dell'ultima rata che porta il debito residuo esattamente a zero. Sono disponibili tre tipi di ammortamento, con un preammortamento iniziale facoltativo e un balloon facoltativo. Si usa per inserire gli interessi di ogni anno e il debito residuo in un business plan e nella posizione finanziaria netta, o per riconciliare un piano con quello della banca.

Tipi di ammortamento

I nomi sono quelli del regolamento europeo sulle segnalazioni del credito (Regolamento (UE) 2016/867, Allegato IV, "tipo di ammortamento"):

Tipo Che cosa resta costante Prassi italiana
french la rata: il totale di capitale e interessi è uguale in ogni rata ammortamento alla francese (a rata costante)
fixed_amortisation_schedule la quota capitale: il capitale rimborsato in ogni rata è uguale ammortamento all'italiana (a quota capitale costante)
bullet solo gli interessi: l'intero capitale si rimborsa con l'ultima rata bullet (rimborso integrale del capitale con l'ultima rata)

Formula

Con il tasso periodico \(i\), \(n\) rate (l'intera durata), \(g\) periodi iniziali di soli interessi (preammortamento) e un balloon \(B\) rimborsato con l'ultima rata, ogni periodo \(k\) parte dal debito residuo iniziale \(D_{k-1}\) (\(D_0 = P\)):

\[ I_k = i\,D_{k-1} \qquad C_k = \begin{cases} 0 & k \le g \text{ (preammortamento) o bullet prima dell'ultimo periodo} \\ A - I_k & \text{french} \\ (P - B) / (n - g) & \text{fixed amortisation schedule} \end{cases} \qquad D_k = D_{k-1} - C_k \]

La rata del periodo \(k\) è \(I_k + C_k\). Per french, \(A\) è la rata costante di loans.instalment sugli \(n - g\) periodi successivi al preammortamento, con il balloon (la stessa implementazione):

\[ A = \frac{\left(P - B\,(1 + i)^{-(n-g)}\right) i}{1 - (1 + i)^{-(n-g)}} \]

Ultimo periodo. La quota capitale del periodo \(n\) è il debito residuo iniziale \(D_{n-1}\), balloon compreso, quindi il debito residuo finale è esattamente zero. La differenza tra l'ultima rata, al netto del balloon, e la rata ordinaria di quel periodo è riportata come final_adjustment (rettifica dell'ultima rata). Senza arrotondamento è zero salvo le ultime cifre dell'aritmetica; con l'arrotondamento assorbe l'arrotondamento accumulato.

Arrotondamento. Quando è scelto, l'arrotondamento si applica all'importo che il tipo mantiene costante, così che il tipo conservi il suo significato: la rata di un piano alla francese, la quota capitale di un piano all'italiana. Le quote interessi non sono mai arrotondate. Un piano bullet non ha importi costanti da arrotondare oltre ai propri interessi, quindi l'arrotondamento non lo modifica.

La rata \(k\) si paga alla fine del periodo \(k\) (tempo \(k\)): questa versione del metodo supporta solo rate posticipate.

Esempio

L'esempio svolto di un finanziamento alle imprese in Watts, Business and Financial Mathematics, sezione 6.1: 50.000 al 5% con capitalizzazione trimestrale, rimborsati con sei rate semestrali arrotondate al centesimo. Il tasso periodico è \(1.0125^2 - 1 = 0.02515625\), calcolato con le funzioni in serie della conversione dei tassi, quindi esatto a circa \(10^{-27}\):

from decimal import Decimal

import fairmark as fm

loan = fm.loans.amortisation_schedule(
    50000, 6, rate="0.05", compounding="quarterly", payment_frequency="semi_annual",
    amortisation_type="french", timing="ordinary", decimal_places=2, rounding_mode="half_up",
)
assert round(loan.periodic_rate, 20) == Decimal("0.02515625")  # series functions: 1e-27
first, last = loan.rows[0], loan.rows[-1]
assert first["instalment"] == Decimal("9082.24")
assert round(first["interest_portion"], 20) == Decimal("1257.8125")  # not rounded
assert round(last["instalment"], 2) == Decimal("9082.26")  # the book's final payment
assert last["outstanding_balance"] == 0
assert round(loan.final_adjustment, 4) == Decimal("0.0171")
assert round(loan.totals["interest"], 2) == Decimal("4493.46")

# Ammortamento all'italiana: 120.000 in 8 trimestri al 6% con capitalizzazione trimestrale.
fixed = fm.loans.amortisation_schedule(
    120000, 8, rate="0.06", compounding="quarterly", payment_frequency="quarterly",
    amortisation_type="fixed_amortisation_schedule", timing="ordinary",
)
assert [row["principal_portion"] for row in fixed.rows] == [Decimal(15000)] * 8
assert fixed.totals["interest"] == Decimal(8100)

# Due mesi di preammortamento, poi un piano alla francese con un balloon del 20% del capitale.
grace = fm.loans.amortisation_schedule(
    100000, 60, rate="0.048", compounding="monthly", payment_frequency="monthly",
    amortisation_type="french", timing="ordinary", principal_grace_periods=2,
    balloon_amount=20000,
)
assert grace.rows[0]["instalment"] == Decimal(400)
assert grace.rows[-1]["balloon_amount"] == Decimal(20000)
assert abs(grace.final_adjustment) < Decimal("1e-18")

Input

Campo Significato Default
principal Capitale finanziato, in unità di valuta, maggiore di 0 obbligatorio
rate, compounding, payment_frequency Tasso annuo nominale con la sua capitalizzazione e il numero di rate all'anno (forma a) una forma di tasso obbligatoria
periodic_rate Tasso per periodo di pagamento, frazione decimale, maggiore di −1 (forma b) una forma di tasso obbligatoria
number_of_instalments Intera durata, preammortamento compreso, da 1 a 10000 obbligatorio
timing ordinary (rata posticipata); due non è accettato dalla versione 1 obbligatorio
amortisation_type french, fixed_amortisation_schedule o bullet obbligatorio
principal_grace_periods Periodi iniziali di soli interessi, inferiori a number_of_instalments; non con bullet 0
balloon_amount Capitale rimborsato con l'ultima rata, \(0 \le B < P\); non con bullet 0
rounding decimal_places (da 0 a 6) e mode (half_up o half_even), entrambi obbligatori nessuno

Le forme del tasso sono descritte in loans.instalment.

Output

Campo Significato
periodic_rate Tasso per periodo di pagamento utilizzato
rows Una riga per periodo: period, time, instalment, interest_portion, principal_portion, outstanding_balance e, nell'ultima riga, balloon_amount
totals instalments, interest e principal (le quote capitale sommano al capitale)
final_adjustment Ultima rata meno il balloon meno la rata ordinaria dell'ultimo periodo

Convenzioni (esplicite, riportate in explain.conventions)

Convenzione Opzioni Default
Forma del tasso (a) tasso annuo con capitalizzazione e periodicità della rata, oppure (b) tasso periodico esattamente una, obbligatoria
Momento di pagamento rata posticipata: rata \(k\) al tempo \(k\) obbligatorio, solo ordinary
Tipo di ammortamento french, fixed_amortisation_schedule, bullet obbligatorio
Preammortamento da 0 a \(n - 1\) periodi di soli interessi 0, riportato come default
Balloon \(0 \le B < P\), rimborsato con l'ultima rata 0, riportato come default
Arrotondamento nessuno, oppure da 0 a 6 decimali con half_up o half_even, sulla rata (french) o sulla quota capitale (fixed_amortisation_schedule) nessuno
Interessi di un periodo tasso periodico × debito residuo iniziale (regime di interesse composto), mai arrotondati fissa
Rettifica dell'ultima rata ultima quota capitale = debito residuo iniziale dell'ultimo periodo sempre applicata, riportata

La tracciabilità del calcolo (audit trail) ha un numero fisso di passaggi qualunque sia la durata: il tasso periodico, l'importo ordinario e il suo arrotondamento, la ricorrenza enunciata una volta, il primo periodo (e il primo periodo dopo il preammortamento) con i numeri sostituiti, l'ultimo periodo con la rettifica, e i totali. Le righe riportano i numeri di ogni periodo.

Errori

Codice Quando
FM-E001 Momento di pagamento due, capitale pari a 0 o negativo, number_of_instalments pari a 0 o superiore a 10000, forma di tasso incompleta o doppia, arrotondamento senza modalità o con più di 6 decimali, oppure un campo mancante o sconosciuto
FM-E003 Il tasso periodico è pari o inferiore a −100%
FM-E020 Il balloon è negativo, non inferiore al capitale, oppure indicato con bullet
FM-E022 Il preammortamento non è inferiore al numero delle rate, oppure è indicato con bullet
FM-E023 Con l'arrotondamento, il debito residuo diventerebbe negativo prima dell'ultimo periodo, oppure l'ultima quota capitale o l'ultima rata sarebbe negativa (arrotondamento troppo grossolano per il finanziamento)
FM-E008 Overflow aritmetico (input molto al di fuori di un intervallo realistico)

Precisione

Ogni periodo usa una moltiplicazione e due sottrazioni, quindi ogni riga è esatta fino all'ultima delle 28 cifre significative del motore: rata = quota interessi + quota capitale, debito residuo finale del periodo = debito residuo iniziale − quota capitale, e le quote capitale sommano al capitale. Il debito residuo finale è sempre esattamente zero, per costruzione.

La rata è memorizzata con 28 cifre significative. L'ultimo periodo paga il debito residuo effettivamente rimasto, quindi la rettifica dell'ultima rata assorbe quell'errore di memorizzazione, amplificato di \((1 + i)\) a ogni periodo. Misurata senza arrotondamento: circa \(10^{-21}\) su 360 periodi mensili; \(1.3 \times 10^{-17}\) su 10000 periodi allo 0,1%; \(2.9 \times 10^{-13}\) al 25% su 100 periodi. Resta sotto \(10^{-18}\) del capitale finché \((1 + i)^n \le 10^{10}\) (ad esempio 1200 periodi all'1,9%, oppure 470 periodi al 5%); oltre cresce con \((1 + i)^n\), fino a circa 400 su un capitale di 150.000 al 5% su 1200 periodi, che è la conseguenza della ventottesima cifra della rata, non della ricorrenza. In pratica: un finanziamento trentennale a rate mensili al 15% annuo ha \((1 + i)^n\) pari a circa 88, ben dentro l'intervallo. Il valore attuale delle rate coincide con il capitale entro \(10^{-18}\) in termini relativi in ogni caso. Con l'arrotondamento, la rettifica è dominata dall'arrotondamento stesso. I casi di riferimento sono verificati a \(10^{-20}\), oppure esattamente quando tutti i valori sono decimali finiti.

Verificato con

  • Due esempi svolti da libri di testo, entro mezzo centesimo: Valerie Watts, Business and Financial Mathematics (Fanshawe College Pressbooks), sezione 6.1, il finanziamento alle imprese di 50.000; Jean-Paul Olivier, Business Math: A Step-by-Step Handbook (Lyryx Learning, 2018 Revision A), Example 13.3A.
  • Casi di riferimento in tests/golden/loans.amortisation_schedule/: gli esempi svolti di ECMA-376 della quota capitale e un riferimento indipendente a 50 cifre (scripts/reference_loans.py), confrontato anche riga per riga su finanziamenti casuali dei tre tipi.
  • Le funzioni della quota interessi e della quota capitale di numpy_financial per piani alla francese senza arrotondamento.