Product Sheets

One sheet per product family. Each sheet describes: the generator that processes it, the schedule, the formulas for principal and interest cash flows, certainty, the difference between the contractual view and the behavioural view, and special cases. The notation is that of the Methodology page; the common mechanisms (forward rates, coupon decomposition, certainty, repricing date) are in chapter 1.

Products covered

Product Type (@type) Sheet
Bullet loan / borrowing InFineLoan 2.1
Term deposit TermDeposit 2.1
Amortising loan AmortizableLoan 2.2
Security (bond) SecurityPosition 2.3
Interest rate swap Swap 2.4
Repo / repurchase agreement Repo 2.5
Non-maturity deposit (sight deposit, savings) Deposit 2.6
Accounting balance AccountingBalance 2.7
Equity, pledge, option — 2.8

The engine produces the cash flows of each transaction in each of the 8 scenarios and for both origins . Unless stated otherwise, only cash flows paid after the reporting date (\(t_k > t_0\)) are produced.

The certainties shown in the tables apply to the existing portfolio: for a new business transaction (constant balance sheet roll-over), all cash flows are uncertain (§1.8).


2.1 Bullet loan and term deposit

Data used: notional \(N\), start date \(t_s\), end date \(t_e\), call date \(t_c\) (optional), interest payment frequency, rate (type, value, spread \(m\), day-count convention, interest mode).

Sign

\[\varepsilon = s \times \begin{cases} -1 & \text{bullet loan (the bank pays out at inception)} \\ +1 & \text{term deposit (the bank receives cash at inception)} \end{cases}\]

The initial exchange carries \(\varepsilon\); coupons and repayment carry \(-\varepsilon\). For a loan granted: disbursement \(-N\), positive coupons, repayment \(+N\).

Schedule

Periods are built forward from the start date, period by period (\(t_k = t_{k-1} + 1\) month / quarter / half-year / year), the last one being truncated at \(t_e\):

\[[t_s, t_1],\ [t_1, t_2],\ \dots,\ [t_{n-1}, t_e]\]

Cash flows

Cash flow Date Amount Certainty
INITIAL (if \(t_s > t_0\)) \(t_s\) \(\varepsilon \cdot N\) CERTAIN
Coupon \(k\) (if \(t_k > t_0\)) \(t_k\) \(-\varepsilon \cdot I_k\) see §1.8
FINAL (if \(t_e > t_0\)) \(t_e\) \(-\varepsilon \cdot N\) CERTAIN

with the coupon calculated on the full notional, according to the interest mode of the rate:

\[I_k = N \cdot R_k \cdot \tau_B(t_{k-1}, t_k) \quad (\texttt{SIMPLE}) \qquad I_k = N \cdot \big[(1+R_k)^{\tau_B(t_{k-1}, t_k)} - 1\big] \quad (\texttt{COMPOUND})\]

  • Fixed rate: \(R_k = r + m\), constant.
  • Floating rate: \(R_k = r_{taux,k} + m\), where \(r_{taux,k}\) follows the order of priority of §1.7 — as a general rule the forward \(F(\max(t_{k-1}, t_0),\ t_k)\) of the index, read on the BASELINE curve if the coupon is certain (current coupon) and on the scenario curve otherwise.

Interest paid at maturity (AT_MATURITY): a single coupon covering the whole life, \(I = N \cdot R \cdot \tau_B(t_s, t_e)\) (or its compounded version), paid at \(t_e\). It is certain as soon as the transaction has started (\(t_s \le t_0\)).

No rate: only principal cash flows are produced, with a warning.

Behavioural view (call)

  • Periodic rate: the coupon that straddles the call (start \(< t_c <\) end, with \(t_c > t_0\)) is prorated up to the call, \(I_{stub} = N \cdot R \cdot \tau_B(t_{k-1}, t_c)\) (or compounded version), and paid at the call together with the repayment; subsequent coupons are removed.
  • AT_MATURITY rate: the coupon is recalculated over \([t_s, t_c]\).
  • Repayment: at \(\min(t_c, t_e)\).
  • Past call (\(t_c \le t_0\)): the transaction is already repaid, the behavioural view produces no cash flow (neither coupon nor repayment), like a called security (§2.3).

Without a call date, the behavioural view is identical to the contractual view.

Example

