Tables de mortalité réglementaires françaises et fonctions actuarielles
Project description
mortables 📊
Tables de mortalité réglementaires françaises & fonctions actuarielles en Python.
Pourquoi ce package ?
Chaque actuaire français a un jour copié-collé des qx depuis un PDF ou un fichier Excel bancal pour les mettre dans un tableur. mortables élimine cette friction :
- 📦 Les tables réglementaires sont embarquées dans le package (pas besoin de connexion internet)
- 🔢 Les fonctions actuarielles classiques sont prêtes à l'emploi (commutations, annuités, primes, provisions)
- 📈 Les graphiques standards sont disponibles en une ligne de code
- 🧪 Le tout est testé et documenté
Installation
pip install mortables
Avec les graphiques (nécessite matplotlib) :
pip install mortables[viz]
Démarrage rapide
Charger une table
from mortables import get_table, list_tables
# Voir les tables disponibles
list_tables()
# [{'id': 'TH0002', 'name': 'TH 00-02', ...}, ...]
# Table du moment (hommes)
th = get_table("TH0002")
th.qx_at(65) # → 0.0230
th.life_expectancy(0) # → ~75.8 ans
th.life_expectancy(65) # → ~16.5 ans
# Table du moment (femmes)
tf = get_table("TF0002")
tf.life_expectancy(0) # → ~83.0 ans
# Table générationnelle (rentes viagères)
tg = get_table("TGH05", generation=1960)
tg.life_expectancy(65) # → ~22 ans
Calculs actuariels
from mortables import get_table, life
th = get_table("TH0002")
# Annuité viagère due à 65 ans, taux technique 2%
life.annuity_due(th, age=65, rate=0.02) # → ~14.5
# Annuité temporaire 10 ans
life.annuity_due(th, age=65, rate=0.02, term=10) # → ~9.1
# Assurance vie entière
life.whole_life_insurance(th, age=40, rate=0.02) # → ~0.43
# Temporaire décès
life.term_insurance(th, age=40, rate=0.02, term=20) # → ~0.05
# Capital différé
life.pure_endowment(th, age=40, rate=0.02, term=20) # → ~0.59
# Assurance mixte
life.endowment_insurance(th, age=40, rate=0.02, term=20) # → ~0.64
# Prime pure annuelle (vie entière)
life.net_premium_whole_life(th, age=30, rate=0.02) # → ~0.007
# Provision prospective
life.reserve_whole_life(th, age_at_issue=30, rate=0.02, duration=20)
Nombres de commutation
from mortables import get_table, life
th = get_table("TH0002")
ct = life.commutation(th, rate=0.02)
ct.Dx[65] # D65
ct.Nx[65] # N65
ct.Mx[65] # M65
Projection de cash flows
from mortables import cashflows
# Portefeuille de rentiers
portfolio = [
{"age": 65, "annual_rent": 12000},
{"age": 72, "annual_rent": 8000},
{"age": 58, "annual_rent": 15000},
]
# Projection sur 40 ans avec un taux d'actualisation de 2%
flows = cashflows.project(portfolio, table="TF0002", years=40, rate=0.02)
print(flows.head())
# year expected_payment survivors pv_payment
# 0 0 35000.00 3.0000 35000.00
# 1 1 34720.15 2.9812 34038.38
# ...
# Provision totale (Best Estimate Liability)
cashflows.total_provision(portfolio, table="TF0002", years=60, rate=0.02)
# → ~650 000 €
Visualisation
from mortables import viz
# Courbes de mortalité (qx en échelle log)
fig = viz.plot_qx(["TH0002", "TF0002"], log_scale=True)
fig.savefig("qx.png")
# Courbes de survie
fig = viz.plot_survival(["TH0002", "TF0002"])
# Espérance de vie par âge
fig = viz.plot_life_expectancy(["TH0002", "TF0002"])
# Comparaison de deux tables (ratio de qx)
fig = viz.plot_comparison("TH0002", "TF0002", age_range=(30, 90))
# Effet de la génération sur la mortalité
fig = viz.plot_generations("TGH05", generations=[1930, 1950, 1970, 1990])
# Graphique des flux projetés
fig = viz.plot_cashflows(flows)
Export pandas
th = get_table("TH0002")
df = th.to_dataframe()
df.to_excel("TH0002.xlsx", index=False)
Tables disponibles
| Identifiant | Nom | Type | Genre | Réglementation | Usage |
|---|---|---|---|---|---|
TH0002 |
TH 00-02 | Moment | Hommes | Arrêté 20/12/2005 | Décès, capital |
TF0002 |
TF 00-02 | Moment | Femmes | Arrêté 20/12/2005 | Décès, capital |
TGH05 |
TGH 05 | Générationnelle | Hommes | Arrêté 01/08/2006 | Rentes viagères |
TGF05 |
TGF 05 | Générationnelle | Femmes | Arrêté 01/08/2006 | Rentes viagères |
Note : Les tables TGH05/TGF05 sont générationnelles. Il faut préciser l'année de naissance :
get_table("TGH05", generation=1960). Générations disponibles : 1900 à 2005.
Fonctions disponibles
Module life
| Fonction | Description | Notation |
|---|---|---|
commutation() |
Nombres de commutation | Dx, Nx, Sx, Cx, Mx, Rx |
life_expectancy() |
Espérance de vie résiduelle | ex |
annuity_due() |
Annuité viagère due | äx, äx:n⌉ |
annuity_immediate() |
Annuité viagère immédiate | ax |
whole_life_insurance() |
Assurance vie entière | Ax |
term_insurance() |
Temporaire décès | A¹x:n⌉ |
pure_endowment() |
Capital différé | ₙEx |
endowment_insurance() |
Assurance mixte | Ax:n⌉ |
net_premium_whole_life() |
Prime pure vie entière | Px |
net_premium_term() |
Prime pure temporaire | P¹x:n⌉ |
net_premium_endowment() |
Prime pure mixte | Px:n⌉ |
reserve_whole_life() |
Provision prospective | tVx |
Module cashflows
| Fonction | Description |
|---|---|
project() |
Projection des flux pour un portefeuille de rentiers |
total_provision() |
Provision totale (BEL) |
Module viz
| Fonction | Description |
|---|---|
plot_qx() |
Courbe de mortalité qx |
plot_survival() |
Courbe de survie lx |
plot_life_expectancy() |
Espérance de vie par âge |
plot_comparison() |
Ratio qx entre deux tables |
plot_generations() |
Comparaison par génération |
plot_cashflows() |
Graphique des flux projetés |
Développement
git clone https://github.com/yourname/mortables.git
cd mortables
pip install -e ".[dev]"
pytest -v
Voir CONTRIBUTING.md pour contribuer.
Roadmap
- Phase 2 : Analyse d'expérience (ratios A/E), lissage Whittaker-Henderson, graduation de Makeham
- Phase 3 : Modèles de projection (Lee-Carter, CBD), intervalles de confiance
- Tables internationales (HMD)
- Table TGHF05 (non genrée, loi Industrie Verte 2024)
- Tables INSEE annuelles
Licence
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mortables-0.1.0.tar.gz.
File metadata
- Download URL: mortables-0.1.0.tar.gz
- Upload date:
- Size: 24.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2410644fdf82b3d9624907f85ebd1b7a9c8281754e7b3512c218485f2a774e68
|
|
| MD5 |
c253d0ada3c882ec9b35a07dc29ae500
|
|
| BLAKE2b-256 |
3444a06e19c2672f4d8ec58c4235f3c0ca0af8b48426222f9e25eb3734bc8804
|
File details
Details for the file mortables-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mortables-0.1.0-py3-none-any.whl
- Upload date:
- Size: 21.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8bde78f3fe39adb5495830748208e62267e208e65f03374f128cd22db5c556d2
|
|
| MD5 |
1f49fdfe3a7803366e173b74445d6b89
|
|
| BLAKE2b-256 |
eb4295f28ecd766a8e40cd32d52531d6cd7301aaa3b916f17b595ed3e1a3119a
|