cdm

cdm

Description

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.

proc cas; cdm.cdm / adjustedSeverity={...}, aggLossModelType="COLLECTIVERISK" | "CUSTOM" | "PUREPREMIUM", countDistributions={{...}, {...}, ...}, countStore={...}, countVariable="variable-name", display={...}, idVariable="variable-name", ignoreParmCovariance=TRUE | FALSE, maxCountDraw=integer, nPerturbedSamples=integer, nReplicates=64-bit-integer, outDraw={...}, output={...}, outputTables={...}, outsum={...}, percentileMethod=integer, perturbMode="AUTO" | "DIST", plotTable={...}, seed=integer, severityDefinitions={...}, severityDistributions={"string-1" <, "string-2", ...>}, severityEst={...}, severityStore={...}, severityTruncationLeft=double, severityTruncationRight=double, table={...}, truncateZeros=TRUE | FALSE, varianceDivisor="DF" | "N"; run;
Paramètres
ParamètreDescription
severityDefinitionsSpé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.
countDistributionsPermet 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é.
countStoreSpé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.
severityStoreSpé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`).
nReplicatesDé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.
outputParamè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.
outsumPermet 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).
seedFixe la graine du générateur de nombres aléatoires pour garantir la reproductibilité des simulations.
adjustedSeverityPermet 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.
nPerturbedSamplesActive 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.
Préparation des Données Voir la fiche de ce code dataprep
Création des données de définition de la sévérité

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).

Copié !
1DATA casuser.sevdeff(promote=yes);
2 LENGTH model $ 32;
3 model = 'sevd1';
4 dist = 'LGN';
5 parm1 = 1.5;
6 parm2 = 0.5;
7 OUTPUT;
8RUN;

Exemples

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`.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC 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}};
8RUN;
9QUIT;
Résultat :
Une table CAS `casuser.cdmsample_simple` est créée. Elle contient 100 000 lignes et une colonne `_AGGSEV_` qui représente l'échantillon simulé de la perte agrégée. Aucune sortie n'est affichée dans le log SAS, car l'action ne produit des tables de résultats que si demandé via `display` ou `outputTables`.

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).

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC 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 };
13RUN;
14QUIT;
Résultat :
En plus de la table d'échantillon `casuser.cdmsample_stats`, une seconde table `casuser.cdmsummary` est créée. Elle contiendra une seule ligne avec des colonnes pour chaque statistique demandée : `_MEAN_`, `_VARIANCE_`, `_STDDEV_`, `P95`, `P97_5`, `P99`, et `P99_5`. Ces valeurs résument la distribution de la perte agrégée.

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.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC 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 };
16RUN;
17QUIT;
Résultat :
Une table `casuser.cdmsample_adj` est créée. Elle contient deux colonnes de résultats : `GrossLoss` (la perte agrégée brute, basée sur `_SEV_`) et `NetLoss` (la perte agrégée nette, basée sur `loss_net_of_deductible`). On s'attend à ce que les valeurs dans `NetLoss` soient inférieures à celles de `GrossLoss` en raison de la franchise appliquée.

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).

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1DATA 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;
8RUN;
9 
10PROC 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 };
27RUN;
28QUIT;
Résultat :
Deux tables CAS sont créées : `cdmsample_perturb` et `cdmsummary_perturb`. La table `cdmsummary_perturb` est la plus intéressante ici : elle contiendra 50 lignes, une pour chaque échantillon perturbé. Chaque ligne aura une colonne `_PerturbSampleId_` (de 1 à 50) et une colonne `P99_5`. L'analyse de la distribution des valeurs dans la colonne `P99_5` permet de quantifier l'incertitude sur l'estimation de la VaR à 99.5%.