Bullet loan granted of EUR 1,000,000, from 31/03/2025 to 31/03/2028, 3% fixed, annual interest, Exact/365 simple, reporting date 30/06/2025:

Date Nature Amount Certainty
31/03/2026 Interest (365 d) \(1{,}000{,}000 \times 3\% \times 365/365 = 30{,}000\) certain, accrued \(91/365\)
31/03/2027 Interest 30,000 certain
31/03/2028 Interest (366 d) \(1{,}000{,}000 \times 3\% \times 366/365 = 30{,}082.19\) certain
31/03/2028 FINAL principal 1,000,000 certain

2.2 Amortising loan

Data used: initial amount \(A\), start date \(t_s\), number of instalments \(n\), frequency (paymentPeriod, \(p\) instalments per year), amortisation type (instalmentType), rate.

Schedule

The full schedule is rebuilt from the start date over the \(n\) instalments, \(t_k = t_{k-1} + 1\) period; only instalments \(t_k > t_0\) produce cash flows, but the rank \(k\) of the instalment is counted from the origination of the loan (the outstanding principal at the reporting date therefore derives from the contractual schedule, not from an imported outstanding balance).

Period rate

\[R_k = r_{taux,k} + m \qquad j_k = \frac{R_k}{p}\]

  • Fixed rate: \(r_{taux,k} = r\).
  • Floating rate: the rules of §1.7 — no index → rate carried by the transaction; LAST_FIXING mode and uncertain instalment → last known rate; otherwise forward \(F(\max(t_{k-1}, t_0),\ t_k)\) on the BASELINE curve (certain instalment) or on the scenario curve (uncertain instalment). For the current instalment, the known fixing of the transaction is used when provided (rule 2 of §1.7).

The periodic rate is \(R_k / p\): the day-count convention and the interest mode of the rate are not used for this product.

Constant instalments (FIX_INSTALLMENT)

Annuity, interest and principal of instalment \(k\) (spreadsheet PMT / IPMT formulas):

\[PMT_k = A \cdot \frac{j_k}{1 - (1 + j_k)^{-n}}\]

\[CRD_{k-1} = A\,(1+j_k)^{k-1} - PMT_k \cdot \frac{(1+j_k)^{k-1} - 1}{j_k} \qquad I_k = j_k \cdot CRD_{k-1} \qquad K_k = PMT_k - I_k\]

(if \(j_k = 0\): \(PMT_k = A/n\), \(I_k = 0\)). For a floating rate, the annuity is recalculated at each instalment with the period rate, on the original schedule.

Linear amortisation (FIX_AMORTIZATION)

\[K_k = \frac{A}{n} \qquad CRD_{k-1} = A \cdot \frac{n - k + 1}{n} \qquad I_k = CRD_{k-1} \cdot \frac{R_k}{p}\]

Cash flows

Cash flow Date Amount Certainty
INITIAL (if \(t_s > t_0\)) \(t_s\) \(-s \cdot A\) CERTAIN
Principal \(k\) \(t_k\) \(+s \cdot K_k\) CERTAIN (the schedule is contractual), UNCERTAIN for new business
Interest \(k\) \(t_k\) \(+s \cdot I_k\) rule of §1.8

The principal portion is certain even when the coupon of the same instalment is not: the amortised amount does not depend on the rate (for linear amortisation; for constant instalments, see §6.3).

Behavioural view

Identical to the contractual view: no prepayment (CPR) is modelled.

Example

Loan of EUR 120,000, 12 constant monthly instalments, 6% fixed, reporting date before the first instalment: \(j = 0.5\%\), \(PMT = 120{,}000 \times 0.005 / (1 - 1.005^{-12}) = 10{,}327.97\). Instalment 1: \(I_1 = 600.00\), \(K_1 = 9{,}727.97\); instalment 2: \(CRD_1 = 110{,}272.03\), \(I_2 = 551.36\), \(K_2 = 9{,}776.61\); etc.


2.3 Security (bond)

Data used: notional \(N\), premium (optional), start date \(t_s\), maturity date \(t_e\), call date \(t_c\) (optional), coupon frequency (\(p\) per year), rate.

Cash flows

