L'action `cdm` (Compound Distribution Modeling) est un outil de simulation puissant au sein de l'action set `Aggregate Loss Modeling`. Son rôle principal est de générer un échantillon de pertes agrégées en se basant sur un modèle de distribution composée. Concrètement, cela permet de modéliser des scénarios complexes où le coût total d'un portefeuille (par exemple, en assurance ou en finance) est le résultat d'un nombre aléatoire d'événements (la fréquence) et du coût aléatoire de chaque événement (la sévérité). C'est fondamental pour l'évaluation des risques, la tarification, et le calcul du capital économique.
| Paramètre | Description |
|---|---|
| severityDefinitions | Spécifie la table CAS contenant les définitions des distributions de sévérité. C'est un paramètre obligatoire qui indique à l'action quelles distributions (Lognormal, Pareto, etc.) utiliser pour simuler le coût de chaque événement. |
| countDistributions | Permet de définir une ou plusieurs distributions de fréquence (nombre d'événements) directement dans le code, avec leurs paramètres. Utile pour des simulations rapides sans modèle de comptage pré-estimé. |
| countStore | Spécifie un item store CAS contenant un modèle de comptage préalablement entraîné (par exemple, avec l'action `countreg.countregFitModel`). C'est l'approche recommandée pour des analyses rigoureuses. |
| severityStore | Spécifie un item store CAS contenant un ou plusieurs modèles de sévérité préalablement entraînés (par exemple, avec l'action `severity.severity`). |
| nReplicates | Définit le nombre de points à simuler pour l'échantillon de la distribution composée. Un nombre plus élevé donne une meilleure précision mais augmente le temps de calcul. |
| output | Paramètre essentiel pour sauvegarder les résultats. Il faut spécifier au minimum une table de sortie (`outSample`) pour stocker l'échantillon des pertes agrégées simulées. |
| outsum | Permet de générer une table de sortie contenant des statistiques descriptives (moyenne, variance, etc.) et des percentiles de l'échantillon de pertes agrégées. Très utile pour l'analyse des risques (ex: Value at Risk). |
| seed | Fixe la graine du générateur de nombres aléatoires pour garantir la reproductibilité des simulations. |
| adjustedSeverity | Permet de définir des variables de sévérité ajustées via un programme SAS. C'est une fonctionnalité avancée pour appliquer des transformations complexes (ex: franchises, plafonds, coassurance) sur chaque perte individuelle avant l'agrégation. |
| nPerturbedSamples | Active l'analyse de perturbation des paramètres. Au lieu d'un seul échantillon, l'action génère N échantillons où les paramètres des modèles de fréquence et de sévérité sont préalablement tirés aléatoirement de leur distribution asymptotique. Cela permet de quantifier l'incertitude des estimations. |
Pour que l'action `cdm` puisse simuler les coûts des sinistres (sévérité), nous devons d'abord lui fournir une table qui définit les distributions à utiliser. Ici, nous créons une table CAS nommée `sevdeff` qui définit une distribution Lognormale (LGN) avec ses paramètres (Mu=1.5, Sigma=0.5).
| 1 | DATA casuser.sevdeff(promote=yes); |
| 2 | LENGTH model $ 32; |
| 3 | model = 'sevd1'; |
| 4 | dist = 'LGN'; |
| 5 | parm1 = 1.5; |
| 6 | parm2 = 0.5; |
| 7 | OUTPUT; |
| 8 | RUN; |
Cet exemple montre le cas d'usage le plus simple. Nous simulons 100 000 points d'une distribution de perte agrégée. La fréquence (nombre de sinistres) suit une loi de Poisson de paramètre 6. La sévérité (coût de chaque sinistre) suit une loi Lognormale définie dans notre table `casuser.sevdeff`. Le résultat est stocké dans la table `casuser.cdmsample_simple`.
| 1 | PROC CAS; |
| 2 | cdm.cdm |
| 3 | nReplicates=100000 |
| 4 | seed=1234 |
| 5 | severityDefinitions={name='sevdeff'} |
| 6 | countDistributions={{name='POISSON', parmValues={{value=6}}}} |
| 7 | OUTPUT={outSample={name='cdmsample_simple', replace=true}}; |
| 8 | RUN; |
| 9 | QUIT; |
Cet exemple est similaire au premier, mais nous utilisons en plus le paramètre `outsum` pour calculer et sauvegarder des statistiques descriptives et des percentiles. Nous demandons la moyenne, la variance, l'écart-type, ainsi que les percentiles 95, 97.5, 99 et 99.5. Ces derniers sont cruciaux pour estimer la Value at Risk (VaR).
| 1 | PROC CAS; |
| 2 | cdm.cdm |
| 3 | nReplicates=100000 |
| 4 | seed=1234 |
| 5 | severityDefinitions={name='sevdeff'} |
| 6 | countDistributions={{name='POISSON', parmValues={{value=6}}}} |
| 7 | OUTPUT={outSample={name='cdmsample_stats', replace=true}} |
| 8 | outsum={ |
| 9 | outSummary={name='cdmsummary', replace=true}, |
| 10 | summaryStatistics={'MEAN', 'VARIANCE', 'STDDEV'}, |
| 11 | percentiles={{percentile=95}, {percentile=97.5}, {percentile=99}, {percentile=99.5}} |
| 12 | }; |
| 13 | RUN; |
| 14 | QUIT; |
Cet exemple illustre une fonctionnalité avancée : l'ajustement de la sévérité. Nous utilisons le paramètre `adjustedSeverity` pour appliquer une franchise de 5 unités monétaires à chaque sinistre. Le code SAS fourni dans le sous-paramètre `code` est exécuté pour chaque sinistre simulé. La variable `_SEV_` est une variable spéciale contenant le montant du sinistre brut. Nous créons une nouvelle variable `loss_net_of_deductible` qui est le maximum entre 0 et (sinistre - franchise). L'agrégation se fait ensuite sur cette perte nette.
| 1 | PROC CAS; |
| 2 | cdm.cdm |
| 3 | nReplicates=100000 |
| 4 | seed=1234 |
| 5 | severityDefinitions={name='sevdeff'} |
| 6 | countDistributions={{name='POISSON', parmValues={{value=6}}}} |
| 7 | adjustedSeverity={ |
| 8 | symbols={'loss_net_of_deductible'}, |
| 9 | code='loss_net_of_deductible = max(0, _SEV_ - 5);' |
| 10 | } |
| 11 | OUTPUT={ |
| 12 | outSample={name='cdmsample_adj', replace=true}, |
| 13 | sampleVariable='GrossLoss', |
| 14 | adjustedSampleVariables='NetLoss' |
| 15 | }; |
| 16 | RUN; |
| 17 | QUIT; |
Cet exemple montre comment évaluer l'incertitude des paramètres. Nous spécifions des erreurs-types pour les paramètres des distributions de fréquence et de sévérité. En utilisant `nPerturbedSamples=50`, l'action va d'abord générer 50 jeux de paramètres en tirant aléatoirement depuis leur distribution (supposée normale). Ensuite, pour chacun de ces 50 jeux, une simulation complète de `nReplicates` est effectuée. Cela permet de construire un intervalle de confiance autour des métriques de risque (comme la VaR).
| 1 | DATA casuser.sevdeff_se(promote=yes); |
| 2 | LENGTH model $ 32; |
| 3 | model = 'sevd1'; |
| 4 | dist = 'LGN'; |
| 5 | parm1 = 1.5; se1=0.05; |
| 6 | parm2 = 0.5; se2=0.02; |
| 7 | OUTPUT; |
| 8 | RUN; |
| 9 | |
| 10 | PROC CAS; |
| 11 | cdm.cdm |
| 12 | nReplicates=10000 |
| 13 | seed=1234 |
| 14 | nPerturbedSamples=50 |
| 15 | severityDefinitions={name='sevdeff_se'} |
| 16 | countDistributions={{ |
| 17 | name='POISSON', |
| 18 | parmValues={{value=6, standardError=0.1}} |
| 19 | }} |
| 20 | OUTPUT={ |
| 21 | outSample={name='cdmsample_perturb', replace=true, groupBy='_PerturbSampleId_'} |
| 22 | } |
| 23 | outsum={ |
| 24 | outSummary={name='cdmsummary_perturb', replace=true, groupBy='_PerturbSampleId_'}, |
| 25 | percentiles={{percentile=99.5}} |
| 26 | }; |
| 27 | RUN; |
| 28 | QUIT; |