{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7a149ebe-0121-407d-ab82-22dbdae6833e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "# Calcul de sensibilités"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1bb383e8-5124-4169-b672-77bd10f1b6d1",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy import stats\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "sns.set_theme() \n",
    "from numpy.random import default_rng\n",
    "rng = default_rng()\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e93be7c7-b92f-44c1-9dde-c4e06aaa199c",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "## Problème de charge sinistre\n",
    "\n",
    "On définit la _charge sinistre totale_ (sur une période $T$) par la variable aléatoire positive\n",
    "\n",
    "$$\n",
    "    S = \\sum_{i = 1}^N X_i\n",
    "$$\n",
    "où $N$ est une variable aléatoire à valeurs dans $\\mathbf{N}$ représentant le nombre de sinistres sur la période $T$, et pour $i \\ge 1$, $X_i$ est une variable aléatoire à valeurs dans $\\mathbf{R}_+$ représentant le coût du i-ème sinistre, avec la convention selon laquelle la somme est nulle si $N = 0$. Les $(X_i)_{i \\ge 1}$ sont supposées indépendantes et identiquement distribuées, et indépendantes de $N$ (indépendance fréquences - coûts).\n",
    "\n",
    "Une modélisation classique est de considérer \n",
    "\n",
    "- $N$ de loi de Poisson de paramètre $\\lambda > 0$, \n",
    "- $X_1$ de loi log-normale de paramètres $\\mu > 0$, $\\sigma^2 > 0$, c'est à dire $X_1 = \\exp(G_1)$ avec $G_1 \\sim \\mathcal{N}(\\mu, \\sigma^2)$. \n",
    "\n",
    "Le but est d'estimer la **probabilité de dépassement** c'est à dire calculer la probabilité que la charge sinistre totale dépasse un seuil $K$:\n",
    "\n",
    "$$\n",
    "    p = \\mathbf{P}\\bigl[S > K\\bigr] \\quad \\text{pour $K$ grand}\n",
    "$$\n",
    "\n",
    "Dans la suite on prend $\\lambda = 10$, $\\mu = 0.1$ et $\\sigma = 0.3$ et on considère plusieurs valeurs du seuil $K$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c00bdf6-02a1-4f80-90bd-41b25134f0ff",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "On utilisera la notation $S^{(\\lambda)}$ pour indiquer la dépendance de variable aléatoire $S = \\sum_{i=1}^{N} X_i$ en le paramètre $\\lambda > 0$ (paramètre de la loi de Poisson sous-jacente). On s'intéresse à la sensibilité de la probabilité $p$ en fonction de lambda c'est à dire \n",
    "$$\n",
    "    \\frac{\\partial}{\\partial \\lambda} p(\\lambda) = \\frac{\\partial}{\\partial \\lambda} \\mathbf{P} \\bigl[ S^{\\lambda} > K \\bigl].\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "965ce11d-62ad-48be-9ebb-881ef2c6de88",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "## Méthode des différences finies\n",
    "Implémenter l'estimateur Monte Carlo basé sur les différences finies d'ordre 2\n",
    " \n",
    "$$\n",
    "    \\frac{\\partial}{\\partial \\lambda} p(\\lambda) = \\frac{p(\\lambda + h) - p(\\lambda- h)}{2h} + \\mathcal{O}(h^2)\n",
    "$$\n",
    "Comme vu en cours, il y a plusieurs façon d'implémenter l'estimateur Monte Carlo dans ce cadre biaisé. \n",
    "\n",
    "Le **premier estimateur** naïf $J^{(1)}_{n,h}(\\lambda)$ est basé sur des réalisations indépendantes de $S^{(\\lambda+h)}$ et $S^{(\\lambda-h)}$ et n'est pas efficace: la variance explose lorsque $h$ tend vers 0. Ainsi on pose\n",
    "\n",
    "$$\n",
    "    J^{(1)}_{n, h}(\\lambda) = \\frac{1}{2 h n} \\bigl( \\sum_{k = 1}^n \\mathbf{1}_{\\{S^{(\\lambda+h)}_k > K\\}} - \\sum_{k = 1}^n  \\mathbf{1}_{\\{\\tilde S^{(\\lambda-h)}_k > K\\}} \\bigr),\n",
    "$$\n",
    "où $(S^{(\\lambda+h)}_k)_{k \\ge 1}$ et $(\\tilde S^{(\\lambda-h)}_k)_{k \\ge 1}$ sont des suites indépendantes de variables aléatoires _i.i.d._.\n",
    "\n",
    "Le **deuxième estimateur** $J^{(2)}_{n,h}(\\lambda)$ utilise des réalisations fortements corrélées de la loi de Poisson au sens suivant: on utilise la même réalisation uniforme $U$ pour constuire deux réalisations $N^{(\\lambda+h)}$ et $N^{(\\lambda-h)}$ en utilisant la méthode de l'inverse de la fonction de répartition. Dans ce deuxième estimateur, les lois log-normales sont indépendantes. On a donc\n",
    "\n",
    "$$\n",
    "    J^{(2)}_{n, h}(\\lambda) = \\frac{1}{2 h n} \\sum_{k = 1}^n \\bigl(\\mathbf{1}_{\\{S^{(\\lambda+h)}_k > K\\}} - \\mathbf{1}_{\\{\\bar S^{(\\lambda-h)}_k > K\\}} \\bigr),\n",
    "$$\n",
    "où pour $k \\ge 1$, $S^{(\\lambda+h)}_k = \\sum_{i = 1}^{G(\\lambda+h, U_k)} X_{i,k}$ et $\\bar S^{(\\lambda-h)}_k = \\sum_{i = 1}^{G(\\lambda-h, U_k)} \\bar X_{i,k}$ avec $G(\\lambda, u)$ l'inverse généralisée de la loi de Poisson de paramètre $\\lambda$, $(U_k)_{k \\ge 1}$ suite _i.i.d._ uniforme sur $[0,1]$ indépendante de $(X_{i,k})_{i\\ge1, k\\ge 1}$ et $(\\bar X_{i,k})_{i\\ge1, k\\ge 1}$ deux suites (doublement indicées) _i.i.d._ de loi log-normale (de paramètres $\\mu$ et $\\sigma$ inchangés).\n",
    "\n",
    "Un **troisième estimateur** $J^{(3)}_{n,h}(\\lambda)$ utilise des réalisations fortements corrélées de la loi de Poisson et des variables aléatoires log-normales communes. \n",
    "\n",
    "$$\n",
    "    J^{(3)}_{n, h}(\\lambda) = \\frac{1}{2 h n} \\sum_{k = 1}^n \\bigl(\\mathbf{1}_{\\{S^{(\\lambda+h)}_k > K\\}} - \\mathbf{1}_{\\{S^{(\\lambda-h)}_k > K\\}} \\bigr),\n",
    "$$\n",
    "où pour $k \\ge 1$, $S^{(\\lambda+h)}_k = \\sum_{i = 1}^{G(\\lambda+h, U_k)} X_{i,k}$ et $S^{(\\lambda-h)}_k = \\sum_{i = 1}^{G(\\lambda-h, U_k)} X_{i,k}$ avec $G(\\lambda, u)$ l'inverse généralisée de la loi de Poisson de paramètre $\\lambda$, $(U_k)_{k \\ge 1}$ suite _i.i.d._ uniforme sur $[0,1]$ indépendante de $(X_{i,k})_{i\\ge1, k\\ge 1}$ une suite (doublement indicée) _i.i.d._ de loi log-normale."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6299f26f-2fdf-4f27-84bb-6b7186050017",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: plusieurs estimateurs des différences finies \n",
    "\n",
    "On fixe les paramètres $\\lambda = 10$, $\\mu = 0.1$, $\\sigma = 0.3$ et $K = 20$.\n",
    "Programmer ces 3 estimateurs pour différentes valeurs de $h$ (par exemple, $h=1$, 0.5, 0.1 et 0.01), et donner le résultat des estimateurs Monte Carlo avec $n = 50\\,000$.\n",
    "\n",
    "Que se passe-t-il lorsque $h$ tend vers 0? Comparez le comportement pour ces 3 estimateurs. Il est très important de bien interpréter ces tableaux de résultats et de conclure qu'il faut utiliser l'estimateur $J^{(3)}_{n, h}(\\lambda)$ et en aucun cas l'estimateur $J^{(1)}_{n,h}(\\lambda)$.\n",
    "\n",
    "_Remarque_: on considère ici uniquement l'étude de l'erreur statistique dûe à la méthode de Monte Carlo. On ne considère pas l'erreur de biais qui décroît lorsque $h$ tend vers 0 et qui est peut-être non négligeable pour $h = 1$. Les IC construits ici sont biaisés et on ne peut pas affirmer que la vraie valeur est dans l'IC à 95% (au moins pour les grandes valeurs de $h$). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fda0d814-6f9f-4f83-9a5e-5a69ec1ad09e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.14.2"
  },
  "toc-autonumbering": true
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