Cash flow Date Amount Certainty
INITIAL (if \(t_s > t_0\)) \(t_s\) \(-s \cdot (N - \text{premium})\) CERTAIN
Coupon \(k\) (if \(t_k > t_0\)) \(t_k\) \(+s \cdot I_k\) rule of §1.8
FINAL (if \(t_e > t_0\)) \(t_e\) \(+s \cdot N\) CERTAIN

The schedule moves forward from \(t_s\) period by period up to \(t_e\). If the maturity does not fall on a date of the coupon calendar, the last coupon is a broken (stub) coupon up to maturity, calculated like the call stub below: \(I = N \cdot R \cdot \tau_B(t_{k-1}, t_e)\), at the rate of its own period \([t_{k-1}, t_e]\).

Periodic coupon

The coupon is a fraction \(1/p\) of the annual rate, without a day-count convention:

\[I_k = \frac{N \cdot R_k}{p} \qquad R_k = r_{taux,k} + m\]

For a floating rate, \(r_{taux,k}\) is: the rate carried by the transaction (no index); the known fixing for the current coupon (certain); the last known rate in LAST_FIXING mode; otherwise, as for the other products, the forward of the index over the coupon period \(F_B(\max(t_{k-1}, t_0),\ t_k)\), in the rate’s basis (§1.4). The current coupon therefore reads the simple rate from the reporting date to the end of its period, \(F_B(t_0, t_k)\); a future coupon reads the forward of its own period, and not the rate from the reporting date to its payment date. Prefixing still takes precedence on the certain coupon.

Single coupon (AT_MATURITY)

A security without a periodic coupon has a single coupon covering its whole life, with the day-count convention and interest mode of the rate: \(I = N \cdot R \cdot \tau_B(t_s, t_e)\) (or compounded version). A zero-coupon bond (zero rate) therefore produces only its principal cash flows.

Behavioural view (issuer call)

If \(t_c < t_e\):

  • coupons paid up to the call are kept;
  • the coupon that straddles the call (start \(< t_c <\) end, with \(t_c > t_0\)) is prorated up to the call, at the rate of its shortened period, \(F_B(\max(t_{k-1}, t_0),\ t_c)\) for a floating rate: \[I_{stub} = N \cdot R \cdot \tau_B(t_{k-1}, t_c)\]
  • subsequent coupons are removed;
  • the notional is repaid at \(t_c\).

2.4 Interest rate swap

Each leg (leg1, leg2) is generated separately and its cash flows carry the name of the leg (LEG1 / LEG2) as product.

Data used: start date \(t_s\), end date \(t_e\), call date \(t_c\) (optional); per leg: direction (paying / receiving), notional \(N\), frequency, schedule construction (FORWARD / BACKWARD), rate.

Sign of a leg

\[\varepsilon = s \times \begin{cases} +1 & \text{receiving leg (}\texttt{RECEIVING}\text{)} \\ -1 & \text{paying leg (}\texttt{PAYING}\text{)} \end{cases}\]

Schedule

Let \(t_{fin} = \min(t_c, t_e)\).

  • FORWARD: periods built forward from \(t_s\), the last one truncated at \(t_{fin}\).
  • BACKWARD: periods built backward from \(t_{fin}\), the first one truncated at \(t_s\) (stub period at the start of the life).
  • AT_MATURITY frequency: a single coupon over \([t_s, t_e]\).

Only periods paid after \(t_0\) are retained; the current coupon (started before \(t_0\)) is one of them.

Coupon

The coupon of a leg is always calculated with simple interest on the year fraction of the period:

\[I_k = N \cdot R_k \cdot \tau_B(t_{k-1}, t_k)\]

  • Fixed leg: \(R = r + m\) (contractual value + spread). CERTAIN coupons. The RATE component is \(r\); the spread appears in the MARGIN component.
  • Floating leg: \(R_k = r_{taux,k} + m\). The leg’s rate.value (last fixing, for information only in the import files) is not added. \(r_{taux,k}\) is the forward \(F(\max(t_{k-1}, t_0),\ t_k)\) of the index — on the BASELINE curve for the current coupon (certain), on the scenario curve for future coupons (uncertain) — or, failing an index, the rate carried by the leg, or, in LAST_FIXING mode, the last known rate. A coupon whose forward cannot be calculated is ignored, with an error.

Notional exchanges

