{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "78cd42e9",
   "metadata": {},
   "source": [
    "# Copula Simulations for Credit Portfolios\n",
    "\n",
    "Companion notebook to [Module 9 — Copulas & Counterparty Risk](https://rodoslay.com/credit-models/09-copulas-and-counterparty-risk) at **rodoslay.com**.\n",
    "\n",
    "The experiment: a 200-name portfolio with **identical marginals** (PD = 2%, LGD = 45%) and\n",
    "**identical correlation** (ρ = 0.30), coupled by two different copulas — Gaussian and Student-t (ν = 4).\n",
    "Then we allocate the losses to securitization tranches and watch the senior tranche discover\n",
    "what tail dependence means. This is the 2008 mechanism, in about thirty lines of `numpy`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e15207f1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-14T02:01:18.641019Z",
     "iopub.status.busy": "2026-07-14T02:01:18.640776Z",
     "iopub.status.idle": "2026-07-14T02:01:19.885935Z",
     "shell.execute_reply": "2026-07-14T02:01:19.884290Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy import stats\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "rng = np.random.default_rng(9)\n",
    "plt.rcParams[\"figure.figsize\"] = (10, 5)\n",
    "plt.rcParams[\"axes.grid\"] = True\n",
    "plt.rcParams[\"grid.alpha\"] = 0.3\n",
    "\n",
    "N_NAMES, N_SIMS = 200, 200_000\n",
    "PD, LGD, RHO, NU = 0.02, 0.45, 0.30, 4"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e8a6284",
   "metadata": {},
   "source": [
    "## 1. One-factor simulation, two copulas\n",
    "\n",
    "Both copulas share the factor structure $X_i = \\sqrt{\\rho}\\,M + \\sqrt{1-\\rho}\\,\\varepsilon_i$\n",
    "(Module 8's machine). The t copula divides every name in a scenario by the **same**\n",
    "$\\sqrt{\\chi^2_\\nu/\\nu}$ draw — one shared \"chaos multiplier\" per year. That single shared divisor\n",
    "is what creates tail dependence: a small $\\chi^2$ draw fattens *everyone's* tail at once. Marginal\n",
    "thresholds are set so each name's PD is exactly 2% under either copula — the marginals are\n",
    "identical by construction; only the coupling differs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3a6dfe15",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-14T02:01:19.888642Z",
     "iopub.status.busy": "2026-07-14T02:01:19.888131Z",
     "iopub.status.idle": "2026-07-14T02:01:29.160015Z",
     "shell.execute_reply": "2026-07-14T02:01:29.159121Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean loss  — Gaussian: 0.8973%   t(4): 0.9050%   (theory: 0.9000%)\n"
     ]
    }
   ],
   "source": [
    "def simulate_losses(copula, n_sims=N_SIMS):\n",
    "    M = rng.standard_normal(n_sims)                      # the economy\n",
    "    eps = rng.standard_normal((n_sims, N_NAMES))         # idiosyncratic noise\n",
    "    X = np.sqrt(RHO) * M[:, None] + np.sqrt(1 - RHO) * eps\n",
    "    if copula == \"gauss\":\n",
    "        thresh = stats.norm.ppf(PD)\n",
    "    elif copula == \"t\":\n",
    "        W = rng.chisquare(NU, n_sims) / NU               # one shared divisor per scenario\n",
    "        X = X / np.sqrt(W)[:, None]\n",
    "        thresh = stats.t.ppf(PD, NU)                     # marginal is t(nu) by construction\n",
    "    defaults = X < thresh\n",
    "    return LGD * defaults.mean(axis=1)                   # portfolio loss rate per scenario\n",
    "\n",
    "loss_g = simulate_losses(\"gauss\")\n",
    "loss_t = simulate_losses(\"t\")\n",
    "print(f\"mean loss  — Gaussian: {loss_g.mean():.4%}   t({NU}): {loss_t.mean():.4%}   (theory: {PD*LGD:.4%})\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e49df337",
   "metadata": {},
   "source": [
    "Expected losses agree (same marginals — the copula cannot change the mean).\n",
    "Everything that differs from here on is *pure dependence structure*."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "26dd6a8e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-14T02:01:29.162421Z",
     "iopub.status.busy": "2026-07-14T02:01:29.162130Z",
     "iopub.status.idle": "2026-07-14T02:01:30.314199Z",
     "shell.execute_reply": "2026-07-14T02:01:30.312937Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAG4CAYAAACUzVSpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb7pJREFUeJzt3Xl4VOXZx/HfJCEJZCWQhbArggQhaEggQgUEjYAsioW2llXRysQKEdGobG5RUMHiIFor2MWKWEHrBogsilFCEFQQBEVQIWEzhC0LmfP+QTMvQyaQyWxZvp/rytXOOWeec587o7m95znPMRmGYQgAAAAAAADwIj9fBwAAAAAAAID6h6YUAAAAAAAAvI6mFAAAAAAAALyOphQAAAAAAAC8jqYUAAAAAAAAvI6mFAAAAAAAALyOphQAAAAAAAC8jqYUAAAAAAAAvI6mFAAAAAAAALyOphSAGmHs2LFq06aN3TaTyaSZM2d6/Nxr166VyWTS2rVrbdv69OmjK664wuPnlqQff/xRJpNJixcv9sr5AACAeziqX+qi2lKreCPOxYsXy2QyadOmTR4Z98cff6wxMQHeQFMKqCP4Y3TWa6+9pnnz5vk6DIdqcmwAALjb119/rVtuuUWtW7dWcHCwmjdvruuuu07z58/3dWhAvbVgwYIa31xE/RLg6wAAoDKnT59WQIBz/5p67bXX9M0332jSpElVfs8111yj06dPKzAw0MkInVNZbK1bt9bp06fVoEEDj54fAABv+eyzz9S3b1+1atVKEyZMUFxcnH766Sd9/vnneu6553T33Xf7OkSgRhk1apR+97vfKSgoyKPnWbBggZo2baqxY8d69DxAVdGUAlBjBQcHe3T8oqIiBQYGys/Pz+PnuhCTyeTT8wMA4G6PP/64IiIilJOTo8jISLt9Bw8e9E1QQA108uRJhYSEyN/fX/7+/r4OB/A6bt8D6pkvv/xSAwYMUHh4uEJDQ9WvXz99/vnndseUlpZq1qxZuuyyyxQcHKwmTZqoV69eWrVqle2YvLw8jRs3Ti1atFBQUJCaNWumoUOHVuk++OXLl+uKK65QcHCwrrjiCi1btszhceevKXX8+HFNmjRJbdq0UVBQkGJiYnTddddp8+bNks6uA/Xee+9p7969MplMMplMtnUeyteNev311/Xwww+refPmatSokQoLCx2uKVUuNzdXV199tRo2bKi2bdtq4cKFdvsru////DEvFFtl6x98/PHH+s1vfqOQkBBFRkZq6NCh+vbbb+2OmTlzpkwmk3bv3q2xY8cqMjJSERERGjdunE6dOmV37KpVq9SrVy9FRkYqNDRUHTp00IMPPugw9wAAuOL7779Xp06dKjSkJCkmJsbu9aJFi3TttdcqJiZGQUFBSkhI0AsvvFDhfW3atNGNN96otWvXqlu3bmrYsKE6d+5s+1v71ltvqXPnzgoODlZSUpK+/PLLCmPs2LFDt9xyi6KiohQcHKxu3brpnXfeccs1lzt58qTuvfdetWzZUkFBQerQoYOefvppGYZhd9zp06f15z//WU2bNlVYWJiGDBmiX375pcpras6fP1+dOnVSo0aN1LhxY3Xr1k2vvfaa3TG//PKLbrvtNsXHxysoKEht27bVXXfdpZKSEknS0aNHNWXKFHXu3FmhoaEKDw/XgAEDtHXr1ipdqzfy6Q5VqamkqtXJjvz6669KSUlRixYttHPnzkqPK68b161bp4kTJyomJkYtWrSw23duTWm1WjVz5kzFx8erUaNG6tu3r7Zv3642bdo4nOlUXFysjIwMRUdHKyQkRDfddJMOHTpk29+mTRtt27ZN69ats9Wjffr0uej1AZ7ETCmgHtm2bZt+85vfKDw8XFOnTlWDBg304osvqk+fPlq3bp26d+8u6WyjIysrS7fffrtSUlJUWFioTZs2afPmzbruuuskScOHD9e2bdt09913q02bNjp48KBWrVqlffv2XXDBz5UrV2r48OFKSEhQVlaWjhw5YmtuXcyf/vQnvfnmm0pPT1dCQoKOHDmiTz/9VN9++62uuuoqPfTQQzp27Jh+/vlnzZ07V5IUGhpqN8ajjz6qwMBATZkyRcXFxRe8Ze/XX3/VwIEDNWLECP3+97/XG2+8obvuukuBgYEaP378ReM9V1ViO9dHH32kAQMG6JJLLtHMmTN1+vRpzZ8/Xz179tTmzZsr5HjEiBFq27atsrKytHnzZr388suKiYnRU089Jens7/7GG29Uly5d9MgjjygoKEi7d+/Whg0bnLoOAACqonXr1srOztY333xz0QeHvPDCC+rUqZOGDBmigIAA/fe//9XEiRNltVplNpvtjt29e7f+8Ic/6M4779Qf//hHPf300xo8eLAWLlyoBx98UBMnTpQkZWVl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Qa1bt07NmzevckxS1erR8tjP/0xERUXZ6rzzXaweBGoimlIAKrjmmmv0/fff65VXXtEVV1yhl19+WVdddZVefvll2zGTJk3Sd999p6ysLAUHB2vatGnq2LGjw0VF3WXEiBH64YcfNH/+fMXHx2vOnDnq1KmT7VvHqqjqLKmqOvfbqHM5UzC5Q2Xfthn/W1S1YcOGWr9+vT766CONGjVKX331lUaOHKnrrrvO67ECAOqXwMBAJScn64knntALL7yg0tJSLV26VNLZBdH79eunw4cP69lnn9V7772nVatWafLkyZJU4cuTyv7eXezvYPk4U6ZM0apVqxz+VLUhVBN07NhRO3fu1Ouvv65evXrpP//5j3r16mVrCFXVE088oYyMDF1zzTX65z//qRUrVmjVqlXq1KnTBb+4cjWfycnJatasWbV+zm8O+crNN9+sgoICPffcc06/1931aLmL/XMA1EQsdA7UE9HR0WrUqJHDJ4Ls2LFDfn5+dt8yRkVFady4cRo3bpxOnDiha665RjNnztTtt99uO+bSSy/Vvffeq3vvvVe7du1S165d9cwzz+if//ynwxjKpzU7ui3wQk8qOVezZs00ceJETZw4UQcPHtRVV12lxx9/XAMGDJBUeZOoOvbv3297TG+57777TpJsi2KWfwNVUFBg915H06SrGlt5nir7XTVt2rTCDK6q8PPzU79+/dSvXz89++yzeuKJJ/TQQw9pzZo16t+/v9PjAQDgrPJbyQ4cOCBJ+u9//6vi4mK98847drM81qxZ49bzlt+S1aBBA4/+zWvdurU++ugjHT9+3G621I4dO2z7y//XarVqz549djPId+/eXeVzhYSEaOTIkRo5cqRKSkp088036/HHH1dmZqaio6MVHh6ub7755oJjvPnmm+rbt6/+9re/2W0vKChQ06ZNK32fq/n817/+pdOnTzv9PkmKi4ur8rFVramCg4OdqpOls7fRtWvXTtOnT1dERIQeeOABJ6+karHv3r3bbmbVkSNHXJr55M5aGXAHZkoB9YS/v7+uv/56vf3223a3nuXn5+u1115Tr169FB4eLunsH7tzhYaGql27diouLpYknTp1qsJTPy699FKFhYXZjnGkWbNm6tq1q1599VW7KeGrVq2ym8bvSFlZWYVp5DExMYqPj7c7Z0hIyAWnmzvjzJkzevHFF22vS0pK9OKLLyo6OlpJSUmSZHvCyvr16+1ifemllyqMV9XYzs3Tuc2ub775RitXrtTAgQOdvpajR49W2Na1a1dJuuDvDACA6lizZo3D2Rnla/iU3yZVPrPj3GOPHTumRYsWuTWemJgY9enTRy+++KKtIXauQ4cOueU8AwcOVFlZmZ5//nm77XPnzpXJZLJ9iZaWliZJWrBggd1x8+fPr9J5zq/VAgMDlZCQIMMwVFpaKj8/Pw0bNkz//e9/tWnTpgrvL8+3v79/hd/T0qVLL7oelKv57Nmzp/r371+tn+Dg4AuOfa6q1lTO1MnnmjZtmqZMmaLMzEy98MILVY6rKvr166eAgIAK457/2XJWSEhIhS9TAV9iphRQx7zyyiu2xTPPdc899+ixxx7TqlWr1KtXL02cOFEBAQF68cUXVVxcrNmzZ9uOTUhIUJ8+fZSUlKSoqCht2rRJb775ptLT0yWdnS3Ur18/jRgxQgkJCQoICNCyZcuUn5+v3/3udxeMLysrS4MGDVKvXr00fvx4HT16VPPnz1enTp104sSJSt93/PhxtWjRQrfccosSExMVGhqqjz76SDk5OXrmmWdsxyUlJWnJkiXKyMhQcnKyQkNDNXjwYGfTKOnsmlJPPfWUfvzxR7Vv315LlizRli1b9NJLL6lBgwaSpE6dOqlHjx7KzMzU0aNHFRUVpddff11nzpypMJ4zsc2ZM0cDBgxQamqqbrvtNtvjiyMiIjRz5kynr+WRRx7R+vXrNWjQILVu3VoHDx7UggUL1KJFC/Xq1cvp8QAAuJC7775bp06d0k033aTLL79cJSUl+uyzz7RkyRK1adNG48aNkyRdf/31CgwM1ODBg3XnnXfqxIkT+utf/6qYmBiHzQ5XWCwW9erVS507d9aECRN0ySWXKD8/X9nZ2fr555+1detW27HlM6KdXUNy8ODB6tu3rx566CH9+OOPSkxM1MqVK/X2229r0qRJti+zkpKSNHz4cM2bN09HjhxRjx49tG7dOtuM7IvNZrn++usVFxennj17KjY2Vt9++62ef/55DRo0yDZD64knntDKlSvVu3dv3XHHHerYsaMOHDigpUuX6tNPP1VkZKRuvPFGPfLIIxo3bpyuvvpqff311/rXv/5lt9i3O/LpS1WtqapaJzsa/9ixYzKbzQoLC9Mf//hHt8QdGxure+65R88884yGDBmiG264QVu3btUHH3ygpk2bVnvGU1JSkl544QU99thjateunWJiYnTttde6JWagWnz01D8Ablb+KNjKfn766SfDMAxj8+bNRlpamhEaGmo0atTI6Nu3r92jlQ3DMB577DEjJSXFiIyMNBo2bGhcfvnlxuOPP257jPPhw4cNs9lsXH755UZISIgRERFhdO/e3XjjjTeqFOt//vMfo2PHjkZQUJCRkJBgvPXWWxUeqWwYht0jkYuLi4377rvPSExMNMLCwoyQkBAjMTHRWLBggd17Tpw4YfzhD38wIiMjDUm2MdesWWNIMpYuXVohnvJ95z42unfv3kanTp2MTZs2GampqUZwcLDRunVr4/nnn6/w/u+//97o37+/ERQUZMTGxhoPPvigsWrVqgpjVhabo8cXG4ZhfPTRR0bPnj2Nhg0bGuHh4cbgwYON7du32x0zY8YMQ5Jx6NAhu+3nP1Z49erVxtChQ434+HgjMDDQiI+PN37/+98b3333XYXrAQDAVR988IExfvx44/LLLzdCQ0ONwMBAo127dsbdd99t5Ofn2x37zjvvGF26dDGCg4ONNm3aGE899ZTxyiuv2P0dMwzDaN26tTFo0KAK55JkmM1mu23lf1vnzJljt/377783Ro8ebcTFxRkNGjQwmjdvbtx4443Gm2++aXdc06ZNjR49elz0Oh3VL8ePHzcmT55sxMfHGw0aNDAuu+wyY86cOYbVarU77uTJk4bZbDaioqKM0NBQY9iwYcbOnTsNScaTTz55wfO++OKLxjXXXGM0adLECAoKMi699FLjvvvuM44dO2Z33N69e43Ro0cb0dHRRlBQkHHJJZcYZrPZKC4uNgzDMIqKiox7773XaNasmdGwYUOjZ8+eRnZ2ttG7d2+jd+/eFfJ5fq1S1Xx6iys1lWFUrU4ur7FycnJs28rKyozf//73RkBAgLF8+fJK43P03vP3nfuZP3PmjDFt2jQjLi7OaNiwoXHttdca3377rdGkSRPjT3/600XHdVTj5uXlGYMGDTLCwsIMSXa/Z8AXTIbBqmcAAAAAIEnbt29Xp06d9O6772rQoEFePfeWLVt05ZVX6p///KduvfVWr54btUNBQYEaN26sxx57TA899JCvwwFcxppSAAAAAPA/a9asUWpqqscbUo4W+p43b578/Px0zTXXePTcqB0q+4xIUp8+fbwbDOAh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CgoKtHz58gset3btWvXt21e//vqrIiMjL3js1q1b9f777+uFF15wX6AuevLJJ/Xggw/qnnvu0bx58yRJgYGBmjJliu6//36tXr3atwECAOAh3qylJOqpC6Gecg1NKQAAzjF8+HCVlJTo1Vdf1SWXXKL8/HytXr1aR44c8XVoPjV//nz99re/VWhoqK9DkSRt2rRJL730krp06VJh36233qp7771X27ZtU6dOnXwQHQAA9Rv1lGPUUxVx+x4AAP9TUFCgTz75RE899ZT69u2r1q1bKyUlRZmZmRoyZIgkqU2bNpKkm266SSaTyfZ67NixFb7pmzRpkvr06WN7ffLkSY0bN05hYWFq1qyZnnnmmQoxFBcXa8qUKWrevLlCQkLUvXt3rV271rZ/8eLFioyM1IoVK9SxY0eFhobqhhtu0IEDByRJM2fO1Kuvvqq3335bJpNJJpPJ7v3lfvzxR/Xt21eS1LhxY5lMJo0dO9ZhXsrKyvTmm29q8ODBdtvbtGmjJ554QuPHj1dYWJhatWqll156ybZ/7dq1MplMKigosG3bsmWLTCaTfvzxR4fnqooTJ05o9OjReumll9S4ceMK+xs3bqyePXvq9ddfr/Y5AABA9VBPjXWYF+opx2hKAQDwP6GhoQoNDdXy5ctVXFzs8JjyJ5YtWrRIBw4ccOoJZvfdd58++eQTLV++XCtXrtTatWu1efNmu2PS09OVnZ2t119/XV999ZV++9vf6oYbbtCuXbtsx5w6dUpPP/20/vGPf2j9+vXat2+fpkyZIkmaMmWKRowYYSusDhw4oKuvvrpCLC1bttR//vMfSdLOnTt14MABPffccw7j/uqrr3Ts2DF169atwr5nnnlG3bp105dffqmJEyfqrrvu0s6dO6uck3379tnyXtnP+esupKena+DAgerfv3+l46akpOiTTz6pchwAAMA9qKeop5zB7XsAAPxPQECAFi9erAkTJmjhwoW66qqr1Lt3b/3ud7+zTWuOjo6WJEVGRiouLq7KY584cUKvvPKKFi9erH79+slkMunVV19VixYtbMfs27dPixYt0r59+xQfHy/pbFH04YcfatGiRbZiorS0VAsXLtSll14q6WxR8cgjj0g6Wwg2bNhQxcXFF4zP399fUVFRkqSYmJgLroGwd+9e+fv7KyYmpsK+gQMHauLEiZKk+++/X3PnztWaNWvUoUOHKuUlPj5eW7ZsueAx5XFK0uuvv67Nmzfrs88+u+i4e/furVIMAADAfainHKOecoymFAAA5xg+fLgGDRqkTz75RJ9//rk++OADzZ49Wy+//HKl07Gr4vvvv1dJSYlSUlJs26KiouyKja+//lplZWVq37693XuLi4vVpEkT2+tGjRrZCihJatasmQ4ePHjB8w8YMMD2TVfr1q21bdu2Ksd++vRpBQUFyWQyVdh37hoEJpNJcXFxF43lXAEBAWrXrl2Vjv3pp590zz33aOXKlQoODr7gsQ0bNtSpU6eqHAc846vvvlXR0V8kGRX2ObtoLgCg9qCeqoh6yjGaUgAAnCc4OFjXXXedrrvuOk2bNk233367ZsyYccEiys/PT4Zh/x/epaWlTp33xIkT8vf3V25urvz9/e32nbsgZoMGDez2mUymCuc+38svv6zTp087fP/FNG3aVKdOnVJJSYkCAwPt9jmKxWq1SjqbE0l2sZ2fk3379ikhIeGC53/wwQf14IMPKjc3VwcPHlRSUpJtX1lZmdavX6/nn39excXFtrwdPXrU9i0sAADwPuope9RTjrnUlHryySeVmZlp9+jAoqIi3XvvvXr99ddVXFystLQ0LViwQLGxsbb37du3T3fddZfWrFmj0NBQjRkzRllZWQoIoEcGAKh5EhIS7B4H3KBBA5WVldkdEx0drW+++cZu25YtW2xFxqWXXqoGDRpo48aNuuSSSyRJv/76q7777jv17t1bknTllVeqrKxMBw8e1G9+85tqxxsYGFghvubNmzs8TlKFY8/XtWtXSdL27dtt/78qyouYAwcO2BbQPH9quTPTzfv166evv/5ahmHozJkzCggI0Pjx43X55Zfr/vvvtys8v/nmG1155ZVVjhUAAHgW9VRXSdRT56t2FygnJ0cvvvhihUcHTp48We+9956WLl2qiIgIpaen6+abb9aGDRsknf1FDRo0SHFxcfrss8904MABjR49Wg0aNKiw8BYAAN505MgR/fa3v9X48ePVpUsXhYWFadOmTZo9e7aGDh1qO65NmzZavXq1evbsqaCgIDVu3FjXXnut5syZo7///e9KTU3VP//5T7s/5KGhoRo/frwyMzMVExOj2NhYPfTQQ7ZvvySpffv2uvXWWzV69Gg988wzuvLKK3Xo0CGtXr1aXbp00aBBg6p0HW3atNGK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XnhBQ4YMUUhIiB5//HGVlZXptttuU9u2bdWwYUN16NBBzz33nO09M2fOdJhTSfrpp580YsQIRUZGKioqSkOHDtWPP/7o1PUDAIDqoZ76f9RTAKqDphRQj7366qsKCAjQxo0b9dxzz+nZZ5/Vyy+/bNs/duxYbdq0Se+8846ys7NlGIYGDhyo0tJS2zGnTp3SU089pZdfflnbtm3TX/7yF40YMUI33HCDDhw4oAMHDujqq6/WgQMH1KlTJ9177706cOCApkyZopMnTyotLU2NGzdWTk6Oli5dqo8++kjp6elVvoaqxHghF4vhzJkzGjZsmHr37q2vvvpK2dnZuuOOO2zfYN56661q0aKFcnJylJubqwceeOCi39TNnDlTN910k77++muNHz9eVqtVLVq00NKlS7V9+3ZNnz5dDz74oN544w1J0pQpUxzmtLS0VGlpaQoLC9Mnn3yiDRs2KDQ0VDfccINKSkqqnEMAAFB91FPUUwBcYACol3r37m107NjRsFqttm3333+/0bFjR8MwDOO7774zJBkbNmyw7T98+LDRsGFD44033jAMwzAWLVpkSDK2bNliN/aYMWOMoUOHVjhnYmKiMWPGDNvrl156yWjcuLFx4sQJ27b33nvP8PPzM/Ly8hyO1bt3b+Oee+6pcoyOSDKWLVtWpRiOHDliSDLWrl3rcKywsDBj8eLFlZ7L0bknTZp00ePMZrMxfPhw22tHOf3HP/5hdOjQwe53WFxcbDRs2NBYsWJFlWMCAADVQz21rEoxUE8BqAwzpYB6rEePHnZrFqSmpmrXrl0qKyvTt99+q4CAAHXv3t22v0mTJurQoYO+/fZb27bAwEB16dKlWuf/9ttvlZiYqJCQENu2nj17ymq1aufOnVV6f1VidCWGqKgojR07VmlpaRo8eLCee+45HThwwHZsRkaGbr/9dvXv319PPvmkvv/++4ues1u3bhW2WSwWJSUlKTo6WqGhoXrppZe0b9++C46zdetW7d69W2FhYQoNDVVoaKiioqJUVFRUpTgAAIDrqKeopwBUH00pAC5p2LDhBRfjrAsWLVqk7OxsXX311VqyZInat2+vzz//XNLZqePbtm3ToEGD9PHHHyshIUHLli274HjnFmyS9Prrr2vKlCm67bbbtHLlSm3ZskXjxo276JTxEydOKCkpSVu2bLH7+e677/SHP/zBtYsGAABeQz1FPQXUVzSlgHrsiy++sHv9+eef67LLLpO/v786duyoM2fO2B1z5MgR7dy5UwkJCRccNzAwUGVlZRc9f8eOHbV161adPHnStm3Dhg3y8/NThw4dqvT+6sbobAxXXnmlMjMz9dlnn+mKK67Qa6+9ZtvXvn17TZ48WStXrtTNN9+sRYsWVenc557v6quv1sSJE3XllVeqXbt2Fb6Zc5TTq666Srt27VJMTIzatWtn9xMREeFUDAAAoHqop6inAFQfTSmgHtu3b58yMjK0c+dO/fvf/9b8+fN1zz33SJIuu+wyDR06VBMmTNCnn36qrVu36o9//KOaN2+uoUOHXnDcNm3a6KuvvtLOnTt1+PDhShfJvPXWWxUcHKwxY8bom2++0Zo1a3T33Xdr1KhRio2NvWj8rsRY1Rj27NmjzMxMZWdna+/evVq5cqV27dqljh076vTp00pPT9fatWu1d+9ebdiwQTk5OerYsWOVzn3udWzatEkrVqzQd999p2nTpiknJ8fuGEc5vfXWW9W0aVMNHTpUn3zyifbs2aO1a9fqz3/+s37++WenYgAAANVDPUU9BaD6aEoB9djo0aN1+vRppaSkyGw265577tEdd9xh279o0SIlJSXpxhtvVGpqqgzD0Pvvv3/Rp6FMmDBBHTp0ULdu3RQdHa0NGzY4PK5Ro0ZasWKFjh49quTkZN1yyy3q16+fnn/++SpfQ3VjrGoMjRo10o4dOzR8+HC1b99ed9xxh8xms+688075+/vryJEjGj16tNq3b68RI0ZowIABmjVrVpXjl6Q777xTN998s0aOHKnu3bvryJEjmjhxot0xjnLaqFEjrV+/Xq1atdLNN9+sjh076rbbblNRUZHCw8OdigEAAFQP9RT1FIDqMxmGYfg6CADe16dPH3Xt2lXz5s3zdSgAAAC1EvUUALiGmVIAAAAAAADwOppSAAAAAAAA8Dpu3wMAAAAAAIDXMVMKAAAAAAAAXkdTCgAAAAAAAF5HUwoAAAAAAABeR1MKAAAAAAAAXkdTCgAAAAAAAF5HUwoAAAAAAABeR1MKAAAAAAAAXkdTCgAAAAAAAF5HUwoAAAAAAABe93/2MHCB9OYO1gAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1200x450 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4.5))\n",
    "bins = np.linspace(0, 0.12, 80)\n",
    "ax1.hist(loss_g, bins=bins, alpha=0.6, label=\"Gaussian\", density=True, color=\"#1f4d3a\")\n",
    "ax1.hist(loss_t, bins=bins, alpha=0.5, label=f\"Student-t (nu={NU})\", density=True, color=\"#b3541e\")\n",
    "ax1.set_xlabel(\"portfolio loss rate\"); ax1.set_title(\"Loss distributions\"); ax1.legend()\n",
    "\n",
    "# tail zoom on log scale\n",
    "ax2.hist(loss_g, bins=bins, alpha=0.6, label=\"Gaussian\", density=True, color=\"#1f4d3a\")\n",
    "ax2.hist(loss_t, bins=bins, alpha=0.5, label=f\"Student-t (nu={NU})\", density=True, color=\"#b3541e\")\n",
    "ax2.set_yscale(\"log\"); ax2.set_xlabel(\"portfolio loss rate\"); ax2.set_title(\"Same, log scale — look right\")\n",
    "ax2.legend()\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "57dbb085",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-14T02:01:30.317027Z",
     "iopub.status.busy": "2026-07-14T02:01:30.316732Z",
     "iopub.status.idle": "2026-07-14T02:01:30.523429Z",
     "shell.execute_reply": "2026-07-14T02:01:30.522259Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>copula</th>\n",
       "      <th>EL</th>\n",
       "      <th>VaR 99%</th>\n",
       "      <th>VaR 99.9%</th>\n",
       "      <th>ES 99%</th>\n",
       "      <th>VaR99.9 multiple of EL</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Gaussian</td>\n",
       "      <td>0.897%</td>\n",
       "      <td>8.100%</td>\n",
       "      <td>15.300%</td>\n",
       "      <td>11.061%</td>\n",
       "      <td>17.1x</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>t(4)</td>\n",
       "      <td>0.905%</td>\n",
       "      <td>14.625%</td>\n",
       "      <td>28.350%</td>\n",
       "      <td>20.464%</td>\n",
       "      <td>31.3x</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     copula      EL  VaR 99% VaR 99.9%   ES 99% VaR99.9 multiple of EL\n",
       "0  Gaussian  0.897%   8.100%   15.300%  11.061%                  17.1x\n",
       "1      t(4)  0.905%  14.625%   28.350%  20.464%                  31.3x"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def risk_stats(losses, label):\n",
    "    var99 = np.quantile(losses, 0.99)\n",
    "    var999 = np.quantile(losses, 0.999)\n",
    "    es99 = losses[losses >= var99].mean()\n",
    "    return [label, f\"{losses.mean():.3%}\", f\"{var99:.3%}\", f\"{var999:.3%}\", f\"{es99:.3%}\"]\n",
    "\n",
    "import pandas as pd\n",
    "table = pd.DataFrame([risk_stats(loss_g, \"Gaussian\"), risk_stats(loss_t, f\"t({NU})\")],\n",
    "                     columns=[\"copula\", \"EL\", \"VaR 99%\", \"VaR 99.9%\", \"ES 99%\"])\n",
    "table[\"VaR99.9 multiple of EL\"] = [f\"{np.quantile(l, 0.999)/l.mean():.1f}x\" for l in (loss_g, loss_t)]\n",
    "table"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72ae18d0",
   "metadata": {},
   "source": [
    "## 2. The tranche experiment — where the copula choice becomes money\n",
    "\n",
    "A toy securitization of the same portfolio: **equity** takes the first 5% of losses,\n",
    "**mezzanine** the next 10% (5–15%), **senior** everything above 15%. The senior tranche\n",
    "is a pure bet that *many names never default together* — i.e., a bet on the copula."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "703dfb00",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-14T02:01:30.526647Z",
     "iopub.status.busy": "2026-07-14T02:01:30.526377Z",
     "iopub.status.idle": "2026-07-14T02:01:30.544709Z",
     "shell.execute_reply": "2026-07-14T02:01:30.543823Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tranche</th>\n",
       "      <th>expected loss (Gaussian)</th>\n",
       "      <th>expected loss (t, nu=4)</th>\n",
       "      <th>t / Gaussian</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Equity 0-5%</td>\n",
       "      <td>16.1804%</td>\n",
       "      <td>12.0902%</td>\n",
       "      <td>0.7x</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Mezzanine 5-15%</td>\n",
       "      <td>0.8453%</td>\n",
       "      <td>2.4341%</td>\n",
       "      <td>2.9x</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Senior 15-100%</td>\n",
       "      <td>0.0044%</td>\n",
       "      <td>0.0672%</td>\n",
       "      <td>15.4x</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           tranche expected loss (Gaussian) expected loss (t, nu=4)  \\\n",
       "0      Equity 0-5%                 16.1804%                12.0902%   \n",
       "1  Mezzanine 5-15%                  0.8453%                 2.4341%   \n",
       "2   Senior 15-100%                  0.0044%                 0.0672%   \n",
       "\n",
       "  t / Gaussian  \n",
       "0         0.7x  \n",
       "1         2.9x  \n",
       "2        15.4x  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def tranche_losses(port_loss, attach, detach):\n",
    "    \"\"\"Loss rate on a tranche with given attachment/detachment points.\"\"\"\n",
    "    return np.clip(port_loss - attach, 0, detach - attach) / (detach - attach)\n",
    "\n",
    "tranches = [(\"Equity 0-5%\", 0.00, 0.05), (\"Mezzanine 5-15%\", 0.05, 0.15), (\"Senior 15-100%\", 0.15, 1.00)]\n",
    "rows = []\n",
    "for name, a, d in tranches:\n",
    "    eg = tranche_losses(loss_g, a, d).mean()\n",
    "    et = tranche_losses(loss_t, a, d).mean()\n",
    "    rows.append([name, f\"{eg:.4%}\", f\"{et:.4%}\", f\"{et/max(eg,1e-12):.1f}x\"])\n",
    "pd.DataFrame(rows, columns=[\"tranche\", \"expected loss (Gaussian)\", f\"expected loss (t, nu={NU})\", \"t / Gaussian\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "125f34a9",
   "metadata": {},
   "source": [
    "Read the last column. The equity tranche barely notices the copula — it absorbs the *first*\n",
    "losses, which happen under any dependence structure. The **senior tranche's expected loss moves by\n",
    "an order of magnitude**, because it only loses in joint-tail scenarios — exactly the scenarios the\n",
    "Gaussian copula prices as vanishing. Rate a senior tranche AAA under a Gaussian view of the world,\n",
    "live in a t-copula world, and you have recreated 2008 in a `numpy` array.\n",
    "\n",
    "## Exercises\n",
    "\n",
    "1. **Clayton lower-tail.** Implement the Clayton copula via the gamma-frailty construction\n",
    "   (draw $W \\sim \\text{Gamma}(1/\\theta)$, set $U_i = (1 + E_i/W)^{-1/\\theta}$ with $E_i$ standard\n",
    "   exponential). Repeat the tranche table. Clayton's dependence is *only* in the loss corner —\n",
    "   does the senior tranche fare better or worse than under the symmetric t?\n",
    "2. **Correlated LGD.** Make LGD rise with the factor: $\\text{LGD} = 0.45 + 0.15\\,\\Phi(-M)$.\n",
    "   How much does 99.9% VaR move? (This is the \"second correlation people forget\" from the module.)\n",
    "3. **Sensitivity to ν.** Sweep ν from 3 to 30 and plot senior-tranche EL against it. Where does\n",
    "   the t copula effectively become Gaussian?\n",
    "4. **Base correlation.** Find the *Gaussian* ρ that reproduces the t-copula's senior-tranche EL.\n",
    "   Notice it differs from the ρ that matches the mezzanine — you have discovered why traders\n",
    "   quote \"correlation skew,\" and why a single-ρ Gaussian model cannot fit all tranches at once."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.11.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
