Exécution des simulations
Onglet Cash Flow Generation

Cet onglet liste les générations de cash flows lancées à partir de cette situation. Le nombre de générations est affiché entre crochets dans le libellé de l’onglet (ex. : Cash Flow Generation [2]).
| Colonne | Description |
|---|---|
| Generation Start | Date et heure de lancement du calcul, avec indication du temps de traitement (ex. : Calculation took 54 seconds). Le lien est cliquable pour accéder au détail de la génération. |
| Evaluation Date | Date d’évaluation utilisée pour le calcul des cash flows. |
| Scenario | Scénario de stress appliqué (ex. : IRRBB). |
| # Cashflows | Nombre total de cash flows générés. |
| # Errors | Nombre d’erreurs rencontrées durant la génération. |
| # Warnings | Nombre d’avertissements relevés durant la génération. |
| Status | Barre de progression indiquant le pourcentage d’avancement ou d’achèvement du calcul (ex. : 100% en vert). |
L’icône ⋮ en fin de ligne ouvre un menu contextuel contenant l’option Delete, qui supprime définitivement la génération de cash flows.
Échec d’une génération
Une génération de cash flows qui se termine en ERRORS est annoncée par une notification Cash Flow generation failed, affichée comme un échec dans la liste des notifications. Ses anomalies (colonne # Errors, détail de la génération) en donnent la cause.
Une génération ou un reporting qui reste en cours plus de 2 heures sans réponse du moteur de calcul est arrêté : il passe en ERRORS avec une anomalie de type Timeout (« risk-engine did not answer within 2 hours; the run is marked failed… », RUN-009) et une notification Cash Flow generation failed ou Report Generation failed. Le délai est un paramètre de l’installation. Relancez le calcul ; s’il échoue de la même façon, contactez le support.
Lancer un calcul malgré des erreurs d’import
Quand l’import de la situation porte au moins une anomalie de niveau ERROR, le lancement d’un calcul, simulation (génération de cash flows) comme run officiel (reporting IRRBB), demande une confirmation. L’application affiche alors le nombre d’anomalies de l’import, par niveau puis par code ; chaque code renvoie à sa fiche dans la référence des anomalies. Les anomalies anciennes, enregistrées avant les codes, sont comptées sous le code que leur message permet de reconnaître ; celles qu’aucun code ne reconnaît sont regroupées par type. Les WARNING sont listés mais ne bloquent jamais.
Deux choix sont proposés : lancer le calcul malgré tout, ou consulter d’abord les anomalies de l’import. Le serveur refuse un lancement sans cette confirmation, quel que soit l’écran ou l’outil qui le demande.
Un calcul lancé malgré des erreurs enregistre l’accord sur la génération :
| Information | Contenu |
|---|---|
| Utilisateur | Identifiant, nom d’utilisateur, nom et adresse e-mail de la personne qui a confirmé, tels que le compte les donne. |
| Date | Date et heure de la confirmation. |
| Nombres | Nombre d’ERROR et de WARNING de l’import à ce moment-là. |
| Codes | Le détail par code (niveau, type, nombre) des ERROR et WARNING présentés. |
L’accord reste attaché à la génération et ne change plus, même si l’import est corrigé ensuite. Un run officiel le porte aussi sur sa génération de reporting (voir Génération des reportings IRRBB). Un import sans ERROR ne demande aucune confirmation, et la génération n’enregistre alors aucun accord.
Seules les anomalies de l’import lui-même sont comptées. Les contrôles fichier par fichier de l’import guidé n’entrent pas dans le décompte : un import dont un fichier est en erreur ne peut pas être soumis, et l’import de l’archive signale à nouveau ce que ces contrôles avaient relevé.
Entrée d’un run et rejeu
Au lancement d’une génération, simulation comme run officiel, l’application assemble l’entrée du run (RunInput) : le portefeuille de la situation dans sa révision du moment (deals ajoutés ou modifiés compris), reclassé avec la configuration client (Classification à l’import et au lancement d’un run), le contexte d’évaluation et ses courbes, l’arrêté, la configuration client complète et les hypothèses de la simulation. Elle l’écrit une seule fois dans le stockage objet (S3) du tenant, sous alm/<tenant>/runs/<run>/input.json, et ne la réécrit jamais.
Le moteur de calcul lit cette entrée et rien d’autre : il ne relit ni la situation, ni la configuration, ni les fichiers importés. Il écrit ses résultats à côté, par blocs sous runs/<run>/result/, avec un manifest.json qui les liste ; l’application les charge à partir de ce manifeste. Supprimer une génération supprime ces objets. Une entrée absente ou illisible arrête le run (RUN-025), comme un moteur qui ne lit pas la version de contrat de l’entrée (RUN-024).
Le moteur ne reçoit aucune autre demande de calcul : la génération de flux, le run officiel IRRBB et le calcul de solvabilité de l’API (POST /api/v1/risk/solvency/generate/portfolio/{id}/context/{contextId}, sur le portefeuille, ses opérations et le contexte) sont tous des runs sur une entrée de ce type.
Recalculer une génération
Une génération dont l’entrée est enregistrée peut être recalculée : une nouvelle génération est créée sur une copie de la même entrée (même révision de la situation, même révision de la configuration, mêmes hypothèses, même accord sur les anomalies de l’import) et calculée par le moteur déployé aujourd’hui. Seul le calcul change : un écart entre les deux générations vient de l’évolution du moteur, pas des données. Un run officiel recalculé produit aussi son reporting. La génération d’origine reste dans la liste.
Le bouton Recalculer (Recalculate) apparaît, dans la liste des générations de cash flows de la situation, sous le badge Calcul antérieur de chaque génération qui le porte ; le bandeau Le moteur a changé propose la même action pour la dernière génération officielle. Il lance le recalcul (POST /api/v1/generation/cashflows/{id}/recalculate, qui répond l’identifiant de la nouvelle génération) et ouvre aussitôt la nouvelle génération : tant qu’elle est calculée, sa page l’indique (« Ce run est en cours de calcul ; la page se met à jour une fois le calcul terminé. ») et se met à jour seule à la fin du calcul.
Une génération lancée avant l’enregistrement des entrées de run n’a pas d’entrée : le recalcul est refusé. Une fenêtre Ce run ne peut pas être recalculé donne la raison renvoyée par le serveur (« This run was launched before runs by reference and kept no input; launch it again instead. ») et propose Lancer un nouveau run, qui ouvre la fenêtre de lancement du même type de génération. Il en va de même si l’entrée n’est plus dans le stockage objet.
Recalculer reprend les données telles qu’elles étaient au lancement d’origine. Pour une génération Obsolète, dont la situation a changé depuis, lancez une nouvelle génération : c’est elle qui prend en compte les données actuelles.
Version du moteur et version de calcul
Chaque génération de cash flows et chaque génération de reporting enregistre le moteur de calcul qui l’a produite. Les deux informations suivantes sont affichées dans la liste des générations et dans l’en-tête du détail d’une génération :
| Libellé | Description |
|---|---|
| Version du moteur (Engine version) | Version de build du moteur : version de l’artefact suivie du commit (ex. : 1.0.0-SNAPSHOT+3f2a9c1). Elle identifie exactement le moteur qui a fait le calcul. |
| Version de calcul (Calculation version) | Nombre entier que l’équipe du moteur augmente à chaque évolution qui modifie les chiffres produits. Une évolution qui ne change pas les chiffres (performance, journalisation, correctif sans effet sur les résultats) ne l’augmente pas. Chaque version de calcul est accompagnée d’une note d’une ligne décrivant ce qui a changé. |
Les générations lancées avant l’enregistrement de ces versions affichent Inconnue (Unknown).
Badge Calcul antérieur
Une génération dont la version de calcul est inférieure à la version de calcul actuelle du moteur porte le badge Calcul antérieur (Older calculation). Son info-bulle indique : « Calculé avec une version de calcul antérieure — recalculez-le pour obtenir les chiffres actuels. » Ses chiffres ne sont plus ceux que donnerait le moteur aujourd’hui : l’action Recalculer les obtient, sur les mêmes données (Recalculer une génération).
Une génération lancée avant l’enregistrement des versions (version Inconnue) porte aussi le badge dès que la version de calcul actuelle est connue : rien ne montre qu’elle a été calculée avec le calcul actuel.
La version de calcul actuelle est celle du moteur déployé. Le moteur annonce sa version à l’application à chaque démarrage, et l’application la lui demande aussi à son propre démarrage. Juste après le déploiement d’un nouveau moteur, avant même que quiconque ait relancé une génération, l’application connaît donc la version de calcul actuelle, et le badge est juste dès ce moment.
Après un retour à un moteur plus ancien (rollback), c’est la version du moteur déployé qui devient la version actuelle : les générations faites par le moteur plus récent ne sont pas signalées comme dépassées.
Ce badge est distinct du badge Obsolète (Obsolete), qui signale que les données de la situation ont changé depuis la génération. Calcul antérieur signale que c’est le calcul lui-même qui a changé. Une génération peut porter les deux badges : Recalculer corrige le premier, seule une nouvelle génération corrige le second.
Avertissement : le moteur a changé depuis la dernière génération
Sur la page de détail d’une situation, un bandeau d’avertissement apparaît lorsque la dernière génération officielle de la situation a été calculée avec une version de calcul antérieure à celle du moteur actuel. Les cash flows et le reporting d’une génération officielle sont produits ensemble : ils comptent pour une seule génération, et le bandeau est le même dans les sections Cash flows et Reportings. La dernière génération officielle est la plus récente dont les cash flows et le reporting ont tous deux réussi : une génération en échec est ignorée, et les simulations personnalisées ne sont pas prises en compte. Le bandeau apparaît lorsque les cash flows ou le reporting de cette génération sont antérieurs, et reste masqué tant qu’une génération officielle plus récente est en cours. Il indique :
Le moteur de calcul a changé depuis la dernière génération (version x → y, déployé le date)
suivi de la note décrivant ce qui a changé dans le calcul, et d’une action Recalculer (Recalculate), qui recalcule cette dernière génération officielle, cash flows et reporting, avec le moteur actuel (Recalculer une génération).
Les générations faites avant l’enregistrement des versions du moteur (avant le 27/10/2026, version Inconnue) comptent comme antérieures dès que la version actuelle est connue. Le bandeau l’indique alors par la mention « … faite avant l’enregistrement des versions du moteur ».
Que faire : cliquez sur Recalculer pour obtenir des chiffres issus du calcul actuel. La génération précédente reste disponible dans la liste des générations.
Détail d’une génération de Cash Flows
Cette page présente le résultat complet d’une génération de cash flows lancée depuis une situation ALM. Elle donne accès au portefeuille utilisé, aux cash flows calculés, aux gaps de liquidité, aux métriques par opération, aux scénarios de stress, au script d’accès aux données et aux logs de calcul.
Onglet Portfolio

Cet onglet liste les instruments financiers du portefeuille tels qu’ils ont été utilisés lors de la génération. Il est identique à l’onglet Portfolio de la situation ALM (voir Onglet Portfolio), avec le même panneau de filtres et les mêmes colonnes : Reference, Generation, Type, Tra. Date, Details, Currency, Nominal, Residual Maturity.
Onglet Cash Flows

Cet onglet affiche la liste détaillée de tous les cash flows générés.
Filtres disponibles
| Filtre | Description |
|---|---|
| Transaction Reference | Recherche par référence de transaction. |
| Time Bucket | Sélection des tranches temporelles à afficher. |
| Scenario | Scénario de calcul appliqué (ex. : BASELINE). |
| Rate Type | Type de taux des cash flows (ex. : FIXED, FLOATING). |
| Origin | Origine du cash flow (ex. : CONTRACTUAL). |
| Certainty | Niveau de certitude (ex. : CERTAIN, UNCERTAIN). |
| Nature | Nature du flux (ex. : INTEREST, CAPITAL). |
Les exports sont disponibles aux formats CSV, Excel et Parquet. Une case Export Filtered View permet d’exporter uniquement les données filtrées.
Colonnes du tableau
| Colonne | Description |
|---|---|
| $Tra Ref | Référence de la transaction (lien cliquable vers le détail). |
| Detail | Numéro de flux ou type de paiement (ex. : #002, FINAL, InFine Interest Payment). |
| Date | Date du cash flow. |
| Bucket | Tranche temporelle d’appartenance (ex. : B_06_12M, B_12_6Y). |
| Scenario | Scénario appliqué (ex. : BASELINE). |
| Origin | Origine contractuelle ou modélisée. |
| Certainty | Niveau de certitude du flux. |
| Nature | Nature du flux : intérêt ou capital. |
| Rate | Taux appliqué au flux. |
| Rate Model | Modèle de taux utilisé (ex. : FX). |
| Amount | Montant du cash flow dans la devise de l’instrument. |
| DF | Facteur d’actualisation appliqué. |
| EVE | Contribution à l’Economic Value of Equity. |
| NIM | Contribution au Net Interest Margin. |
| MV | Valeur de marché du flux. |
Onglet Gaps
Cet onglet présente une analyse des gaps de liquidité (écarts entre entrées et sorties de cash flows) sur l’horizon de calcul.
Quand le gap, son rapport ou les métriques reposent sur une règle par défaut (devise pivot absente, génération de comparaison choisie par la solution…), un bandeau d’avertissements s’affiche au-dessus du résultat, avec le lien vers la fiche de chaque code (voir Où voir les avertissements).
Filtres disponibles
| Filtre | Description |
|---|---|
| Scenario | Scénario sélectionné (ex. : BASELINE). |
| From / To | Plage de dates de l’analyse. |
| W / M / Q | Granularité temporelle : hebdomadaire, mensuelle ou trimestrielle. |
| Currencies | Filtre par devise. |
| Tags | Filtre par tags. |
| Reference | Filtre par référence de transaction. |
| Product | Filtre par type de produit. |
| Show cumulative | Case à cocher pour afficher les valeurs cumulées. |
Sous-onglet Chart

Affiche un graphique en barres représentant pour chaque période :
- Cumulative Inflows (barres vertes) : entrées de cash flows cumulées.
- Cumulative Outflows (barres rouges) : sorties de cash flows cumulées.
- Net Flows IF-OF (ligne pointillée verte) : flux nets.
- Cumulative Net Flows IF-OF (ligne pointillée grise) : flux nets cumulés.
Sous-onglet Table

Affiche les mêmes données sous forme de tableau croisé par Classification (ex. : A_DEBT_SECURITIES, A_INTERBANK, A_LOANS_AND_ADVANCES) et par période temporelle. Les valeurs négatives sont affichées en rouge. Les exports sont disponibles aux formats CSV, Excel et Parquet.
Détail d’un chiffre du gap
Double-cliquer sur un chiffre du sous-onglet Table ou du rapport IRRBB ouvre la page Détail du chiffre du gap. Elle rappelle la cellule (classe, période ou bande, mesure) et le chiffre, puis sa formule. Elle garde les filtres du gap affiché.
Pour un chiffre d’une classe, la section Opérations liste ce qui le compose, par ordre d’importance :
- l’opération, qui s’ouvre d’un clic, sa contribution au chiffre et sa part du chiffre. La somme des contributions redonne exactement le chiffre ;
- en dépliant la ligne, ses flux de capital : date, début de période, rôle de couverture, montant en devise pivot, poids et contribution.
Les flux retenus dépendent de la mesure :
| Mesure | Flux retenus |
|---|---|
| Entrées, sorties, flux net | Ceux de la période : positifs, négatifs ou tous. |
| Entrées ou sorties cumulées | Positifs ou négatifs, jusqu’à cette période dans le sens choisi. |
| Encours d’ouverture | Ceux de la période et de toutes les suivantes. |
| Encours de fin de période | Ceux des périodes suivantes uniquement. |
| Encours moyen | Ceux des périodes suivantes, plus ceux de la période au poids ½. |
Un flux de montant nul ne change aucun chiffre et n’est pas listé. Dans le tableau du sous-onglet Table, une classe qui mêle plusieurs rôles de couverture est sommée : son détail liste les flux de tous les rôles. Le rapport les sépare, et chaque ligne y ouvre le détail de son rôle.
Les lignes publiées du rapport (gap de fin de période, gap avant et après couverture, contributions des couvertures) sont des formules : la page montre leurs chiffres utilisés, chacun avec son signe et un lien vers son propre détail, et non une liste de flux. Les lignes de comparaison au mois précédent, et le graphique, n’ouvrent pas de détail.
Onglet Metrics
Cet onglet présente les indicateurs de la génération par opération et par scénario, sur une origine à la fois (comportementale par défaut), en devise pivot.
| Colonne | Contenu |
|---|---|
| EVE | Valeur actuelle des flux certains, à leur date de repricing. |
| NII (12 mois) | NII du moteur (NIM1Y) : intérêts courus sur les 12 mois qui suivent l’arrêté (§3.3). |
| Intérêts totaux sur la durée de vie | Somme non actualisée, en caisse, de tous les flux d’intérêt de l’opération. Ce n’est pas une NII. |
| VM | Valeur actuelle de tous les flux, à leur date de paiement. |
C’est une vue de gestion, et son libellé le dit : « EVE et VM : vue de gestion, bilan constant et opérations sans FINREP inclus. Les modèles IRRBB font foi. » Ces chiffres peuvent donc différer de la synthèse du reporting et des états : §3.9 donne les causes et un exemple.
L’onglet métriques de la page d’une opération montre les mêmes mesures, l’EVE y étant libellée « VEF », et y ajoute « Intérêts payés sous un an » et la valeur de marché à un an. La comparaison de situations reprend le même libellé.
Quand un calcul n’a enregistré aucune décision de NII pour une opération, la colonne affiche « — » et un message demande de relancer le calcul.
Les exports CSV, Excel et Parquet portent ces mesures sous les noms suivants, qui remplacent nim, nimOneYear et deltaNim :
| Colonne exportée | Contenu |
|---|---|
earnedNii, deltaEarnedNii |
NII (12 mois) et sa variation par rapport au scénario de référence. Vides si le calcul n’a enregistré aucune décision. |
wholeLifeInterest, deltaWholeLifeInterest |
Intérêts totaux sur la durée de vie et leur variation. |
oneYearCashInterest |
Intérêts payés sous un an. |
Onglet Scenarios

Cet onglet affiche les paramètres du contexte d’évaluation pour chaque scénario de stress appliqué lors de la génération.
Une liste de scénarios est affichée à gauche (ex. : BASELINE, PARALLEL_UP, PARALLEL_DOWN, SHORT_DOWN, SHORT_UP, FLATTENER, STEEPENER, UP_1_BP). Pour une simulation personnalisée, la liste ne contient que BASELINE, les scénarios choisis et, le cas échéant, CUSTOM. En sélectionnant un scénario, le panneau de droite affiche :
- Pivot Currency : devise de référence du scénario.
- Discount Factor Index : index d’actualisation utilisé.
- Le tableau des courbes de taux associées au scénario, avec les colonnes Curve, Index, Curve Type, Reference Date, Currency.
Onglet Notebook Access

Cet onglet fournit un script Python prêt à l’emploi pour accéder aux données de la génération stockées au format Parquet sur le serveur S3.
Trois actions sont disponibles en en-tête :
- Generate or regenerate Parquet File : génère ou régénère le fichier Parquet associé à la génération (le fichier précédent est écrasé).
- Delete Parquet File : supprime le fichier Parquet existant.
- Download python file : télécharge le script Python affiché.
Le script affiché configure automatiquement la connexion S3 avec les paramètres S3_ENDPOINT, S3_ACCESS_KEY et S3_SECRET_KEY, puis charge les données dans un DataFrame pandas via pyarrow.parquet.
Onglet Calculation Logs

Cet onglet regroupe tous les logs de calcul produits lors de la génération. Le nombre total de logs est affiché dans le libellé de l’onglet. Une icône d’alerte signale la présence d’anomalies.
Filtre disponible
Les logs se lisent dans le journal des anomalies, le même pour tous les écrans d’anomalies : compteurs par niveau qui filtrent, recherche dans le message, la référence et le code, filtre Code ou type, vues Liste et Par code, export Excel. Au-delà de 50 logs, le journal s’ouvre sur la vue Par code, qui regroupe les logs identiques : une ligne par code, ou par type et message, avec son nombre d’occurrences.
Colonne du tableau
La vue Liste affiche Niveau, Code (lien vers la fiche du code dans la référence des anomalies), Référence et Message ; le type, l’objet et les détails se déplient sous la ligne.
Types d’erreurs des Calculation Logs
Les principaux types d’erreurs, accessibles via le filtre Code ou type, sont décrits ci-dessous. Chaque log porte aussi un code, décrit dans la Référence des anomalies : domaine RUN pour les erreurs qui arrêtent toute la génération, CFW pour les flux, courbes et taux de chaque opération.
| Type | Niveau | Objet | Description |
|---|---|---|---|
| TermCashflowGenerator | WARNING |
Cashflow ignored |
Un cash flow a été ignoré car il se situe après la date de call de l’instrument. Comportement attendu pour les instruments remboursables par anticipation. |
| CashFlowCertaintyException | ERROR |
CertaintyLevel |
Le moteur n’a pas pu déterminer de cash flow certain pour la transaction (No CERTAIN cashflow for transaction). Peut affecter les analyses de liquidité. |
| RateEvaluation | WARNING |
Discount Factor |
Aucune courbe de taux n’est définie pour l’index utilisé dans le calcul du facteur d’actualisation (ex. : EURIBOR 6M SWAP). Non bloquant. |
| RateEvaluationException | ERROR |
Rate |
Le moteur a échoué à évaluer le taux d’un instrument en raison d’une courbe d’actualisation introuvable (ex. : DISCOUNT_EUR). Vérifiez le mapping de l’index dans le contexte d’évaluation. Une courbe du contexte sans aucun point se lit Rate curve '<courbe>' (index <index>) has no points, so no rate can be read from it. (CFW-024, CFW-028, CFW-051) |
| UnsupportedCashFlow | ERROR |
FLOATING_RATE_UNSUPPORTED, RATE_TYPE_MISSING ou RATE_VALUE_MISSING |
Les flux de l’opération n’ont pas été générés, pour une cause que le moteur nomme : Cash flows of transaction '<référence>' could not be generated: <cause>., la cause étant its rate is floating, and this interest flow is only computed for a fixed rate (taux variable sur un calcul réservé aux taux fixes), its rate is neither fixed nor floating, so its interest cannot be computed (taux sans type) ou its rate is fixed but has no value, so its interest cannot be computed (taux fixe sans valeur). Vérifiez le type et le taux de l’opération. (CFW-052, CFW-053, CFW-054) |
| CashFlowException | ERROR |
Rate |
Les flux de l’opération n’ont pas été générés ; le message donne la cause, par exemple un poste de bilan sans loi d’écoulement : Cash flows of this balance-sheet line could not be generated: it has no run-off (outflow) strategy. (ou its run-off strategy '…' is neither linear nor by time bucket.). Vérifiez le modèle d’écoulement (Référence des imports). (CFW-055, CFW-056) |
| UnexpectedError | ERROR |
?? |
Dernier recours pour un échec que le moteur n’a pas prévu : Cash flows of this transaction could not be generated: internal error (details in the risk-engine log). Signalez-le avec la référence de l’opération. (CFW-004) |