Cash flow Date Amount
INITIAL (if \(t_s > t_0\)) \(t_s\) \(-\varepsilon \cdot N\)
FINAL, fixed leg \(\min(t_c, t_e)\) \(+\varepsilon \cdot N\)
FINAL, floating leg next repricing date: end of the last certain coupon; failing that, end of the first future coupon; failing that, \(\min(t_c, t_e)\) \(+\varepsilon \cdot N\)

The notional (fictitious) exchanges have no net effect on a single-currency swap whose two legs have the same notional, but they carry the sensitivity of each leg: the fixed leg behaves like a fixed-rate bond until maturity, the floating leg like a placement until the next refixing.

Behavioural view

The call applies to both views: coupons after the call are removed and the notional is exchanged at the call, in the contractual as well as the behavioural view. The two views of a swap are therefore identical.

Example

Payer swap, fixed 2% against Euribor 3M + 0, notional EUR 10m, quarterly, reporting date 30/06/2025, last fixing on 15/05/2025:

  • fixed paying leg: coupons \(-10{,}000{,}000 \times 2\% \times \tau\) each quarter, certain, notional −EUR 10m at maturity;
  • floating receiving leg: coupon of 15/08/2025 certain (forward read on the BASELINE curve from \(t_0\) to 15/08/2025), subsequent coupons uncertain (forwards from the scenario curve), notional +EUR 10m positioned at 15/08/2025.

2.5 Repo / repurchase agreement

Only the cash leg is modelled: the securities delivered as collateral return to their owner at unwind and their coupons do not change hands, so they carry no interest rate risk for the bank.

Data used: cash amount \(N\) (originalFaceValue), start date \(t_s\) and end date \(t_e\), call date (optional), repo rate.

Cash flows

The repo is treated as a bullet placement / borrowing whose interest is paid at maturity. \(\varepsilon = -s\): a reverse repo is an asset, a repo a liability.

Cash flow Date Amount Certainty
INITIAL (if \(t_s > t_0\)) \(t_s\) \(\varepsilon \cdot N\) CERTAIN
Interest \(t_e\) \(-\varepsilon \cdot N \cdot R \cdot \tau_B(t_s, t_e)\) (or compounded version) certain as soon as the repo has started
FINAL \(t_e\) \(-\varepsilon \cdot N\) CERTAIN

A matured repo (\(t_e \le t_0\)) produces only its initial exchange, if any. Without a usable rate, only principal cash flows are produced.

Behavioural view

With a call prior to maturity, the interest is recalculated over \([t_s, t_c]\) and repayment takes place at \(t_c\). A past call (\(t_c \le t_0\)) leaves no behavioural cash flow: the repo is already unwound.


2.6 Non-maturity deposit

Deposit transactions: sight deposits, savings accounts.

A non-maturity deposit has no contractual schedule: its run-off is conventional. The run-off law is looked up in the balance sheet strategy of the situation, by product name and by origin: one law can be defined for the contractual view and another for the behavioural view. Without a law for an origin, the transaction is in error.

Initial exchange

If the deposit starts after the reporting date: \(+N\) at \(t_s\) (in both views).

Bucket-based law

For each bucket \(b_j\) (1m, 3m, 1y, …), the law gives the share \(w_j\) of the outstanding balance that runs off at \(t_0 + b_j\). The shares must sum to 1 (within \(10^{-6}\)); otherwise the transaction is rejected, rather than silently reporting 80% or 120% of the outstanding balance. Buckets are processed in calendar order (\(T_j = t_0 + b_j\)).

\[\text{Tranche}_j = w_j \cdot N \qquad RD_{j-1} = N - \sum_{i<j} \text{Tranche}_i\]

Cash flow Date Amount
Principal \(j\) \(T_j\) \(\text{Tranche}_j\)
Interest \(j\) \(T_j\) \(I_j = RD_{j-1} \cdot r \cdot \tau_B(T_{j-1}, T_j)\) (or compounded version), with \(T_0 = t_0\)

The interest of each tranche accrues on the balance still on the balance sheet between the previous bucket and its own. The rate is that of the deposit:

  • fixed rate: rate.value alone (without spread), liquidity and spread components set to zero;
  • floating rate: the coupon of each tranche is calculated as a bullet coupon over the period \([T_{j-1}, T_j]\) — rate component according to the rules of §1.7 (generally the forward of the index), plus the spread, with the day-count convention and interest mode of the rate and the rate / liquidity / spread decomposition.

