# Modèle simulé — assurance chômage

Documentation détaillée du modèle de micro-simulation accompagnant le
**Focus n°133** du CAE — [« Modéliser l'impact financier des réformes
de l'assurance chômage »](https://cae-eco.fr/modeliser-limpact-financier-des-reformes-de-lassurance-chomage)
(avril 2026).

> Pour une vue d'ensemble du dépôt et la comparaison avec le modèle
> comptable, voir le [README global](../README.md).

---

## Table des matières

1. [Vue d'ensemble](#1)
2. [Architecture du code](#2)
3. [Structure du modèle (rappel conceptuel)](#3)
4. [Paramètres et statistiques cibles](#4)
5. [Comment utiliser le modèle](#5)
6. [Sorties produites](#6)
7. [Détails techniques](#7)
8. [Liens conceptuels avec le modèle comptable](#8)
9. [Limites du modèle](#9)
10. [Glossaire](#10)

---
<a id="1"></a>
## 1. Vue d'ensemble

Le modèle est simulé au niveau **individuel et mensuel**. À chaque
période, un agent transite entre trois états sur le marché du travail
— *employé*, *chômeur indemnisé*, *chômeur non indemnisé* — selon des
probabilités qui dépendent de son historique d'emploi et des règles de
l'assurance chômage (régime général 2025 par défaut).

Le modèle est calibré en deux temps :
- les **paramètres du régime** (montant d'allocation, durée des droits,
  conditions d'éligibilité, etc.) sont fixés à partir des règles de 
  l'assurance chômage et des valeurs empiriques observées 
  pour les ouvertures de droits dans MiDAS;
- les **paramètres structurels** (taux de retour à l'emploi, taux de
  destruction d'emploi, taux de recours) sont estimés par une méthode
  des moments simulés en minimisant la distance entre des statistiques
  simulées et leurs contreparties observées (ces statistiques observées 
  étant principalement issues des statistiques agrégées de l'Unédic pour 2024).

Une fois calibré, le modèle peut être utilisé pour simuler les effets
budgétaires d'une réforme et visualiser la montée en charge de cette
réforme sur les années qui suivent son entrée en vigueur.

> **Ce code constitue une base minimaliste destinée à être enrichie.**
> Il sert d'illustration de la démarche présentée dans le Focus n°133
> et peut être étendu pour intégrer davantage d'hétérogénéité
> individuelle, d'autres règles d'indemnisation ou d'autres réformes.

<a id="2"></a>
## 2. Architecture du code


### 2.1. Schéma de dépendance entre fichiers

```
parametres_regime_reference.py
        │ (paramètres et statistiques cibles)
        ▼
calibration_modele_simule.py         ← classes Individual + Simulation
        │           ▲                  + fonction objectif (calibration)
        │           │ (paramètres
        │           │  calibrés)
        ▼           │
simulations_reformes.ipynb           ← notebook d'orchestration
        │
        ├─► montant_baisse_uniforme.py        →  f_niveau_uniforme(...)
        ├─► montant_baisse_ciblee.py          →  f_niveau_ciblee(...)
        ├─► montant_baisse_plafond.py         →  f_niveau_plafond(...)
        ├─► duree_baisse_uniforme.py          →  f_PBD_coef(...)
        ├─► duree_baisse_plafond.py           →  f_PBD_plafond(...)
        ├─► eligibilite_duree_affiliation.py  →  f_DA(...)
        ├─► eligibilite_periode_reference.py  →  f_PRA_elig(...)
        ├─► eligibilite_jointe.py             →  f_jointe_just_elig(...)
        ├─► seniors_duree.py                  →  f_PBD_plafond_senior(...)
        └─► seniors_eligibilite.py            →  f_PRA_elig_senior(...)
```

### 2.2. Philosophie du code 

Le code privilégie volontairement la **lisibilité réforme par réforme**
plutôt que la concision. En particulier :

- la classe `Individual` est **redéfinie dans chaque fichier de
  réforme**, plutôt que d'être factorisée dans un module commun. Cela
  permet de garder dans un seul fichier l'ensemble de la logique propre
  à une réforme (règles d'indemnisation, paramètres calibrés sur la
  population affectée, élasticités spécifiques);
- les **paramètres calibrés sur la population affectée** (salaire moyen
  et donc cotisations, niveau d'allocation, etc.) sont également définis
  en tête de chaque fichier de réforme, car ils varient d'une réforme à
  l'autre. Leur calibration est issue de MiDAS pour le public affecté par la réforme considérée:
  ils sont donc liés à l'ampleur du choc et il est souhaitable de les modifier uniquement de manière coordonnée ;
- les noms de variables, indentations et commentaires sont conservés
  identiques d'un fichier à l'autre pour faciliter la comparaison
  ligne à ligne.

Ce choix entraîne une **duplication de code substantielle** entre les
fichiers de réforme (chacun fait environ 600-700 lignes, dont une
majorité est commune). C'est un parti pris pour faciliter la
prise en main, une factorisation pourrait
être envisagée dans une réutilisation.

<a id="3"></a>
## 3. Structure du modèle (rappel conceptuel)

### 3.1. Caractéristiques d'un individu

Chaque agent est caractérisé à chaque période par :

- son **statut** : `employed`, `ui_unemployed` (chômage indemnisé)
  ou `noui_unemployed` (chômage non indemnisé) ;
- son **historique d'emploi** : vecteur binaire des 72 derniers mois
  (1 = travaillé, 0 = non travaillé) ;
- sa **durée de droits restants** et le **délai avant déchéance** de
  ces droits.

### 3.2. Transitions entre états

À chaque mois, l'individu transite entre les trois états selon des
probabilités définies. Schématiquement :

- **Depuis l'emploi** : il perd son emploi avec une probabilité δ
  (décroissante avec l'ancienneté). En cas de perte d'emploi, son
  éligibilité est évaluée selon les règles de la convention 2025.
  S'il est éligible, il entre au chômage indemnisé avec une probabilité η
  (taux de recours), au chômage non indemnisé avec une probabilité 1 − η.
- **Depuis le chômage indemnisé** : il consomme un mois de droits, il retrouve un emploi avec une
  probabilité h. À l'épuisement des droits, il peut soit recharger (s'il a suffisamment retravaillé),
  soit basculer au chômage non indemnisé.
- **Depuis le chômage non indemnisé** : il retrouve un emploi avec une
  probabilité h (supposée égale à celle des chômeurs indemnisés dans la
  version actuelle du modèle).

Le détail des règles et des équations est donné dans le Focus n°133,
section *« Structure du modèle »* (et notamment le graphique 1).



**Graphique 1 : Transitions entre emploi, chômage indemnisé et chômage non-indemnisé dans le modèle simulé**
![schéma des flux](../modele_simule/Schema_flux.png)

### 3.3. Flux financiers

Chaque état génère un flux financier mensuel :
- emploi (E) : **cotisations sociales** sur les revenus d'activité (τ) ;
- chômage indemnisé (UI) : **allocations chômage** (b) ;
- chômage non indemnisé (UNI) : **minima sociaux** (b̃ qui représente le RSA et l'ASS, pondérés
  par le taux de recours).

La dépense nette du système s'écrit : `b × U_I + b̃ × U_NI − τ × E`.

<a id="4"></a>
## 4. Paramètres et statistiques cibles

### 4.1. Paramètres structurels calibrés

Quatre paramètres sont estimés par minimisation de la fonction
objectif. Les valeurs ci-dessous reproduisent celles du tableau 1
du Focus n°133.

| Paramètre              | Notation | Description                                              | Valeur calibrée (échelle 1:10) |
|------------------------|----------|----------------------------------------------------------|--------------------------------|
| `job_finding_rate`     | h        | Taux mensuel de sortie du chômage vers l'emploi          | 0,0798                         |
| `job_destruction_rate` | δ₀       | Partie fixe du taux de destruction d'emploi              | 0,0400                         |
| `jdr_coef`             | δ₁       | Sensibilité du taux de destruction à l'ancienneté        | -0,0233                        |
| `take_up_rate`         | η        | Taux de recours à l'AC parmi les éligibles (ouvertures initiales) | 0,7495                |

Ces paramètres sont passés sous forme de liste à toutes les fonctions
de réforme, dans l'ordre :

```python
params = [np.log(0.07975226365748489),   # log(h)
          np.log(0.040047002245856764),  # log(δ₀)
          -0.023287798230794174,         # δ₁
          0.749454809460648]             # η
```

Les transformations en `log` pour `h` et `δ₀` sont utilisées dans
l'optimisation pour garantir la positivité de ces taux.

### 4.2. Paramètres des règles d'assurance chômage

Ces paramètres reflètent la **convention 2025 du régime général**.
Ils sont définis dans `parametres_regime_reference.py` et redéfinis
en tête de chaque fichier de réforme.

| Paramètre          | Description                                                   | Valeur régime 2025 |
|--------------------|---------------------------------------------------------------|--------------------|
| `threshold_UI`     | Seuil d'éligibilité (durée d'affiliation minimale, en mois)   | 6                  |
| `pra_max`          | Période de référence affiliation (en mois)                    | 24                 |
| `pbd_max`          | Durée potentielle d'indemnisation maximale (en mois)          | 18                 |
| `coef_conversion_UI` | Coefficient de conversion (durée affiliation → durée droits) | 0,75              |

Les individus ayant travaillé plus que `threshold_UI` mois sur les `pra_max` derniers mois sont éligibles, si ils ouvrent un droit la durée celui-ci est calculé avec la formule suivante : 
durée = min(18,max(min(nombre de mois travaillés sur la PRA*1.7, durée entre la fin du dernier contrat et le début du premier contrat sur la PRA)*`coef_conversion_UI`, 6)))

Pour le régime senior (55-57 ans), `pra_max = 36`, `pbd_max = 22`
(approximation de 22,5 mois) et `h` est ajusté pour refléter le moindre
dynamisme du marché du travail des seniors (`h_senior ≈ h_general*0,05/0,07`).

### 4.3. Statistiques cibles utilisées dans la calibration

Toutes les statistiques cibles sont définies dans
`parametres_regime_reference.py`, à l'échelle de l'économie réelle
puis divisées par `economy_scale = 10`.

| Statistique cible           | Valeur 2024 (économie réelle) | Source       |
|-----------------------------|-------------------------------|--------------|
| Stock d'emploi              | 19 341 000                    | Unédic       |
| Stock de chômeurs indemnisés (ARE) | 2 429 000              | Unédic       |
| Flux mensuel d'ouvertures de droits initiales | 158 000     | Unédic       |
| Flux mensuel de reprises de droits | 112 000                | Unédic       |
| Flux mensuel de rechargements | 28 000                      | Unédic       |
| Flux mensuel de sorties vers l'emploi | 190 000             | Unédic       |
| Part des ouvertures de droits avec 6-8 mois d'affiliation | 5,65 % | MiDAS  |

Les cinq statistiques retenues dans la fonction objectif sont : le stock de
chômeurs indemnisés (pénalisé plus fortement), le flux d'ouvertures de
droits initiales, le flux de sorties vers l'emploi, le flux de
reprises de droits, et la part des ouvertures avec 6-8 mois
d'affiliation (cf. lignes 478-489 de `calibration_modele_simule.py`
pour le détail de la fonction objectif).

### 4.4. Paramètres financiers (calibrés par réforme)

Pour chaque réforme, le niveau moyen d'allocation `b`, le salaire
moyen `salaire_pre` (et donc les cotisations `tax`) et éventuellement
le montant moyen des minima sociaux `b_rsa` sont calibrés
spécifiquement à partir de MiDAS sur la population affectée par la
réforme. Ces valeurs apparaissent en tête de chaque fichier de
réforme. **Modifier la valeur du choc d'une réforme nécessite donc en
toute rigueur d'ajuster également ces paramètres financiers**, faute
de quoi l'effet mesuré ne correspondrait plus à la population
réellement affectée.

<a id="5"></a>
## 5. Comment utiliser le modèle

Le notebook `simulations_reformes.ipynb` est le point d'entrée
recommandé. Il contient deux sections principales : une section
*Calibration* (cas n°2 ci-dessous) et une section *Simulation de
réformes* (cas n°1).

### 5.1. Cas n°1 — Simuler une réforme avec les paramètres déjà calibrés

C'est le cas d'usage le plus simple. Trois scénarios sont
habituellement simulés pour chaque réforme afin de pouvoir
décomposer l'effet total en effet mécanique et effet comportemental (il est aussi possible de séparer les deux effets comportementaux, auquel cas il est important de réfléchir à l'ordre d'application des effets)
Dans le cas d'une réforme du niveau d'allocation b ces scénarios se présentent ainsi :

| Scénario        | Paramètres                                 | Interprétation                              |
|-----------------|--------------------------------------------|---------------------------------------------|
| Contrefactuel   | `b_post = b_pre`, élasticités à 0          | Pas de réforme — trajectoire de référence    |
| Mécanique       | `b_post < b_pre`, élasticités à 0          | Effet à comportements inchangés              |
| Total           | `b_post < b_pre`, élasticités calibrées    | Effet total intégrant les réponses comportementales |

L'effet comportemental s'obtient par différence : `total − mécanique`.

**Exemple — baisse uniforme du montant d'allocation de 1 %** :

```python
import numpy as np
from montant_baisse_uniforme import f_niveau_uniforme

# Paramètres structurels calibrés (cf. Focus n°133, tableau 1)
params = [np.log(0.07975226365748489),
          np.log(0.040047002245856764),
          -0.023287798230794174,
          0.749454809460648]

# Scénario 1 — contrefactuel (b_post = b_pre, élasticités à 0)
f_niveau_uniforme(params, e_jfr=0, e_jdr=0, b_post=1212.9,
                  file1="sorties/csv_files/niveau_uniforme_contrefactuel.csv",
                  file2="sorties/csv_files/niveau_uniforme_contrefactuel_montee.csv")

# Scénario 2 — effet mécanique (b_post < b_pre, élasticités à 0)
f_niveau_uniforme(params, e_jfr=0, e_jdr=0,
                  file1="sorties/csv_files/niveau_uniforme_meca.csv",
                  file2="sorties/csv_files/niveau_uniforme_meca_montee.csv")

# Scénario 3 — effet total (élasticités calibrées)
f_niveau_uniforme(params, e_jfr=-0.3, e_jdr=0.1,
                  file1="sorties/csv_files/niveau_uniforme_total.csv",
                  file2="sorties/csv_files/niveau_uniforme_total_montee.csv")
```

Le notebook `simulations_reformes.ipynb` enchaîne ces trois appels
puis calcule et visualise les économies à 1 an, 5 ans et 10 ans à partir des CSV
produits (cf. §6.2).

#### Ce qu'il est raisonnable de modifier directement

- **Élasticités** (`e_jfr`, `e_jdr`) : modification raisonnable pour
  tester la sensibilité des résultats à des hypothèses alternatives
  issues de la littérature.
- **`file1`, `file2`** : chemins des fichiers de sortie.

#### Ce qui demande des ajustements en cascade

- **`b_pre et/ou b_post`** (allocation du public affecté) : modifiable, mais
  attention — si l'on change le public affecté par la réforme (par exemple
  en étudiant un autre plafond post réforme), il faut **en toute
  rigueur** recalibrer aussi les autres paramètres spécifiques en public en particulier le salaire moyen et donc les
  cotisations, à partir de MiDAS sur la nouvelle population affectée. Il est aussi utile d'incorporer les conséquences sur la     dégressivité lors des calculs des montants d'allocation pré et post réforme.
  Ces paramètres sont définis en tête de chaque fichier de réforme.
- **`PBD_max_post`, `PRA_elig_post`, `DA_min_post`** (paramètres de
  durée et d'éligibilité) : même remarque — la population affectée
  par la réforme change avec la valeur du choc, et les paramètres
  financiers calibrés sur cette population devraient être ajustés.

**Signatures des dix fonctions de réforme** :

```python
# Réformes du montant (b_post en €)
f_niveau_uniforme (params, e_jfr, e_jdr, b_post=1200.984,  b_pre=1212.9, file1, file2)
f_niveau_ciblee   (params, e_jfr, e_jdr, b_post=2058.088,  b_pre=2078.1, file1, file2)
f_niveau_plafond  (params, e_jfr, e_jdr, b_post=2536.67,   b_pre=3636.2, file1, file2)

# Réformes de la durée
f_PBD_coef    (params, e_jfr, e_jdr, PBD_coef_post,  PBD_coef_pre=0.75, file1, file2)
f_PBD_plafond (params, e_jfr, e_jdr, PBD_max_post,   PBD_max_pre=18,    file1, file2)

# Réformes d'éligibilité (pas d'élasticité — effet mécanique uniquement)
f_DA               (params, DA_min_post,    DA_min_pre=6,                            file1, file2)
f_PRA_elig         (params, PRA_elig_post,  PRA_elig_pre=24,                         file1, file2)
f_jointe_just_elig (params, PRA_elig_post,  DA_min_post,  PRA_elig_pre=24, DA_min_pre=6, file1, file2)

# Réformes seniors (55-57 ans)
f_PBD_plafond_senior (params, e_jfr, e_jdr, PBD_max_post, PBD_max_pre=22, file1, file2)
f_PRA_elig_senior    (params, PRA_elig_post, PRA_elig_pre=36,             file1, file2)
```

**Note importante sur les séniors** : les réformes seniors utilisent un
taux de retour à l'emploi adapté (h_senior ≈ 0,05/0,07 * h au lieu de h = 0.0798).
Cela se fait en passant des paramètres modifiés à la fonction :

```python
# h ajusté pour les seniors (rapport observé senior/général ≈ 0,05 / 0,07)
params_senior = [np.log(0.07975226365748489 * 0.05/0.07),
                 np.log(0.040047002245856764),
                 -0.023287798230794174,
                 0.749454809460648]
```

### 5.2. Cas n°2 — Recalibrer le modèle

Une recalibration peut êtree utile si l'on souhaite modifier la simulation (prise en compte d'autres règles, de plus d'hétérogénéité individuelle etc) ou utiliser d'autres cibles (chiffres actualisés, plus de statistiques etc). Il peut aussi être intéressant de faire une calibration spécifique aux séniors si l'on souhaite évaluer ensuite plus précisément des réformes ciblant ce public.

**Procédure** :

1. Mettre à jour `parametres_regime_reference.py` avec les nouvelles
   statistiques cibles et/ou `calibration_modele_simule` avec une variante de la simulation 
   (règles de l'assurance chômage, choix des statistiques utilisées dans la fonction objectif) si souhaité . 
2. Lancer un code similaire à celui proposé dans `simulations_reformes.ipynb`, 
   section *Calibration*, pour chercher les paramètres minimisant la fonction objectif
   (L'optimisation actuelle utilise `scipy.optimize.minimize` avec la méthode
   Nelder-Mead).
3. Récupérer les paramètres optimaux et les utiliser dans toutes les
   simulations de réformes (si la simulation a été modifiée, 
   impacter aussi ces modifications dans les codes de réformes)

**Astuce pratique** : pour faire des essais rapides (tester une
nouvelle statistique cible, choisir la modification de
`update_status` la plus pertinente), il est recommandé de **réduire temporairement
`economy_scale`** dans `parametres_regime_reference.py`. Par exemple
passer de `economy_scale = 10` à `economy_scale = 500` divise la
population simulée par 50 et permet de racourcir considérablement le temps d'execution. 

### 5.3. Cas n°3 — Ajouter une nouvelle réforme

Etapes clés pour étendre le périmètre :

1. **Utiliser un fichier de réforme proche comme base** pour construire un fichier 
   spécifique à la réforme.
2. **Ajuster le fichier** en rendant les bons paramètres variables entre avant et après
   la réforme (niveau d'allocation pour montant etc) et en ajustant la simulation
   du marché du travail en particulier la prise en compte des effets comportementaux 
   (choix du public affecté par ces effets etc) si besoin 
3. **Mettre à jour les paramètres du public affecté** 
   (part concernée, caractéristiques financières etc) 
   en se basant si possible sur des données individuelles (MiDAS ou autre)
4. **Adapter les élasticités** dans la fonction `f_xxx` 
   si besoin en fonction de ce que la littérature indique pour des réformes/publics similaires.
6. **Tester** sur une population réduite (`economy_scale = 500`) avant
   de lancer une simulation complète.

### 5.4. Cas n°4 — Ajouter de l'hétérogénéité individuelle

L'un des intérêts principaux du modèle simulé est de pouvoir
introduire de l'hétérogénéité entre individus, là où le modèle
comptable raisonne en moyennes. Cette extension est pertinente
**lorsque l'on dispose de données individuelles** (par exemple MiDAS)
et que l'on souhaite mieux capter la variabilité des effets d'une
réforme selon les caractéristiques des bénéficiaires.

**Où introduire de l'hétérogénéité** :

- **Dans la calibration** : à l'initialisation des individus
  (`Individual.__init__`), on peut tirer aléatoirement des
  caractéristiques individuelles (ex : un type/groupe défini selon un
  vecteur de caractéristiques) à partir d'une distribution
  empirique. Les taux de transition (`job_finding_rate`,
  `job_destruction_rate`) peuvent alors dépendre de ce type 
  (nécessite des statistiques supplémentaires, notamment spécifiques à ces populations
  pour que le modèle reste sur/juste identifié). Dans les réformes, 
  les élasticités peuvent aussi dépendre de ce type. 
  NB: attention à calibrer le type sur la bonne population : 
  dans une population avec des taux de transition hétérogènes, 
  la part d'individus dans un flux/stock peut-être différente de celle dans la population générale.
- **durée des droits** : dans les réformes de la durée, l'impact de la réforme dépend déjà des individus:
  Chaque agent stocke ses droits effectivement ouverts (`self.rights_opened`)
  et ses droits hypothétiques pré-réforme
  (`self.rights_would_have_open_pre`). Le choc individuel
  `(rights_opened - rights_would_have_open_pre) / rights_would_have_open_pre`
  module ses taux de transition. Cela permet d'isoler les agents
  effectivement affectés par la baisse de durée. 
  Il est envisageable de rafiner ceci, par exemple en intégrant 
  une variabilité du taux de retour à l'emploi en fonction de la durée des droits ouverts
  et/ou une augmentation de celui-ci à l'approche de la fin des droits.
- **montant d'allocation** : il serait intéressant d'essayer d'endogénéiser
  dans une certaine mesure le salaire (et donc le montant des droits) dans le modèle,
  notamment pour la réforme du plafond où il y a une forte hétérogénéité du choc 
  au sein du public affecté qui n'est actuellement pas capturée. 
- **âge** : il pourrait également être intéressant d'endogénéiser l'âge. 
  Ceci peut se faire de manière plus ou moins complète : 
  une amélioration simple pourrait consister en l'introduction d'un type spécifique
  pour les catégories 55-57 ans et 57+ soumis à des règles différentes 
  et avec un salaire et des taux de transition adaptés. 
  Une version plus ambitieuse consisterait à endogénéiser entièrement l'âge 
  ce qui impliquerait de l'inclure aussi dans des considérations comme le renouvellement de la population active
- **recours au minima sociaux** : nous ne prenons pas en compte de recours différencié 
 aux minima sociaux selon les caractéristiques des individus, ceci pourrait être intéressant.
  

**Vers un modèle plus complet** : les éléments du code (structure de
la classe `Individual`, gestion des historiques d'emploi, calibration
par moments simulés) peuvent être repris pour les intégrer à un
modèle de micro-simulation dynamique existant. C'est l'un des objectifs
de la mise à disposition de ces codes.

<a id="6"></a>
## 6. Sorties produites

### 6.1. Deux fichiers CSV par réforme et par scénario

Chaque appel à `f_xxx(...)` produit deux fichiers CSV optionnels
(passer `file1=None` et `file2=None` pour ne rien écrire) :

- **`file1`** — agrégats moyens. Trois lignes :
  - `avg_last_12` : moyennes sur les 12 derniers mois (état
    stationnaire post-réforme atteint après montée en charge complète).
  - `diff_pre_post_stable` : différences entre l'état stationnaire
    post-réforme et l'état stationnaire pré-réforme (= effet à
    long terme).
  - `diff_pre_post_12` : différences entre les 12 premiers mois
    post-réforme et l'état stationnaire pré-réforme (= effet à
    court terme).
- **`file2`** — trajectoire mensuelle complète post-réforme (mois 240
  à 480). Utilisée pour visualiser la montée en charge et calculer les
  économies à différents horizons.

Les valeurs sont ramenées à l'**échelle de l'économie réelle** (déjà
multipliées par `economy_scale`).

### 6.2. Colonnes des fichiers CSV

| Colonne                | Description                                                  |
|------------------------|--------------------------------------------------------------|
| `month`                | Numéro du mois de simulation (240 = entrée en vigueur)       |
| `employed`             | Stock d'individus en emploi                                  |
| `employed_eligible`    | Stock d'employés éligibles à l'assurance chômage             |
| `ui_unemployed`        | Stock de chômeurs indemnisés                                 |
| `noui_unemployed`      | Stock de chômeurs non indemnisés                             |
| `noui_eligible`        | Stock de chômeurs non indemnisés mais éligibles              |
| `employed_6_8_history` | Employés avec 6 à 8 mois d'ancienneté (utile au calage)      |
| `flow_into_ui`         | Flux mensuel d'ouvertures de droits initiales                |
| `flow_out_ui`          | Flux mensuel de sorties du chômage indemnisé vers l'emploi   |
| `flow_recharg`         | Flux mensuel de rechargements                                |
| `flow_reprise`         | Flux mensuel de reprises de droits                           |
| `odd`                  | Total des ouvertures et rechargements                        |
| `odd_6_8`              | Ouvertures de droits avec 6-8 mois d'affiliation             |
| `odd_pbd_15_18`        | Ouvertures conduisant à une durée de droits de 15-18 mois    |
| `epuise_uni`           | Flux mensuel d'épuisements de droits                         |
| `duree_droits_recharg` | Somme des durées des droits rechargés sur le mois (utilisé pour calculer les durées moyennes)            |
| `duree_droits_init`    | Somme des durées des droits ouverts lors d'ODD initiales sur le mois (utilisé pour calculer les durées moyennes) |
| `tax_rev`              | Recettes mensuelles (cotisations sociales)                   |
| `ui_cost`              | Dépenses mensuelles d'allocations chômage                    |
| `rsa_cost`             | Dépenses mensuelles de minima sociaux                        |
| `net_budget`           | Dépense nette du système (= `tax_rev − ui_cost − rsa_cost`)  |

Les fichiers produits par les réformes contiennent en outre une
colonne `ui_unemployed_regime_new` qui mesure la part des chômeurs
indemnisés sous le régime post-réforme (utile pour suivre l'avancement
de la montée en charge ; tend vers 1 à long terme).

### 6.3. Calcul des économies budgétaires

Le notebook `simulations_reformes.ipynb` enchaîne pour chaque réforme
le calcul standard suivant :

```python
import pandas as pd

# Lecture des trajectoires post-réforme et contrefactuelle
df         = pd.read_csv("sorties/csv_files/niveau_uniforme_total_montee.csv")
df_counter = pd.read_csv("sorties/csv_files/niveau_uniforme_contrefactuel_montee.csv")

# Différence mensuelle (économie = -dépense nette)
reforme = df.set_index('month') - df_counter.set_index('month')

# Économies annuelles à différents horizons
economie_annuelle_1_an   = reforme[:12]['net_budget'].sum()
economie_annuelle_5_ans  = reforme[60:72]['net_budget'].sum()
economie_annuelle_10_ans_total = reforme[120:132]['net_budget'].sum()

# Coût unitaire (économies totales / économies mécaniques) à 10 ans
# Nécessite le même calcul avec le scénario "mécanique" puis le ratio
cout_unitaire = economie_annuelle_10_ans_total / economie_annuelle_10_ans_meca
```
Les fichiers csv sont fournis dans 'sorties/csv_files', ils peuvent aussi être regénérés à partir des codes.
Le notebook produit également les graphiques de montée en charge
(figures sauvegardées dans `sorties/png_files/`).

<a id="7"></a>
## 7. Détails techniques

### 7.1. Parallélisation

Les simulations sont parallélisées sur `nbr_threads = 10` cœurs par
défaut via `concurrent.futures.ProcessPoolExecutor`. Ce paramètre est
défini dans `parametres_regime_reference.py` et redéfini en tête de
chaque fichier de réforme. Ajuster selon le matériel disponible.

La reproductibilité est assurée par un `SeedSequence` maître à partir
duquel sont dérivées des graines indépendantes pour chaque individu
(`base_seed = 12345` par défaut). Quatre flux RNG indépendants sont
maintenus par individu (destruction d'emploi, retour à l'emploi,
renouvellement de la population, décision de recours).

### 7.2. Échelle de la simulation

`economy_scale = 10` par défaut : un individu simulé représente 10
individus dans l'économie réelle. La population simulée est donc
d'environ 2,5 millions d'agents (population active divisée par 10),
répartis entre les 10 cœurs.

Pour les **réformes seniors**, `economy_scale = 1` (et non 10), car
la population des 55-57 ans est petite (~2,65 % de la population
indemnisable) et il faut conserver suffisamment d'agents pour des
statistiques stables.

Pour les **essais et le débogage**, on peut monter `economy_scale`
beaucoup plus haut (par exemple 500) pour réduire la population et
gagner du temps de calcul — au prix d'une estimation moins précise des économies
(cf. §5.2).

### 7.3. État stationnaire

La simulation est lancée sur 240 mois (calibration) ou 480 mois
(réformes). On suppose qu'au mois 240 l'état stationnaire a été atteint. 
Dans les simulations de réforme, **la réforme
entre en vigueur au mois 240** et la montée en charge est observée de
240 à 480 (soit les 20 ans suivant la réforme).

La réforme s'applique au **flux entrant** à partir du mois 240 et ne modifie
pas les droits déjà ouverts. La montée en charge correspond donc au
remplacement progressif du stock de chômeurs indemnisés sous l'ancien
régime par des chômeurs sous le nouveau régime. 
A noter que l'on suppose que les rechargements de droits se font
dans le nouveau régime après le mois 240 quel que soit le régime du droit initial.

<a id="8"></a>
## 8. Liens conceptuels avec le modèle comptable

Les deux modèles sont conçus pour être cohérents entre eux :

- **Élasticités** : les valeurs utilisées sont identiques.
  - Réformes du montant : e_jfr = -0,3 (sortie), e_jdr = +0,1 (entrée).
  - Réformes de la durée (régime général) : e_jfr = -0,272,
    e_jdr = +0,12.
  - Réformes de la durée (seniors) : e_jfr = -0,2, e_jdr = +0,24.
  - Réformes d'éligibilité : pas d'élasticité dans les deux modèles
    (effet mécanique uniquement).
- **Taux de retour à l'emploi** (h) : définitions légèrement
  différentes — dans le modèle comptable, h cible uniquement la
  dernière sortie du droit (car on raisonne en terme de droits consommés); 
  dans le modèle simulé, h capture toutes les sorties 
  (y compris celles suivies d'une reprise du même droit).
  Cf. note de bas de page sous le tableau 1 du Focus n°133.
- **Taux de destruction d'emploi** (δ) : variable implicite dans le
  modèle comptable (prise en compte via les flux), 
  variable explicite dans le modèle simulé (estimée via δ₀ et δ₁).

**Réformes étudiables uniquement dans le modèle simulé** : grâce à
l'hétérogénéité des historiques d'emploi, le modèle simulé permet
notamment d'étudier les effets sur la durée des droits d'une réduction
de la **période de référence affiliation (PRA)** au-delà de ses effets
sur l'éligibilité. Cet aspect n'est pas modélisable dans le modèle
comptable (cf. paragraphe « Réformes non étudiées dans le modèle
comptable » du Focus n°133). Ces réformes ne sont pas présentes dans le dépôt à l'heure actuelle.

<a id="9"></a>
## 9. Limites du modèle

Limites à garder en tête pour interpréter les résultats :

- **Hétérogénéité de salaires** : non modélisée. Un seul niveau
  d'allocation pré-réforme est utilisé par population affectée.
  L'extension à une distribution de salaires améliorerait notamment
  la précision sur la réforme du plafond d'indemnisation.
- **Saisonniers et intermittents** : les intermittents sont exclus de la simulation,
  les règles spécifiques aux saisonniers ne sont pas intégrées.
- **Séniors > 55 ans** : non modélisés dans la calibration générale ;
  seules les sous-réformes 55-57 ans sont étudiées séparément et de manière perfectible. 
  Les 62 ans et + sont exclus du modèle (interaction avec le système de retraites).
- **Dégressivité** : non endogène. Elle est intégrée *ex post* dans la
  calibration des niveaux d'allocation (correction MiDAS) mais
  n'apparaît pas comme un mécanisme propre du modèle (notamment pas de prise en compte
  de l'impact sur le taux de retour à l'emploi pour les mois affectés).
- **Identification de la fonction objectif** : pas de preuve formelle.
  L'optimisation (Nelder-Mead) ne garantit qu'un minimum local.
  Les paramètres de départ sont choisis en cohérence avec la
  littérature.
- **Renouvellement de la population active** : modélisé de façon
  simplifiée (taux constant calibré pour un renouvellement complet
  en 44 ans = 62 − 18). 
- **Taux de retour à l'emploi indépendant de la durée au chômage** :
  hypothèse simplificatrice. Une version plus riche pourrait faire
  dépendre h de la durée au chômage et/ou des droits restants.

<a id="10"></a>
## 10. Glossaire

| Sigle / Notation       | Définition                                                  |
|------------------------|-------------------------------------------------------------|
| **AC**                 | Assurance chômage                                            |
| **ARE**                | Allocation de retour à l'emploi                              |
| **ASS**                | Allocation de solidarité spécifique                          |
| **DA** (`threshold_UI`) | Durée d'affiliation minimale pour l'ouverture de droits (en mois) |
| **DPI** / `pbd_max`    | Durée potentielle d'indemnisation (en mois)                  |
| **MiDAS**              | Minima Sociaux, Droits d’Assurance-chômage, parcours Salariés (Base de micro-données gérée par la DARES et accessible sur le CASD)           |
| **ODD**                | Ouverture de droits                                          |
| **PRA** (`pra_max`)    | Période de référence affiliation (en mois)                   |
| **PRA_elig**           | Période de référence pour le test d'éligibilité — peut différer de `pra_max` (qui sert au calcul de la durée des droits ouverts) |
| **PRC**                | Période de référence calcul (durée entre le premier et le dernier mois travaillé sur la PRA) |
| **RSA**                | Revenu de solidarité active                                  |
| **b**                  | Niveau d'allocation mensuel                                  |
| **b̃** (`b_rsa`)        | Niveau moyen des minima sociaux (RSA + ASS, pondéré par le taux de recours) |
| **τ** (`tax`)          | Cotisations sociales mensuelles                              |
| **h** (`job_finding_rate`) | Taux mensuel de sortie du chômage vers l'emploi          |
| **δ₀** (`job_destruction_rate`) | Partie fixe du taux de destruction d'emploi         |
| **δ₁** (`jdr_coef`)    | Sensibilité du taux de destruction d'emploi à l'ancienneté   |
| **η** (`take_up_rate`) | Taux de recours à l'AC parmi les éligibles (ouvertures initiales) |
