Constant and Behavioural Balance Sheet
4.1 Constant balance sheet
NII is measured on a constant balance sheet: any principal leaving the balance sheet within the horizon (maturity, amortisation, run-off) is replaced by a comparable transaction, so that the outstanding balance does not mechanically run down. RTS (EU) 2024/856, Art. 4(4), puts it this way: “total size and composition, including on- and off-balance sheet items, shall be maintained by replacing instruments with maturing or repricing cash flows with new instruments that have comparable features with regard to the currency, amount and repricing period of the instruments generating the repricing cash flows”. The ConstantBalanceSheetStrategy strategy carries the roll-over horizon (rollHorizon, for example 1y or 18m); the cut-off date is calculated on a calendar basis, \(t_{roll} = t_0 + \text{horizon}\).
For each transaction whose maturity \(t_e\) is earlier than \(t_{roll}\), a new transaction is created, starting at the maturity of the previous one and with the same term:
\[t_s' = t_e \qquad t_e' = t_e + (t_e - t_s) \qquad t_c' = t_c + (t_e - t_s) \text{ (if callable)}\]
The roll-over is repeated as long as the new maturity remains within the horizon: a 3-month deposit over a one-year horizon is rolled over four times (references REF_N, REF_N2, REF_N3, …).
| Rolled-over product | Rule |
|---|---|
| Swap, security, repo, bullet loan, term deposit | same nominal, same term, same spread; fixed rate repriced (see below) |
| Amortising loan, non-maturity deposit, accounting balance | not rolled over at maturity: the principal they repay or run off within the horizon is replaced (below) |
Rolled-over transactions carry original = false: all their flows are uncertain, including capital. Their coupons are calculated on the scenario context:
a floating-rate roll-over reads the forward of its index on the shocked curve: its NII responds to the shock;
a fixed-rate roll-over is repriced identically in every scenario: at the scenario market rate over its original term, plus the margin frozen at the reporting date. Only the contractual rate \(r\) of the original transaction is known; the margin is therefore \(r - R_{BASELINE}(t_0, t_0 + D)\), the difference between this rate and the market rate of the same term at the reporting date:
\[r'_\sigma = F_\sigma(t_r,\ t_r + D) + \big[r - R_{BASELINE}(t_0,\ t_0 + D)\big]\]
where \(t_r\) is the roll-over date, \(D\) the term of the original transaction (from its start date to its maturity, in days) and \(F_\sigma\) the market rate for that term read on the rate index curve if it exists, otherwise on the discount curve. \(F_\sigma\) and \(R_{BASELINE}\) are expressed in the day-count basis of the rolled-over rate, the one its fixed coupon accrues in, from the curve’s discount factors (§1.4): simple rate \(\big(DF(t_a)/DF(t_b) - 1\big)/\tau_B\) for a term of at most one year in that basis (a single money-market coupon), annually compounded rate \(\big(DF(t_a)/DF(t_b)\big)^{1/\tau_B} - 1\) beyond (a fixed rate paid over several years). The two coincide at one year. A simple rate over several years would carry each year’s compounding and pass on a parallel shock amplified by about \((1 + r)^{D - 1}\). The contractual spread is retained. On a flat curve, the rolled-over rate remains \(r\) in the baseline if the term counts the same number of basis days at both dates; under a +200 bp parallel shock it rises by the shock of the market rate for its term, about 197 bp for a six-month term in Exact/365 and 200 bp beyond one year in Exact/365; on a sloped curve, it also follows the forward in the baseline. The rule covers bullet loans, term deposits, securities, repos and the fixed leg of swaps; if the curve cannot be read, the roll-over keeps its original rate and a warning is logged.
Rolled-over transactions enter only the NII: the outstanding balance, the average maturity, the EVE, the MV and the repricing schedules (J 05.00 to J 07.00) are calculated on the balance sheet at the reporting date, without them (EVE is a run-off measure, whereas the constant balance sheet is an NII assumption).
Replacing amortisation and run-off
An amortising loan repays its principal in instalments, a non-maturity deposit and an accounting balance run off in tranches (§4.2): none of them leaves in one go, so the maturity rule above does not roll them over, not even a balance whose linear law ends before the horizon (a 1M law). Their principal is replaced from their own flows, scenario by scenario and view by view: each principal flow \(C\) leaving the balance sheet on a date \(t_k\) with \(t_0 < t_k < t_{roll}\) is replaced, the same day, by a new transaction of the same amount and currency, which:
- stays on the balance sheet until \(t_{roll}\): its own repayments within the horizon would in turn be replaced, so the amount \(C\) stays in place until the end of the horizon. It carries interest only, accrued from \(t_k\) to \(t_{roll}\);
- carries the rate of the replaced flow, computed as for the original transaction:
- fixed-rate amortising loan: repriced like-for-like as a roll-over, \(r'_\sigma = F_\sigma(t_k,\ t_k + D) + \big[r - R_{BASELINE}(t_0,\ t_0 + D)\big]\), \(D\) being the loan’s full term (from its start to its last instalment); spread kept;
- floating-rate amortising loan: the loan’s index and spread, scenario forward, coupons at the loan’s payment frequency;
- non-maturity deposit, accounting balance: the transaction’s rate, which reacts to the scenario as the transaction’s own rate does (unchanged if fixed, the index forward if floating). These balances have no term over which to reprice a fixed rate, and the replacement gets no pass-through rate that the original balance does not already have.
The replacements of one transaction appear under the reference REF_R. Like roll-overs, they enter only the NII. On a growing balance sheet each amount is multiplied by \((1 + g)^{\tau}\), \(\tau\) in years from \(t_0\) to \(t_k\); on a run-off balance sheet nothing is replaced.
Every generated transaction, renewal (REF_N, REF_N2, …) or replacement (REF_R), carries a comment saying why it exists (which transaction it renews at which maturity, or whose repaid or run-off principal it replaces), shown in the portfolio table and on the transaction page.
Example: a deposit of 1,000,000 at a fixed 1 %, running off 25 % at 3 months, 25 % at 6 months and 50 % at 2 years, has over one year the NII of a constant 1,000,000 balance at 1 %, i.e. 10,000, in every scenario. A principal leaving exactly at \(t_{roll}\) (the first tranche of an accounting balance on a yearly linear law, for example) leaves nothing to earn within the horizon and is not replaced.
IRRBB reporting: constant balance sheet and floor required
The IRRBB templates are the supervisory outlier test: one-year NII on a constant balance sheet (RTS (EU) 2024/856, Art. 4(2) and 4(4)) and the post-shock floor (Art. 3(7), applied to NII by Art. 4(1)). Generating the templates is refused, with a message giving the reason, if the import’s balance sheet is not a constant balance sheet, if its roll-over horizon covers less than one year, or if the calculation switches the post-shock floor off. The cash flows are still produced.
Balance sheet of a custom simulation
The official run takes the import’s balance sheet evolution (the constant balance sheet above). A custom simulation (Custom scenario) can replace it; the import’s run-off laws are unchanged.
| Balance sheet | New production |
|---|---|
| Constant over N months | the roll-overs above, N-month horizon |
| Run-off | none: the balance sheet runs down |
| Growing by g % a year | the constant balance sheet roll-overs, amounts multiplied by \((1 + g)^{\tau}\) |
For the growing balance sheet, \(\tau\) is the number of years, in Actual/365, from the evaluation date to the start date of the roll-over (\(t_s'\)). Each roll-over is scaled from the original amount: the growth of one roll-over does not add to the previous one’s. At 3 % a year, a roll-over starting 365 days after the evaluation date has its amounts multiplied by \(1.03\), one starting 730 days after by \(1.03^2 = 1.0609\). Scaled are: the notional of both legs of a swap; the notional, remaining value and premium of a security; the amount of a term deposit or a bullet loan; the face values, interest amount and premium of a repo.
4.2 Run-off laws
Balances without a contractual maturity (sight deposits, savings, accounting balances) run off according to a conventional law, declared in the balance sheet strategy:
| Law | Parameters | Used by |
|---|---|---|
By buckets (BucketOutflowStrategy) |
one share per bucket (1m → 0.2, 1y → 0.3, …), sum = 1 |
deposits, accounting balances |
Linear (LinearOutflowStrategy) |
horizon, frequency | accounting balances (converted into a bucket law) |
Script (ScriptOutflowStrategy) |
language, function | deposits (Python function, GraalPy) |
A law is attached to a product (productName) and to one or more origins (strategyType): a deposit can thus run off according to a convention in the contractual view (for example, everything at 1 day) and according to a behavioural model in the behavioural view. The formulas are given in sheets 2.6 and 2.7.
4.3 Prepayment options (call)
The call date of a transaction (callDate) is used only in the behavioural view (except for swaps, where it bounds both views):
| Product | Effect of a call before maturity |
|---|---|
| Bullet loan, term deposit | coupon straddling the call prorated up to the call; subsequent coupons removed; repayment at the call; single coupon recalculated up to the call |
| Security | coupon straddling the call prorated up to the call; subsequent coupons removed; repayment at the call |
| Repo | interest calculated up to the call; repayment at the call |
| Swap | coupons after the call removed and nominal exchanged at the call, in both views |
Exercise of the call is assumed to be certain: the engine does not value the option (no arbitrage based on the level of rates in the scenario).
4.4 Rate projection modes
The engine parameter rateProjectionMode sets the rate applied to the uncertain coupons of floating-rate transactions:
| Mode | Rate of an uncertain coupon |
|---|---|
FORWARD (default) |
forward of the index over the coupon period, read on the scenario curve |
LAST_FIXING |
last known rate, frozen over all future periods, plus the scenario shock |
In LAST_FIXING mode, the last known rate is, in order of priority:
- the rate of the transaction’s prefixing line whose window covers the reporting date;
- the known fixing of the transaction (non-zero
rate.value); - failing that, the current rate of the index on the scenario curve: \(F_\sigma(t_0,\ t_0 + \text{tenor})\).
In cases 1 and 2, the scenario shock is added to the observed rate:
\[r^{LF}_\sigma = r^{obs} + \Big[F_\sigma(t_0, t_0 + \text{tenor}) - F_{BASELINE}(t_0, t_0 + \text{tenor})\Big]\]
The shock is therefore zero in BASELINE. The mode does not change the certainty of the flows (they remain uncertain for EVE and gaps): only their rate changes. Certain coupons always follow their own rules (known fixing, prefixing, forward capped at the reporting date).
4.5 Prefixing
Prefixing data make it possible to enter, transaction by transaction, a rate that replaces the curve rate. A line carries the transaction number (deal), the rate, the action date and the frequency of the base rate; it applies:
- only to certain flows (except in
LAST_FIXINGmode, §4.4); - if the target date is earlier than \(\text{action date} + \text{frequency}\);
- if one and only one line matches the transaction (several lines → error, the line is ignored).
Matching is performed on the second part of the transaction reference (PRODUIT_DEAL). The use of a prefixing is traced in the generation log (INFO level).