The sign of the cash flows is that of the imported amount.

Every cash flow, principal tranches included, carries the deposit’s rate: that rate puts it in the fixed-rate or floating-rate block of J 05.00 – J 07.00 (§3.6), and the principal of a floating-rate deposit is placed at its next repricing (§1.9). A deposit without a rate is read as a non-interest-bearing deposit at a fixed 0%: zero interest, principal in the fixed-rate block, one warning per deposit.

Certainty: principal certain (uncertain for new business); interest according to the no-period rule of §1.8 (certain for a fixed rate).

Script-based law

The law is a Python function executed by GraalPy, which receives the context, the transaction, the deposit and the parameters outflow_period_in_days = 100 and frequency_in_days = 5, and directly returns the list of cash flows. A cash flow returned without a rate takes the deposit’s. An execution error is logged and the transaction has no cash flows for that origin.

Example

Deposit of EUR 1,000,000 bearing 1% interest, law: 20% at 1 month, 30% at 1 year, 50% at 5 years, reporting date 30/06/2025, Exact/365 simple:

Date Principal Interest-bearing balance Interest
30/07/2025 200,000 1,000,000 \(1{,}000{,}000 \times 1\% \times 30/365 = 821.92\)
30/06/2026 300,000 800,000 \(800{,}000 \times 1\% \times 335/365 = 7{,}342.47\)
30/06/2030 500,000 500,000 \(500{,}000 \times 1\% \times 1461/365 = 20{,}013.70\)

2.7 Accounting balance

AccountingBalance transactions: outstanding balances from the accounting trial balance (ACCOUNTING lines), linked to a run-off law by account prefix at import. Each balance line gives a single transaction: it goes to the law whose prefix (the reference without the *) is the longest among those its account extends. A law whose prefix is already declared is ignored (the first one declared applies) and reported as a WARNING; a line covered by several prefixes is reported as a WARNING with the law retained.

Bucket-based law

Same mechanism as the non-maturity deposit (§2.6): tranche \(w_j \cdot N\) at \(T_j\), interest on the remaining balance \(RD_{j-1} \cdot r \cdot \tau_B(T_{j-1}, T_j)\) at the rate of the balance (fixed or floating, as for the deposit). The two views are identical. Principal is always certain; the rate, amount and certainty of the interest are all read from the rate of the balance itself.

Linear law

The linear law is converted into a bucket-based law. With a horizon \(H\) and a frequency \(f\) (month, quarter, half-year, year), the number of tranches \(n\) is the number of steps of \(f\) needed to reach \(t_0 + H\); tranche \(i\) runs off at \(t_0 + i \cdot f\) (capped at the horizon) with the share:

\[w_i = \text{round}_4\!\left(\frac{1}{n}\right) \quad (i < n) \qquad w_n = \text{round}_4\!\left(1 - (n-1)\,w_1\right)\]

Example: 1-year horizon, monthly frequency → 12 tranches of 8.33% at \(t_0\) + 1 month, \(t_0\) + 2 months, …, the last one (at \(t_0\) + 12 months) at 8.37%.

A script-based law is not accepted for an accounting balance (error).


2.8 Products without a generator

Equity, pledges (Nantissement) and options (Option) have no cash flow generator: a transaction of this type is flagged as an error (“Cashflow Generator does not exist”) and is not included in any IRRBB metric. Equity is excluded from EVE by regulatory design.


2.9 Summary

Product Coupon convention / mode Floating rate read as Behavioural view Floating principal positioned at
Bullet loan, term deposit \(\tau_B\), simple or compounded forward over the period call: coupons cut, repayment at the call next repricing (§1.9)
Amortising loan \(R/p\) forward over the period identical to contractual next repricing (§1.9)
Security \(R/p\) (periodic coupon), \(\tau_B\) (single coupon, broken coupon at maturity, call stub) forward over the period call: prorated stub, repayment at the call next repricing (§1.9)
Swap \(\tau_B\), simple forward over the period identical (call applied to both views) next repricing (generator and §1.9)
Repo \(\tau_B\), simple or compounded forward over the term call: interest and repayment at the call next repricing (§1.9)
Non-maturity deposit \(\tau_B\) per tranche forward over the tranche law specific to each origin next repricing (§1.9)
Accounting balance \(\tau_B\) per tranche forward over the tranche identical —