-
Notifications
You must be signed in to change notification settings - Fork 99
Bonnes pratiques de modélisation
Ces lignes directrices documentent les consensus construits au sein de la communauté de personnes qui modélisent le modèle socio-fiscal français depuis des années, au fur et à mesure que des questions sont apparues.
Un point important d'étape date de 2021, où deux RFC, respectivement sur les variables et les paramètres ont été menées pour établir un consensus sur cette mise en forme. Les raisons des choix faits à l'époque sont détaillés dessus.
- Si une variable décrit la réalité, sans interprétation législative, on ne préfixe pas son nom. Par exemple : distance entre domicile et lieu d'études (
distance_domicile_etudes
), âge (age
) peuvent être décrites sans avoir besoin de faire référence à un autre concept. - Si une variable décrit la réalité dans une certaine interprétation définie par la loi, on ne préfixe pas selon le contexte de réutilisation mais on décrit l'interprétation retenue dans le nom de la variable. Par exemple : distance entre domicile et lieu d'études en kilomètres, distance orthodromique à l'hexagone (
distance_orthodromique
plutôt queaides_mobilite_distance
).
Sinon, on a un risque de faible découvrabilité par les réutilisateurs, et de multiplication des variables qui seront redéfinies pour chaque contexte d'usage, ce qui a un coût mémoire.
- Par défaut, on minimise le nombre de variables intermédiaires. Sinon, on a un risque de doublon, un coût mémoire et une perte de découvrabilité. Voir par exemple les variables créées dans le code M de la DGFIP.
- Une variable intermédiaire peut être créée si la définition qu'elle modélise est réutilisable, complexe, ou si son implémentation est vraiment trop lourde. L'arbitrage se fait donc en priorité sur la complexité de la formule de calcul.
/// - CETTE PARTIE EST UN DRAFT EN ATTENTE DE LA CLOTURE DE LA RFC 1672 ///
Les paramètres OpenFisca représentent la loi le plus fidèlement possible. Chaque évolution de valeur doit être justifiée par une référence législative.
Par convention, les #commentaires
sont interdits, et seront supprimés automatiquement à la validation. Il est recommandé de mettre ses annotations directement dans le champ documentation
.
Ce champ obligatoire est une description en français du paramètre. Il n'est pas limité mais contraint à une unicité dans le système socio-fiscal.
Par convention, il doit contenir le nom de l'ensemble des nœuds traversés dans l'arborescence depuis le dossier parameters
, avec une expansion des abréviations et les abréviations entre parenthèses.
- Nom :
description
- Type : Langage naturel non limité, sur une seule ligne, sans espace en début ni fin, unique dans le système socio-fiscal.
- Échelle de déclaration : Racine du paramètre
- Cas d'usage :
- Désambiguer un paramètre dont le nom est une abréviation.
- Rechercher et afficher un paramètre dans l'explorateur de législation.
- Exemples :
"Contribution sociale généralisée (CSG) sur les allocations chômage"
"Contribution exceptionnelle sur les hauts revenus"
Le champ values
contient les valeurs des paramètres à partir de leur date d'application (cf. plus bas).
Dans le cas d'un barème, ce champ se nomme brackets
et contient deux sous unités: un seuil (threshold
) et une valeur (qui peut être un taux rate
, un montant amount
, ...)
Lorsqu'un dispositif est éteint, les values passent à null
.
La date associée à un paramètre étant celle appliquée pour les simulations, il s'agit de la date d'entrée en application du point de vue du calcul du dispositif. Or, cette date peut être différente de la date de publication du texte (elle peut être mentionnée à la fin du texte officiel qui met en place la réforme, dans un décret d'application, etc.)
Pour l'IR, il y a une subtilité supplémentaire: d'une part, l'IR est un dispositif annuel, donc sa date d'application pour le calcul de l'impôt ne peut être qu'un 1er janvier. D'autre part, la convention actuelle dans Openfisca est en "année revenus", c'est-à-dire que la variable irpp
pour une année N correspond, non pas à l'IR de la déclaration de revenus faite en année N, mais à l'IR au titre des revenus de l'année N (déclaration en N+1).
Donc, les paramètres de l'IR N+1 sur les revenus N sont à mettre systématiquement au 01/01/N. Une alternative serait une convention en "année paiement" (l'irpp
de l'année N serait l'impôt effectivement payé en N), mais l'impôt sur les revenus N n'est pas forcément payé en N+1. N+1 n'est que la date de déclaration. Pour le paiement, il y a maintenant le prélèvement à la source et avant, il y avait un système d'acomptes et chaque contribuable pouvait choisir entre différentes options.
- Nom :
values
oubrackets
- Type : Float
- Échelle de déclaration : Racine du paramètre
- Exemples :
- Dans le cas d'un paramètre simple:
values:
1995-01-01:
value: null
1994-07-01:
value: 74.01
1993-01-01:
value: 72.92
1992-07-01:
value: 71.98
1992-01-01:
value: 70.71
- Dans le cas d'un barème:
brackets:
- rate:
1967-10-01:
value: 0.095
1970-08-01:
value: 0.1025
1981-11-01:
value: 0.0545
1984-01-01:
value: null
threshold:
1967-10-01:
value: 0.0
1984-01-01:
value: null
- rate:
1967-10-01:
value: 0.02
1976-01-01:
value: 0.025
1981-11-01:
value: 0.08
1984-01-01:
value: 0.126
1992-01-01:
value: 0.128
2016-01-01:
value: 0.1284
2018-01-01:
value: 0.13
threshold:
1967-10-01:
value: 1.0
1984-01-01:
value: 0.0
Cette metadata concerne la dernière valeur d’un paramètre. Il s’agit donc de ne vérifier qu’une seule valeur de la série : la dernière en vigueur. Ainsi, la date de ce champ est forcément postérieure à la dernière valeur du paramètre (et ceci peut facilement être vérifié en CI).
Elle est optionnelle et permet ainsi la capitalisation progressive de cette information dans la base de paramètres.
La bonne pratique est de fournir la référence législative correspondante à date. Si l’url est une information nouvelle, le contributeur peut décider de l’ajouter dans les références, avec une date postérieure à la dernière date de value. On mettra l'url à date uniquement dans la merge request s'il est déjà dans les références, afin d'éviter les redondances.
- Nom :
last_review
- Type : String contenant une date
- Échelle de déclaration : Champ
metadata
- Cas d'usage :
- Indiquer qu’un paramètre est à jour, même si sa valeur n’a pas changée depuis X années.
- Indiquer en front la dernière date de validité du code
- Exemple :
values :
1978-01-01 :
value : 0.005
metadata:
+ last_review: "2021-10-17"
La métadonnée ux_name
répond au besoin d'un nom non-ambigu avec un nombre connu (limité) de caractères. Ce nom court autorise les abréviations les plus connues. Il s'inscrit toujours dans un contexte de présentation reprenant l'arborescence du yaml, permettant ainsi de différencier deux paramètres ayant le même ux_name
.
Cette métadonnée est aussi introduite dans les index.yaml
(cf. section ci-dessous).
Ce champ n'est pas obligatoire.
- Nom :
ux_name
- Type : langage naturel limité à 70 caractères, sur une seule ligne, sans espace en début ni fin.
- Échelle de déclaration : Champ
metadata
- Cas d'usage :
- Afficher un nom reconnaissable par une personne non experte du modèle OpenFisca dans un espace d'affichage connu d'avance.
- Faciliter la construction d'interfaces graphiques en ayant une contrainte connue de taille d'affichage.
- Exemples :
Taux réduit
Fonds national d'aide au logement (FNAL)
Une référence législative est exigée à chaque ajout ou modification d'une valeur, afin d'identifier la loi d'où provient le paramètre. Cette référence peut être le lien vers le décret qui modifie la valeur, ou un lien direct vers l'article en vigueur ou, idéalement, les deux.
On demande systématiquement un intitulé et une URL pour chaque référence législative, par le biais d'un dictionnaire, dont les clefs sont des noms de textes légaux et les valeurs sont des URLs publiquement accessibles ou des chaînes vides
- Nom :
reference
- Type : Dictionnaire
- Échelle de déclaration : Champ
metadata
- Cas d'usage :
- Vérifier la validité d'une formule en consultant son origine légale.
- Afficher l'intitulé de la source légale dans l'explorateur de législation.
- Exemples :
base:
values:
2020-05-01:
value: 150
2020-06-01:
value: null
2020-10-01:
value: 150
metadata:
+ reference:
+ 2020-05-01:
+ - title: Décret n°2020-519 du 05/052020
+ href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000041849630/
+ 2020-06-01:
+ - title: Décret n°2020-769 du 24/06/2020, art. 2
+ href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000042032514
+ 2020-10-01:
+ - title: Décret n°2020-1453 du 27 novembre 2020
+ href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000042574431
On notera, qu'à l'heure actuelle, il existe aussi de nombreuses références sans url. Elles prennent alors la forme suivante:
base:
values:
1979-07-01:
value: 150
metadata:
+ reference:
+ 1979-07-01:
+ - Loi cadre 79-32 du 16/01/1979
+ - Arrêté du 02/05/1979 portant agrément de la convention du 27/03/1979
Anciennement 'date_parution_journal_officiel' côté IPP, ce champ a été renommé en anglais lors de l'intégration à OpenFisca.
Il se compose des dates de publication dans le Journal Officiel, pour chaque value
. Il est donc inséré dans le noeud value
pour éviter les répétitions des clefs (et donc le risque d’erreur). S’il y a plusieurs publications par dates, on fait un tableau [2019-01-01, 2019-01-04]
.
Ce champ n’est pas obligatoire.
- Nom :
official_journal_date
- Échelle de déclaration : Champ
value
- Cas d'usage :
- Pouvoir retrouver la publication dans le journal officiel
- Exemples :
values :
2021-01-01 :
value : 200
reference :
- "Article 2 du Décret n°2020-769 du 24 juin 2020: https://www.legifrance.gouv.fr/jorf/article_jo/JORFARTI000042032526/"
- "Décret n°2020-769 du 24 juin 2020: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000042032514”
+ official_journal_date : 2020-12-21
2018-10-01 :
value : 190
reference :
- "Article 2 du Décret n°2020-726 du 12 juin 2018: https://www.legifrance.gouv.fr/jorf/article_jo/JORFARTI000042032526/"
- "Décret n°2020-743 du 10 juin 2018: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000042032514”
+ official_journal_date : [2018-06-12, 2018-06-10]
Le champ description_en
est directement issu de l'harmonisation avec l'IPP, et est affiché sur la version anglaise de leur site. Il n'est pas obligatoire.
Le champ notes
est directement issu de l'harmonisation avec l'IPP. Il contient des informations spécifiques à une date.
- Nom:
notes
- Type : Texte libre
- Échelle de déclaration : Champ
metadata
- Cas d'usage :
- Ajouter une note en bas de chaque fichier Excel des barèmes IPP.
- Exemples :
values:
2021-01-01:
value: 200
metadata:
notes:
2021-01-01: Ce montant ne concerne plus les retraités
Ce champ contient du texte libre qui contient des informations relatives au paramètre, notamment des explications générales, l'extension des acronymes, ou encore des références législatives plus larges que des valeurs spécifiques.
- Nom:
documentation
- Type : Texte libre
- Échelle de déclaration : Racine du paramètre
- Cas d'usage :
- Indiquer les limites ou les choix faits pour la modélisation.
- Ajouter des information complémentaires.
- Exemples :
À partir de 2014, des seuils spécifiques (célibataire, couple) sont employés pour le calcul de la décote.
La taxe d'apprentissage est créée par la Loi de finances du 13 juillet 1925. La loi 77-704 du 05/07/1977créé une cotisation supplémentaire de 0,2% pour financer la formation en alternance; elle doit être versée de manière exceptionnelle en 1977. Elle a été maintenue par la LFR pour 1978. En 1990, la contribution supplémentaire de 0,10% est remplacée par une cotisation pérenne de 0,10% pour la formation en alternance.
Une incertitude subsiste sur le taux applicable en Alsace-Lorraine entre 1973 et 1978 inclus. Taxe d'apprentissage : CGI, art. 224 et s. et art. 140 A et s. de l'annexe I ; pour l'Alsace-Moselle, art. 1599 ter J.
Selon les paramètres, il arrive de rencontrer des cas un peu particuliers. Voici une liste des décisions prises pour chacun de ces cas. À noter qu'elles n'ont pas fait l'objet d'une RFC, et ne sont donc pas le résultat d'un consensus, mais plutôt de bonnes pratiques observées.
Est-ce que je peux ajouter une reference
qui a une date postérieure à la dernière valeur du paramètre ?
Exemples:
- La référence (article) d'une valeur a changé, mais pas sa valeur.
- La seule référence en ma possession est postérieure à la dernière valeur.
- Le dispositif a changé (réforme) mais pas cette valeur.
- Je trouve une référence récente qui détaille un mécanisme ou une réforme.
Dans les cas 1, 2 et 3, on peut ajouter cette référence si celle-ci n'est pas redondante avec les références précédentes. (Par redondant, on entend: le même lien LégiFrance mais pas à la même date)
Dans le cas 4, cette référence étant un peu plus large que la value
, il faudra plutôt l'ajouter dans le champ documentation
.
Dans certains cas, le ux_name
, même présenté dans son contexte d'arborescence, peut prêter à confusion.
Exemple:
Pour le paramètre parameters.prelevements_sociaux.contributions_sociales.csg.chomage.imposable.taux_reduit.yaml
, l'arborescence des ux_name
(dans les index.yaml
des noeuds) devrait être le chemin suivant:
Prélèvements sociaux / Contributions de Sécurité sociale du régime général / CSG / Chômage / Imposable / Taux réduit
Cependant, on va s'autoriser un peu de redondance par souci de clarification:
Prélèvements sociaux / Contributions de Sécurité sociale du régime général / CSG / Allocations chômage / CSG imposable / Taux réduit
Ceci permet de souligner deux choses:
- La CSG est prélevée sur les allocations chômage et non pas pour l'assurance chômage
- Il s'agit de la part imposable de CSG et non pas d'une CSG prélevée sur la part imposable des allocations chômage
/// FIN DE LA PARTIE EN DRAFT ///
Dans le dossier parameters
, chaque sous-dossier doit contenir un fichier index.yaml
, qui explicite le noeud correspondant. La création d'un tel fichier est obligatoire lors de l'ajout d'un dossier.
Ce fichier se compose ainsi:
label: Cotisations du régime d'assurance maladie
metadata:
ux_name: Assurance Maladie
description_en: SSCs of the sickness scheme
Chacun de ces champs respecte les mêmes règles que pour les paramètres (cf. ci-dessus).
- Les tests doivent être faits sur les variables le plus en aval possible. Les différents cas doivent être distingués par des différences d'attributs en amont et non avec des valeurs différentes pour les variables intermédiaires. Sinon, le risque est de ne pas arriver à tester des situations réelles mais des abstractions partielles.