Aller au contenu

ADR-012 : la capacité se mesure en rejouant les poids à plusieurs tailles, et une forme fermée contrôle le moteur

Statut : acceptée le 2026-09-02, phase 6.

Contexte

Le moteur de backtest raisonne en poids, sans dollars. Le modèle d'impact en racine carrée, écrit en phase 6 dans quantlab.execution.costs, raisonne en participation, c'est-à-dire en dollars négociés rapportés aux dollars que le marché échange. Rien ne reliait les deux : aucune étude ne pouvait dire à quelle taille de capital son alpha net s'annule, alors que c'est la première question qu'un allocateur pose.

Trois façons de combler ce trou ont été considérées. Modifier le moteur pour qu'il porte un capital et des volumes. Écrire un second moteur dédié à la capacité. Ou envelopper le modèle d'impact dans un modèle de coût qui connaît le capital et lit les volumes à la date que le moteur lui donne.

Décision

Le moteur ne change pas. Un modèle de coût, ImpactAtScale, porte le capital, le volume quotidien moyen et la volatilité de chaque actif. Il enrichit le contexte que le moteur lui passe, puis délègue le calcul à SqrtImpactModel et à LinearCostModel. Il rend deux composantes séparées, le demi-écart et l'impact, que le moteur garde en colonnes distinctes.

La courbe de capacité rejoue les mêmes poids à chaque taille d'une grille géométrique. Mais elle ne se contente pas de la grille. Deux passages au capital unité isolent le brut moyen, le demi-écart moyen et la charge d'impact moyenne. La loi en racine carrée donne alors le capital d'annulation en forme fermée, ((g - s) / K) ** 2. Un dernier passage du moteur à ce capital vérifie que le rendement net moyen y vaut zéro à la précision machine, et cette vérification est publiée dans l'objet rendu.

Deux entrées de l'impact sont calculées sans regarder l'avenir. Le volume quotidien moyen est la médiane d'un mois de volumes en dollars, décalée d'une séance. La volatilité est l'écart type d'un mois de rendements quotidiens, décalé de même. Un test injecte un volume aberrant à une date et vérifie que la valeur rendue à cette date ne bouge pas.

Le plafond de participation borne la crédibilité du modèle. Quand la plus grosse transaction de l'historique le dépasse avant le capital d'annulation, la capacité retenue est le capital où le plafond est atteint. Ce capital se déduit de la participation au capital unité par une règle de trois. Au-delà, le net rendu par le moteur est déclaré optimiste.

Conséquences

Une étude de capacité tient en une page : rebâtir les poids d'une stratégie, joindre les volumes, appeler capacity_curve. La forme fermée et la grille se contrôlent l'une l'autre, et un désaccord entre elles hors écrêtage lève une erreur plutôt qu'un chiffre.

Le prix est un capital constant sur tout l'historique, ce qui surestime la participation des premières années d'un fonds réel. Et le coefficient d'impact reste déclaré : la capacité lui est proportionnelle à la puissance moins deux, donc toute étude publie sa sensibilité.

Le statut de tout chiffre de capacité est modélisé. Aucune donnée gratuite ne porte de coût d'exécution réel, et rien ici ne calibre le coefficient.

Options écartées

Modifier le moteur. Rejetée parce que le moteur est la brique la plus testée du dépôt, et qu'un capital en dollars y introduirait une seconde unité là où tout est en fraction.

Un second moteur. Rejetée parce que la réconciliation de deux moteurs est déjà un livrable de la phase 9, et qu'un troisième multiplierait les divergences à expliquer.

Une bissection sur le moteur au lieu de la forme fermée. Rejetée parce que la forme fermée est exacte sous le modèle et rend un contrôle indépendant du moteur ; la bissection n'aurait contrôlé que le moteur par lui-même.