Cadre de calcul

Ce chapitre décrit les mécanismes communs à tous les produits : la chaîne de calcul, la construction des scénarios, la lecture des courbes, le calcul d’un coupon et de ses composantes, et les règles qui classent chaque flux (certitude, date de repricing, signe, bande temporelle). Les fiches produits du chapitre 2 s’appuient sur ces briques sans les répéter.

1.1 La chaîne de calcul

Situation importée ──► Bilan constant ──► 8 contextes ──► Génération des flux ──► Post-traitement ──► Indicateurs ──► États EBA
 (opérations,          (renouvellement    (BASELINE +      (un générateur        (date de repricing,  (MV, EVE,       (J 01.00 …
  courbes, soldes,      des tombées)       7 chocs)         par famille de        actualisation,       NII, gaps)      J 11.02)
  lois d'écoulement)                                        produit)              conversion devise)

Une génération de cash flows enchaîne les étapes suivantes :

  1. Scénarios — le moteur construit 8 contextes d’évaluation : le contexte d’origine et un contexte par choc (§1.2).
  2. Bilan constant — le moteur ajoute au portefeuille les opérations de renouvellement des tombées à l’intérieur de l’horizon (rollHorizon) ; ces opérations portent original = false (chapitre 4).
  3. Génération — pour chaque contexte et chaque opération, le générateur de la famille du produit produit la liste des flux (capital et intérêt, vue contractuelle et vue comportementale).
  4. Post-traitement — pour chaque opération : calcul de la date de repricing des capitaux à taux variable (§1.9), du facteur d’actualisation de chaque flux (§1.5), puis de la contre-valeur en devise pivot (§1.11).
  5. Indicateurs — le moteur agrège les flux par devise, scénario, classification FINREP et origine (chapitre 3).

Une opération en erreur (courbe manquante, données incohérentes) est isolée : elle est retirée du calcul, l’erreur est journalisée avec sa référence, et le reste du portefeuille est calculé.

1.2 Les scénarios de choc de taux

Les chocs sont ceux du dispositif standard de l’EBA / du Comité de Bâle (BCBS SRP31.90). Ils sont appliqués par IrrbbScenario.applyScenario à chaque point de chaque courbe de taux ; les courbes de change et de spread de liquidité (LIQUIDITY_SPREAD) ne sont pas choquées .

Amplitudes par devise

Devise Parallèle \(\bar R_{par}\) Court \(\bar R_{short}\) Long \(\bar R_{long}\)
EUR 200 bp 250 bp 100 bp
USD 200 bp 300 bp 150 bp
GBP 250 bp 300 bp 150 bp
JPY 100 bp 100 bp 100 bp
CHF 100 bp 150 bp 100 bp
CAD 200 bp 300 bp 150 bp
AUD 300 bp 450 bp 200 bp
SEK 200 bp 300 bp 150 bp
SGD 150 bp 200 bp 100 bp
HKD 200 bp 250 bp 100 bp
CNY 250 bp 300 bp 150 bp
autre amplitudes EUR

Formules

Pour un point de courbe de maturité \(t\) (en années : mois / 12, semaines / 52, jours / 365), on note le facteur de décroissance du choc court :

\[S(t) = e^{-t/4}\]

Le taux choqué est \(r_\sigma(t) = r(t) + \Delta_\sigma(t)\) avec :

Scénario \(\Delta_\sigma(t)\)
PARALLEL_UP \(+\bar R_{par}\)
PARALLEL_DOWN \(-\bar R_{par}\)
SHORT_UP \(+\bar R_{short} \cdot S(t)\)
SHORT_DOWN \(-\bar R_{short} \cdot S(t)\)
STEEPENER \(-0{,}65 \cdot \bar R_{short} \cdot S(t) + 0{,}9 \cdot \bar R_{long} \cdot (1 - S(t))\)
FLATTENER \(+0{,}8 \cdot \bar R_{short} \cdot S(t) - 0{,}6 \cdot \bar R_{long} \cdot (1 - S(t))\)
UP_1_BP \(+0{,}0001\) (sonde de sensibilité, de type DV01)

Plancher post-choc

Chaque taux choqué est ensuite borné par le plancher EBA, qui part de −150 bp pour les maturités immédiates et remonte de 3 bp par année de maturité jusqu’à 0 % (atteint à 50 ans) :

\[\text{plancher}(t) = \min\big(0,\; -1{,}50\,\% + 0{,}03\,\% \cdot t\big) \qquad r_\sigma(t) \leftarrow \max\Big(\min\big(\text{plancher}(t),\ r(t)\big),\; r_\sigma(t)\Big)\]

Quand le taux observé \(r(t)\) est déjà inférieur au plancher, c’est lui qui sert de plancher : un choc baissier ne peut jamais remonter un taux au-dessus de son niveau de marché. Le plancher n’est appliqué qu’aux courbes choquées ; la courbe BASELINE est utilisée telle qu’importée.

Scénarios d’une simulation personnalisée

Le calcul officiel (IRRBB) produit toujours BASELINE et les sept scénarios ci-dessus, plancher appliqué. Une simulation personnalisée (Scénario Custom) :

  • produit toujours BASELINE, puis les seuls chocs réglementaires choisis ;
  • ajoute, si un choc propre est défini, le scénario CUSTOM, d’amplitude \(b\) en points de base signés (\(+100\) bp = \(+1\,\%\)) :
Forme \(\Delta_{CUSTOM}(t)\)
Parallèle \(b\)
Court \(b \cdot S(t)\)
Long \(b \cdot (1 - S(t))\)
  • n’applique le plancher post-choc à aucun scénario choqué quand il est désactivé ; activé, il borne tous les scénarios choqués, CUSTOM compris.

Les indicateurs (EVE, NII, MV) sont calculés pour chaque scénario produit, CUSTOM compris. Les états IRRBB ne lisent que BASELINE et les six chocs prudentiels : ils ne sont produits que par le calcul officiel.

1.3 Lecture d’un taux sur une courbe

Une courbe est un ensemble de points maturité → taux à une date de référence \(t_{ref}\), identifiée par son index (EURIBOR 3M, ESTR, …) et sa devise. Une courbe cotée en taux de swap (PAR) est d’abord convertie en courbe zéro-coupon (voir plus bas) ; les règles ci-dessous s’appliquent à cette courbe zéro-coupon.

Choix de la courbe : parmi les courbes portant l’index demandé (sans tenir compte de la casse), celle dont la date de référence est la plus proche de la date d’arrêté. Un écart de plus de 10 jours lève un avertissement, de plus de 20 jours une erreur (journalisée, le calcul continue).

Interpolation : le taux à la date \(t\) est lu pour une maturité de \(d = t - t_{ref}\) jours, par interpolation linéaire en nombre de jours entre les deux points encadrants :

\[r(d) = r_1 + \frac{r_2 - r_1}{d_2 - d_1}\,(d - d_1)\]

où les maturités des points sont converties en jours avec 1 semaine = 7 j, 1 mois = 30 j, 1 an = 365 j. Au-delà du dernier point ou avant le premier, le taux est extrapolé plat (valeur du point le plus proche). Une maturité négative renvoie 0.

Courbes cotées en taux de swap (PAR)

Une courbe peut être cotée en taux zéro-coupon (ZERO, cas par défaut) ou en taux de marché (PAR : taux monétaires sur le court terme, taux de swap OIS au-delà). La cotation se déclare par courbe dans la configuration client (dataMapping.curveQuotations). Une courbe PAR n’est jamais lue telle quelle : elle est d’abord transformée (« bootstrappée ») en courbe zéro-coupon, une fois par courbe, et c’est cette courbe zéro-coupon qui sert aux lectures de taux, aux forwards et à l’actualisation.

Chaque point de maturité \(d\) jours (1 mois = 30 j, 1 an = 365 j) donne un facteur d’actualisation :

  • point monétaire (jusqu’à un an par défaut), intérêts simples Exact/360 : \[DF(d) = \frac{1}{1 + r \cdot d / 360}\]
  • point swap (au-delà d’un an, nombre entier d’années \(n\)), swap OIS au pair à jambe fixe annuelle, fraction \(\alpha = 365/360\) : \[DF_n = \frac{1 - S_n \sum_{i<n} \alpha\, DF_i}{1 + S_n\, \alpha}\]

Les années intermédiaires nécessaires à l’annuité sont complétées par interpolation linéaire des taux monétaires (avant le premier swap) ou des taux de swap (entre deux swaps), et ajoutées à la courbe. Chaque facteur est enfin converti en taux zéro-coupon annuel Exact/365 :

\[z(d) = DF(d)^{-365/d} - 1\]

Dans un scénario choqué, le choc et le plancher EBA s’appliquent aux taux zéro-coupon de la courbe bootstrappée, jamais aux taux de swap cotés. Un coupon monétaire lu sur cette courbe retrouve sa cotation (§1.4).

1.4 Taux forward

Le taux forward entre \(t_a\) et \(t_b\) est le taux simple de la période, dans la base de calcul \(B\) du coupon qui le porte (la base du taux de l’opération ou de la jambe, celle qui sert déjà au calcul de l’intérêt), tiré des facteurs d’actualisation de la courbe :

\[F_B(t_a, t_b) = \frac{1}{\tau_B(t_a, t_b)} \left( \frac{DF(t_a)}{DF(t_b)} - 1 \right)\]

où \(DF\) est le facteur d’actualisation du §1.5, lu sur la même courbe (sa courbe zéro-coupon si elle est cotée PAR), avec la même interpolation, et \(\tau_B\) la fraction d’année de la période dans la base \(B\). Couru dans cette même base, le coupon rapporte exactement ce que les facteurs d’actualisation impliquent sur la période : un coupon monétaire qui commence à l’arrêté retrouve sa cotation. Sur EURIBOR 6M SWAP au 30/06/2025, le coupon Exact/360 d’un an qui démarre à l’arrêté lit 2,02 %, le taux coté du point 1 an. Les points de la courbe restent lus comme des taux zéro-coupon annuels Exact/365 ; seul le taux du coupon est exprimé dans sa base. Une période de longueur nulle dans la base \(B\) ne court aucun intérêt ; elle lit le taux zéro-coupon à sa fin.

La même formule sert à toute lecture de taux sur une courbe : le forward d’un coupon variable de chaque famille de produits, titres compris (fiches produits), le taux courant de l’index en mode LAST_FIXING et son terme de choc (§4.4). Le renouvellement d’une opération à taux fixe en lit une variante (§4.1). Les taux observés (fixing connu, préfixing) ne sont pas lus sur une courbe et ne changent pas.

Le moteur ajoute ensuite, le cas échéant, le spread demandé, puis applique le préfixing (taux saisi manuellement pour une opération, prioritaire sur le taux de courbe pour un flux certain — voir §4.5).

Pour un coupon déjà commencé à la date d’arrêté (\(t_{k-1} < t_0\)), il n’y a pas d’historique de fixings : le début du forward est ramené à \(t_0\), ce qui revient à lire le taux simple de \(t_0\) à la fin de la période, \(F_B(t_0, t_k)\), avec \(DF(t_0) = 1\).

1.5 Facteur d’actualisation

Chaque flux reçoit, dans chaque scénario, un facteur d’actualisation lu sur la courbe de l’index d’actualisation du contexte (discountFactorIndex) — sa courbe zéro-coupon si elle est cotée PAR —, en composition annuelle et base Exact/365 :

\[DF_\sigma(t) = \big(1 + r_\sigma(t)\big)^{-\tau(t_0, t)} \qquad \tau(t_0, t) = \frac{t - t_0}{365}\]

  • Un flux à une date \(t \le t_0\) n’est pas actualisé : \(DF = 1\), sans lecture de la courbe (une date antérieure à la date de référence de la courbe n’y a pas de taux).
  • Un taux tel que \(1 + r \le 0\) est rejeté (erreur explicite plutôt qu’un facteur infini).
  • Deux facteurs sont calculés : \(DF\) à la date de paiement (discountFactor) et \(DF\) à la date de repricing (adjustedDiscountFactor, §1.9). Pour un flux qui n’est pas déplacé, les deux sont égaux.

La courbe d’actualisation est celle du scénario : dans PARALLEL_UP, tous les flux sont actualisés sur la courbe choquée, qu’ils soient certains ou non.

1.6 Bases de calcul (fraction d’année)

La fraction d’année \(\tau_B(t_a, t_b)\) est calculée selon la base portée par le taux de l’opération :

Base Formule
EXACT_EXACT \(\dfrac{\text{jours}(t_a, t_b)}{\text{jours}(t_b - 1\text{ an},\ t_b)}\) (365 ou 366 selon l’année qui précède \(t_b\))
EXACT_365 \(\dfrac{\text{jours}(t_a, t_b)}{365}\)
EXACT_360 \(\dfrac{\text{jours}(t_a, t_b)}{360}\)
ABB_30_360 \(\dfrac{360\,(a_b - a_a) + 30\,(m_b - m_a) + (j_b - j_a)}{360}\), où \(a\), \(m\), \(j\) sont l’année, le mois et le quantième du jour, après ajustement : \(j_a = 31 \Rightarrow j_a = 30\), puis \(j_b = 31\) et \(j_a = 30 \Rightarrow j_b = 30\)

ABB_30_360 est la base 30/360 bond basis (ISDA 2006 §4.16(f), « 30/360 », « 360/360 », « Bond Basis ») ; la fin de février n’est pas ajustée. Exemples : 15/01 → 14/02 = 29/360, 31/01 → 28/02 = 28/360, 31/03 → 30/06 = 90/360. C’est la seule base 30/360 du moteur : un libellé 30E/360 importé y est rattaché, et ne diffère d’elle que pour une fin de période au 31 précédée d’un début avant le 30.

1.7 Le coupon et sa décomposition analytique

Montant d’intérêt

Le taux client global d’un coupon est la composante « taux » (taux fixe contractuel, ou taux de l’index pour un variable) augmentée du spread contractuel :

\[R = r_{taux} + m\]

Le montant d’intérêt dépend du mode d’intérêt du taux (interestMode) :

Mode Intérêt sur la période \([t_{k-1}, t_k]\)
SIMPLE \(I = N \cdot R \cdot \tau_B(t_{k-1}, t_k)\)
COMPOUND \(I = N \cdot \big[(1 + R)^{\tau_B(t_{k-1}, t_k)} - 1\big]\)

Certaines familles calculent le coupon autrement (fraction \(1/p\) de la fréquence, tableau d’amortissement) : chaque fiche produit précise la formule qu’elle utilise.

Décomposition taux / liquidité / marge

Chaque coupon est décomposé en trois composantes, dont la somme redonne le coupon :

\[R = \underbrace{r_{taux}}_{\text{RATE}} + \underbrace{\ell}_{\text{LIQUIDITY}} + \underbrace{(R - r_{taux} - \ell)}_{\text{MARGIN}}\]

Le spread de liquidité \(\ell\) est le spread porté par le produit (liquiditySpread) s’il en a un, sinon le taux lu à la date de fin de période sur la courbe LIQUIDITY_SPREAD de la devise (0 si la lecture échoue ; une courbe absente est une erreur). Le montant est réparti au prorata des taux :

\[I_{RATE} = I \cdot \frac{r_{taux}}{R} \qquad I_{LIQUIDITY} = I \cdot \frac{\ell}{R} \qquad I_{MARGIN} = I \cdot \frac{R - r_{taux} - \ell}{R}\]

(toutes nulles si \(R = 0\)). Le flux porte aussi la composante GLOBAL = \(I\).

Coupon couru

Si la date d’arrêté tombe dans la période du coupon, le flux est marqué broken et porte la part courue à \(t_0\) :

\[I_{couru} = I \cdot \frac{\tau_B(t_{k-1}, t_0)}{\tau_B(t_{k-1}, t_k)}\]

Choix du contexte de taux

Un coupon certain est toujours valorisé sur le contexte BASELINE ; un coupon incertain sur le contexte du scénario en cours. C’est la règle centrale de l’IRRBB : un taux déjà fixé ne bouge pas avec le choc, de sorte que pour un flux certain \(I_{BASELINE} = I_{PARALLEL\_UP} = I_{PARALLEL\_DOWN}\).

Taux d’un coupon à taux variable

Pour un taux FLOATING, la composante \(r_{taux}\) est déterminée dans l’ordre suivant :

  1. Pas d’index (index vide ou non reconnu) : le taux actuellement porté par l’opération (rate.value). L’opération reste variable mais devient insensible aux chocs ; un avertissement le signale.
  2. Coupon en cours avec fixing connu : si le coupon a déjà commencé (\(t_{k-1} \le t_0\)) et que l’opération porte son fixing (rate.value non nul), ce fixing est le taux du coupon (le préfixing reste prioritaire). Un rate.value à 0 est traité comme « fixing non communiqué » et la courbe est lue.
  3. Mode LAST_FIXING et coupon incertain : le dernier taux connu, choqué (§4.4).
  4. Cas général : le forward de l’index sur la période du coupon, \(F_B(\max(t_{k-1}, t_0),\ t_k)\) dans la base du taux, lu sur la courbe du contexte retenu.

Les swaps appliquent les règles 1, 3 et 4 (pas la règle 2 : la valeur du taux d’une jambe variable n’est qu’informative). Les fiches produits le précisent.

1.8 Certitude d’un flux

La certitude dit si le taux qui détermine le flux est déjà connu. Elle est calculée par le moteur, dans cet ordre :

Condition Certitude
Opération de production nouvelle (original = false) UNCERTAIN
Flux de capital CERTAIN
Pas de taux, ou taux sans type CERTAIN
Taux FIXED CERTAIN
Taux FLOATING sans index CERTAIN
Taux FLOATING, coupon dont la période est connue CERTAIN si \(t_{k-1} \le t_0\) (coupon en cours, fixé en début de période), UNCERTAIN sinon
Taux FLOATING, flux sans période (tranches d’écoulement) CERTAIN si la date du flux \(\le\) prochaine date de fixing, UNCERTAIN sinon

Prochaine date de fixing (règle calendaire) : le ténor est lu dans le nom de l’index (ESTR, EONIA, O/N → 1 jour ; 12M / 1Y → 12 mois ; 6M ; 3M ; 1M), à défaut dans la période de refixing de la courbe, à défaut 3 mois (avec un avertissement). La date est ensuite : lendemain de l’arrêté (1 jour), fin du mois, fin du trimestre, fin du semestre ou fin d’année civile (strictement après \(t_0\)).

La première règle s’impose à tous les flux, y compris aux échanges de capital que les générateurs créent directement en CERTAIN : elle est appliquée à la construction de chaque flux, si bien qu’aucun flux d’une opération de production nouvelle n’est certain.

1.9 Date de repricing d’un capital à taux variable

Pour l’EVE et le gap de taux, le capital d’une opération à taux variable n’est pas positionné à son échéance contractuelle mais à sa prochaine date de repricing : après le refixing, la jambe repart au pair et n’a plus de sensibilité au taux (doc/IRRBB.md).

Le moteur applique, à chaque opération, produit, devise et origine :

  1. Parmi les coupons à taux variable, on prend la fin du dernier coupon certain (le coupon en cours).
  2. S’il n’y en a pas (départ différé, production nouvelle), la fin du premier coupon à venir.
  3. Tout flux de capital à taux variable payé après cette date reçoit cette date comme date ajustée (adjustedEndDate) et la bande temporelle correspondante (adjustedTimeBucket) ; les flux antérieurs (un échange initial à départ différé) gardent leur date.

Exemple (swap payeur fixe contre Euribor 3M, nominal 100 M€, dernier reset aujourd’hui, maturité 5 ans) : sur la jambe variable, le coupon déjà fixé est payé dans 3 mois et le principal de 100 M€ est positionné dans 3 mois. La sensibilité EVE de la jambe est celle d’un actif à 3 mois, pas à 5 ans.

Un capital à taux fixe n’est jamais déplacé : sa date ajustée est sa date contractuelle.

1.10 Conventions de signe

Les flux sont signés du point de vue de la banque. Le signe d’une opération combine son sens (\(s = +1\) pour BUY, \(-1\) pour SELL) et le sens du flux (OutflowSign : \(+1\) entrée, \(-1\) sortie) :

Produit Échange initial Coupons Remboursement
Prêt in fine, prêt amortissable (BUY = prêt accordé) \(-s \cdot N\) \(+s\) \(+s\)
Dépôt à terme (BUY = dépôt reçu) \(+s \cdot N\) \(-s\) \(-s\)
Titre (BUY = titre acheté) \(-s \cdot (N - \text{prime})\) \(+s\) \(+s \cdot N\)
Repo (BUY = prise en pension, prêt d’espèces) \(-s \cdot N\) \(+s\) \(+s \cdot N\)
Swap, jambe reçue \(-s \cdot N\) \(+s\) \(+s \cdot N\)
Swap, jambe payée \(+s \cdot N\) \(-s\) \(-s \cdot N\)
Dépôt à vue, solde comptable (dépôt : \(+N\)) signe du montant importé signe du montant importé

Un passif a donc des flux, une EVE, une NII et une MV négatives dans le moteur. La convention de l’ITS EBA (« passifs en positif ») n’est appliquée qu’à la présentation, dans les états J (chapitre 5).

1.11 Devises

Chaque flux est calculé dans sa devise, puis converti en devise pivot du contexte :

\[CF^{pivot} = CF \cdot x(t_k)\]

où \(x(t_k)\) est le nombre d’unités de devise pivot pour une unité de la devise du flux, lu à la date du flux sur une courbe FX : la paire PIVOT/DEV est cherchée d’abord (on prend \(1/\text{fixing}\)), puis DEV/PIVOT (on prend le fixing). Un flux déjà en devise pivot a \(x = 1\). Sans courbe de change, l’opération est en erreur.

Les indicateurs réglementaires (EVE, NII, MV, notionnels) sont calculés par devise, dans la devise du flux ; la contre-valeur pivot sert aux vues de gestion (gaps, restitutions).

1.12 Bandes temporelles

Chaque flux est rattaché à l’une des 19 bandes de repricing EBA, d’après sa date de paiement (timeBucket) et sa date de repricing (adjustedTimeBucket) :

Bande Intervalle Bande Intervalle
1 \(]t_0,\ t_0 + 1j]\) (overnight) 11 \(]4a, 5a]\)
2 \(]1j, 1m]\) 12 \(]5a, 6a]\)
3 \(]1m, 3m]\) 13 \(]6a, 7a]\)
4 \(]3m, 6m]\) 14 \(]7a, 8a]\)
5 \(]6m, 9m]\) 15 \(]8a, 9a]\)
6 \(]9m, 12m]\) 16 \(]9a, 10a]\)
7 \(]12m, 18m]\) 17 \(]10a, 15a]\)
8 \(]18m, 2a]\) 18 \(]15a, 20a]\)
9 \(]2a, 3a]\) 19 \(> 20a\)
10 \(]3a, 4a]\)

Les bornes sont calendaires (date d’arrêté + n mois / n années) : un flux payé exactement un an après l’arrêté appartient à la bande 6 (\(]9m, 12m]\)), pas à la bande 7.