Conception de la fonction objectif : la métrique que vous optimisez choisit secrètement votre stratégie
Partie de la série "Backtests sans illusions".
📄 Cet article est devenu un paper de recherche. Chaque chiffre ci-dessous provient d'un script déterministe qui construit une vérité terrain contrôlée — un marché synthétique avec un edge connu dans une bande de signal modérée et du bruit à queues épaisses partout — puis exécute une recherche de seuil sous six fonctions objectif différentes et mesure, hors échantillon, quelle stratégie chaque objectif sélectionne réellement. Lisez le paper en ligne (version interactive + PDF) sur objective-design.marketmaker.cc, code et données sur github.com/suenot/objective-design-degeneracy.
Vous voulez la meilleure stratégie. Alors vous lancez une recherche — vous balayez un seuil, un lookback, une distance de stop, et gardez le réglage qui obtient le meilleur score. La recherche se termine et vous livre un gagnant. Raisonnable. Standard. C'est exactement ce que fait tout optimiseur, toute grid search, tout tuner d'hyperparamètres sur terre.
Mais regardez le verbe : obtient le meilleur score. Meilleur sur quoi ? Avant que la recherche ne puisse couronner quoi que ce soit, vous avez dû lui donner un seul nombre à maximiser — une fonction objectif. PnL. Sharpe. Sharpe sur les barres tradées. Rendement sur drawdown maximum. Vous en avez tapé un, probablement sans trop y réfléchir, et la recherche a passé un million d'évaluations à faire exactement ce que vous lui avez demandé.
Ce choix unique n'est pas une formalité. C'est toute la décision. La recherche ne trouve pas "une bonne stratégie" — cela n'existe pas dans l'abstrait. Elle trouve la stratégie qui maximise le scalaire que vous avez choisi, et différents scalaires pointent vers des stratégies radicalement différentes sur les mêmes données. L'objectif est la main secrète sur le volant, et la plupart du temps, personne ne la regarde.
Voici tout l'article en un seul tableau. Une recherche de seuil, un marché synthétique avec un edge réel et connu, six objectifs — et les six stratégies qu'ils sélectionnent, mesurées sur des données réservées :
| Objectif (ce que la recherche maximise) | Exposition moyenne au marché | Sharpe in-sample | Sharpe hors échantillon | Gagnants dégénérés |
|---|---|---|---|---|
| PnL brut | 0.859 | 1.76 | 1.61 | 0% |
| Sharpe pleine timeline | 0.740 | 1.82 | 1.71 | 0% |
| Sharpe par trade ("actif") | 0.286 | 1.00 | 0.70 | 57% |
| Plancher d'exposition () | 0.740 | 1.82 | 1.71 | 0% |
| Shrinkage par nombre de trades (conf_k) | 0.523 | 1.54 | 1.31 | 20.7% |
| Robuste (plancher + conf_k) | 0.675 | 1.78 | 1.70 | 0.2% |
600 seeds indépendants, barres chacun, 80 seuils candidats par recherche, in-sample et hors échantillon tirés indépendamment. Sharpe annualisé (252 périodes/an). "Dégénéré" = le gagnant sélectionné est dans le marché moins de 5% du temps, ou affiche un Sharpe hors échantillon non positif. L'optimum réel de ce marché est un Sharpe annualisé hors échantillon de 1.77.
Lisez la troisième ligne jusqu'à ce que ça pique. Le Sharpe par trade — un représentant de toute la famille des métriques conditionnées à l'activité (Sharpe par trade, expectancy, le SQN de van Tharp, taux de réussite), toutes calculées uniquement sur les barres tradées — sélectionne une stratégie qui, hors échantillon, est pire que la moitié des autres, et le fait de manière dégénérée 57% du temps. Ce n'est pas un objectif subtilement moins bon. Sur ces données, c'est un piège, et la recherche y tombe plus d'une fois sur deux. Lisez maintenant la ligne juste au-dessus : le simple Sharpe pleine timeline ne dégénère jamais et affiche 1.71 hors échantillon. C'est la chute de toute la réparation, dévoilée dès le début — le correctif honnête consiste simplement à mesurer sur la timeline complète ; les correctifs plus sophistiqués des lignes du bas, au mieux, ne font jamais que rejoindre ce chiffre, jamais le dépasser. Cet article est l'anatomie de ce piège et de sa réparation, la vérité terrain étant connue tout du long, de sorte que "l'objectif a-t-il choisi la bonne stratégie ?" est un fait, pas une opinion.
Acte 1 — La décision secrète : la loi de Goodhart, c'est la recherche

En 1975, l'économiste Charles Goodhart a écrit une phrase qui a survécu à tout ce qu'il a fait d'autre :
"Any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes."
La paraphrase populaire, généralement attribuée à Marilyn Strathern, est plus incisive : quand une mesure devient une cible, elle cesse d'être une bonne mesure.
Une recherche de paramètres est l'instance la plus pure possible de la loi de Goodhart. La fonction objectif est la mesure. La recherche est la pression — des milliers, des millions de tentatives pour pousser cette mesure aussi haut que possible. Et la recherche se moque totalement de ce que vous vouliez dire par cette mesure. Elle ne se soucie que du chiffre. S'il existe un moyen de rendre ce chiffre grand qui n'a rien à voir avec un edge réel et tradable — trader rarement, rester flat la plupart du temps, attraper quelques outliers chanceux — la recherche trouvera ce moyen, car trouver le maximum est la seule chose pour laquelle elle est construite.
C'est le même échec que la littérature sur la sécurité de l'IA appelle reward hacking : un agent qui optimise un proxy de ce que vous voulez exploitera chaque faille entre le proxy et l'objectif réel. Votre recherche est cet agent. Le "Sharpe ratio" est ce proxy. "Une stratégie à laquelle je peux faire confiance pour trader de l'argent réel le trimestre prochain" est l'objectif réel. L'écart entre les deux est là où vit toute la discipline.
Pour observer cet écart s'ouvrir, il nous faut un monde où nous connaissons la vérité. Nous en construisons donc un.
Le marché. À chaque période, un prédicteur (un signal normal standard) arrive, suivi du rendement qu'il prédit partiellement. L'edge est réel mais borné — il n'existe qu'à l'intérieur d'une bande de signal modérée , et disparaît en dehors :
Deux choix de conception comptent. Premièrement, l'edge vit dans la bande modérée : les signaux extrêmes ne portent aucune information prédictive, donc une stratégie devrait trader le milieu et éviter les queues. Deuxièmement, le bruit est à queues épaisses (Student- à 4 degrés de liberté, le genre de queue lourde que les rendements réels ont effectivement) — mais cet ingrédient est là pour le réalisme, pas le mécanisme. Il est tentant de dire que les queues épaisses sont ce qui rend le piège possible, et c'est exactement ce que nous avons supposé jusqu'à ce que nous exécutions le contrôle : une version à bruit gaussien de ce marché (gaussian_control dans les résultats, 300 seeds) reproduit le piège de manière quasiment inchangée — l'objectif par trade dégénère toujours 55.7% du temps sous bruit gaussien contre 57.0% avec les queues épaisses, et son Sharpe hors échantillon est 0.71 contre 0.70. Le piège n'est donc pas une question de queues épaisses. C'est un pur effet de petit échantillon plus sélection : prenez le maximum, sur ~20 seuils à faible exposition, d'un Sharpe calculé sur une poignée d'observations, et un coin chanceux quelconque aura toujours l'air spectaculaire. N'importe quelle distribution de bruit produit cela ; une stratégie présente dans le marché seulement quelques barres peut, par pure chance, traverser quelques mouvements favorables et afficher un chiffre in-sample qui ne signifie rien. Nous gardons les queues épaisses parce que les rendements réels en ont, pas parce que le piège en a besoin.
La stratégie. Une famille à un paramètre. Trader dans la direction du signal chaque fois que son amplitude est inférieure à un seuil , sinon rester flat :
Un minuscule ne trade que sur les signaux les plus petits et insignifiants — une loterie de trades rares, presque jamais dans le marché. Un proche du bord de la bande capture tout l'edge réel et est bien exposé. Un énorme trade tout, y compris les barres hors bande qui ne portent aucun edge et n'ajoutent que du bruit.
def gen_dataset(T, rng, beta=0.30, band=1.0, tail_df=4):
s = rng.standard_normal(T)
edge = beta * np.where(np.abs(s) <= band, s, 0.0) # edge ONLY inside |s| <= 1
t = rng.standard_t(tail_df, T) / np.sqrt(tail_df / (tail_df - 2.0)) # fat tails, unit var
return s, edge + t
def simulate(s, r, theta):
pos = np.where(np.abs(s) <= theta, np.sign(s), 0.0) # trade the band, skip outliers
strat = pos * r
active = pos != 0.0
exposure = active.mean() # fraction of bars in a position
sharpe_full = strat.mean() / strat.std(ddof=1) # on the WHOLE timeline
sharpe_active = strat[active].mean() / strat[active].std(ddof=1) # on ONLY the active bars
return dict(exposure=exposure, n_trades=int(active.sum()),
sharpe_full=sharpe_full, sharpe_active=sharpe_active, pnl=strat.sum())
Comme nous avons construit le marché, nous pouvons calculer la vérité directement — la performance moyenne à chaque seuil sur les 600 seeds, hors échantillon. L'optimum réel se situe à : juste au bord de la bande de signal, dans le marché environ 70% du temps (dérivé : un signal normal standard tombe dans avec une probabilité ), affichant un Sharpe annualisé hors échantillon de 1.77. C'est le chiffre que chaque objectif essaie de trouver. Gardez-le en tête : θ≈1.04, Sharpe OOS 1.77, environ 70% de la timeline dans le marché. Tout ce qu'un objectif sélectionne loin de cela est un échec de l'objectif, pas une difficulté du marché.
Acte 2 — Le piège : huit trades chanceux, un Sharpe de 21, un mirage

Lâchons maintenant un objectif naïf sur un tirage concret de ce marché — seed 6. Divulgation complète sur le seed : ce n'était pas le premier tirage, ni un tirage aléatoire. Nous avons scanné les seeds à la recherche d'un gagnant par trade nettement dégénéré et avons choisi celui-ci, précisément pour que le mécanisme soit impossible à manquer. Le résultat qu'il montre est parfaitement typique — comme le confirmera l'Acte 3, l'objectif par trade choisit une loterie à moins de 5% d'exposition dans 56% de tous les seeds — mais la magnitude du seed 6 se situe à l'extrémité de cette distribution. Lisez-le comme une instance particulièrement frappante d'un échec courant, pas comme une médiane. Nous optimisons le Sharpe par trade : le Sharpe ratio calculé uniquement sur les barres où la stratégie est réellement en position. C'est quelque chose d'extrêmement naturel à rapporter. "Quand elle trade, ses trades sont-ils bons ?" On a l'impression que ça isole le skill de l'inactivité. C'est le contraire qui se produit.
Voici la stratégie que le Sharpe par trade couronne sur le seed 6 :
- Seuil — il ne trade que sur les tout petits signaux.
- Exposition au marché 0.4% — flat 99.6% du temps.
- Huit trades. Huit. Sur 2000 barres.
- Sharpe par trade annualisé in-sample : 21.09.
- Sharpe pleine timeline in-sample : 0.82.
- Sharpe pleine timeline hors échantillon : 0.13.
La métrique par trade affiche 21.09 — un chiffre qu'aucune stratégie réelle n'a jamais atteint, du genre qui lancerait un fonds. Et c'est un mirage complet. Ces huit trades ont par hasard capté quelques mouvements favorables ; mesuré sur ces huit seules barres, le ratio entre moyenne et écart-type est astronomique. Mais sur la timeline complète — où la stratégie est flat 99.6% du temps — cet "edge" ne contribue quasiment à rien : un Sharpe pleine timeline de 0.82 in-sample, qui s'effondre à 0.13 sur des données fraîches. Le gagnant sélectionné par l'objectif est, pour tout usage de trading, flat.
Et ce n'est même pas un edge réel à ce seuil. Rappelez-vous le marché : l'edge vit dans la bande , et se trouve en plein centre, là où le signal est le plus faible. La vraie courbe hors échantillon à est −0.01 — indiscernable de zéro (dérivé de la courbe de vérité terrain). La recherche n'a pas trouvé un petit edge réel. Elle a trouvé huit tirages chanceux de bruit et les a rapportés comme un Sharpe de 21.
C'est le piège en miniature : le Sharpe par trade récompense la stratégie pour trader aussi rarement que possible, car moins on tient de barres, plus il est facile qu'un couple d'entre elles soient chanceuses, et la métrique ne demande jamais "mais étiez-vous réellement dans le marché ?" La magnitude du seed 6 est triée sur le volet — nous en avons cherché délibérément une frappante — mais son type ne l'est pas. Sur les 600 seeds, le Sharpe par trade sélectionne un gagnant dégénéré (l'un qui trade à peine, ou perd hors échantillon) dans 57% d'entre eux, et une loterie à moins de 5% d'exposition spécifiquement dans 56%. Le choix dégénéré typique est bien plus modéré que le Sharpe de 21 du seed 6 : moyenné sur les 600 seeds, le gagnant de l'objectif par trade a un Sharpe par trade in-sample de 4.58 et une exposition moyenne de 0.286 — toujours flat la plupart du temps, juste pas flat à 99.6%. Le seed 6 dramatise le mécanisme ; les 56% sont la partie qui devrait vous inquiéter. Plus d'une fois sur deux, cette métrique du quotidien vous remet un billet de loterie et l'appelle une stratégie.
Acte 3 — La vérité statistique : six objectifs, 600 seeds

Un seed ne prouve rien ; il ne fait qu'illustrer. Pour mesurer un objectif, il faut demander ce qu'il sélectionne en moyenne, à travers de nombreux marchés indépendants, et noter cette sélection sur des données que la recherche n'a jamais vues. Donc : 600 seeds, chacun un tirage indépendant du marché ; sur chacun, on exécute la recherche à 80 seuils sous chaque objectif ; on enregistre l'exposition, le Sharpe in-sample et hors échantillon de ce qui a été choisi, et si ce choix était dégénéré.
| Objectif | Exposition moyenne | Sharpe in-sample | Sharpe hors échantillon | Chute IS→OOS (abs.) | Dégénéré |
|---|---|---|---|---|---|
| PnL brut | 0.859 | 1.76 | 1.61 | 0.15 | 0.0% |
| Sharpe pleine timeline | 0.740 | 1.82 | 1.71 | 0.11 | 0.0% |
| Sharpe par trade | 0.286 | 1.00 | 0.70 | 0.30 | 57% |
| Plancher d'exposition () | 0.740 | 1.82 | 1.71 | 0.11 | 0.0% |
| Shrinkage conf_k () | 0.523 | 1.54 | 1.31 | 0.23 | 20.7% |
| Robuste (plancher + conf_k) | 0.675 | 1.78 | 1.70 | 0.08 | 0.2% |
La colonne "Chute IS→OOS" est la baisse absolue du Sharpe annualisé de l'in-sample au hors échantillon (par exemple est une chute de 0.30), pas un pourcentage. Et remarquez que la ligne "Plancher d'exposition" est identique, octet pour octet, à "Sharpe pleine timeline" : ce n'est pas une coïncidence, et l'Acte 5 explique pourquoi.
Trois faits sautent aux yeux, et chacun est une leçon.
Le Sharpe par trade est le seul objectif naïf qui dégénère. Son exposition moyenne est 0.286 — il sélectionne des stratégies flat la plupart du temps — et son Sharpe in-sample de 1.00 chute de 0.30 vers un hors échantillon de 0.70, le pire du lot. Notez le signe révélateur : son chiffre in-sample (1.00) n'est même pas impressionnant, pourtant sur n'importe quel seed individuel, il rapportera volontiers un chiffre par trade de 21. La moyenne s'annule parce que les fenêtres chanceuses pointent dans des directions aléatoires ; ce qui survit jusqu'à l'échantillon hors test n'est que 0.70, et 57% des sélections individuelles sont carrément mauvaises.
Les objectifs conscients de l'exposition sont naturellement sûrs. Le PnL brut et le Sharpe pleine timeline ne dégénèrent jamais (0.0%). La raison est structurelle : les deux sont mesurés sur l'ensemble de la timeline, donc une stratégie flat 99.6% du temps ne gagne presque rien sous ces métriques. On ne peut pas tricher avec une métrique pleine timeline en tradant rarement — rester flat est directement et automatiquement pénalisé, parce que les barres flat sont dans le dénominateur. C'est l'idée la plus importante de l'article, et nous y revenons à l'Acte 6.
Le PnL brut est sûr mais pas optimal — il sur-expose. Regardez de près : l'exposition moyenne du PnL brut est 0.859, la plus élevée de toutes, et son Sharpe hors échantillon (1.61) est un cran en dessous du Sharpe pleine timeline (1.71) et de l'optimum réel (1.77). Le PnL récompense le fait d'être dans le marché, donc la recherche pousse trop haut (sur le seed 6, le PnL brut choisit contre l'optimal 1.04), entraînant des barres hors bande qui ne portent aucun edge et n'ajoutent que du bruit. Il n'explose pas — mais il dérive au-delà de l'optimum réel dans la direction opposée au piège par trade. Objectif différent, biais différent, même leçon : la métrique a choisi la stratégie.
Les deux lignes dont nous n'avons pas encore parlé — le plancher d'exposition et conf_k — sont la réparation. C'est le prochain acte.
Acte 4 — Pourquoi huit trades ne peuvent jamais être fiables

Avant de réparer le piège, il vaut la peine d'être précis sur pourquoi huit trades produisent un Sharpe de 21 qui ne signifie rien — car le correctif découle directement de cette raison.
Un Sharpe ratio est une estimation, et les estimations ont des barres d'erreur. Le résultat d'Andrew Lo de 2002 donne l'erreur standard d'un Sharpe ratio estimé à partir de observations, sous l'hypothèse la plus généreuse possible (rendements gaussiens IID) :
L'erreur ne diminue qu'en . Appliquons-la au piège. Le Sharpe par trade sur le seed 6 est de annualisé, soit par observation, calculé sur barres. L'erreur standard est
(dérivé de la formule de Lo). L'estimation ponctuelle est ; sa barre d'erreur à un sigma est de l'ordre de — lisez cela comme un ordre de grandeur illustratif, pas comme un intervalle de confiance calibré, puisque la formule suppose des rendements gaussiens IID que notre bruit à queues épaisses viole. Même ainsi, le message est sans équivoque : le "Sharpe de 21" est un chiffre tiré d'une distribution si large qu'il ne porte pratiquement aucune information — et c'est le calcul charitable, car l'extension de Mertens montre que les queues épaisses et l'asymétrie ne font qu'enfler davantage l'erreur standard. Le Sharpe d'un backtest à trades rares est moins fiable que sa valeur ponctuelle dans toutes les directions à la fois : trop peu d'observations, et la mauvaise distribution.
C'est exactement ce que formalise la Minimum Track Record Length (Bailey & López de Prado, 2012). Elle inverse la question — de combien d'observations ai-je besoin avant de pouvoir croire un Sharpe de cette taille avec une confiance ? —
transformant "méfiez-vous des backtests à peu de trades" en un nombre explicite et vérifiable de trades. Le point profond pour la conception d'objectifs est le suivant : un bon objectif devrait imposer un track record minimum de l'intérieur, plutôt que de laisser un humain remarquer, après coup, que le gagnant repose sur huit observations. Le Sharpe par trade fait le contraire — il est maximisé en poussant le nombre d'observations vers le minimum. Tout objectif dont l'optimum se situe à "aussi peu de trades que possible" est, par construction, un objectif qui recherche sa propre estimation la moins fiable.
Deux défaillances se combinent dans le piège, et les nommer toutes deux nous dit comment le corriger. Premièrement, le bruit de petit échantillon : huit observations ne peuvent fixer aucun ratio. Deuxièmement, la sélection : ces huit barres ne nous ont pas été données — la recherche a choisi le seuil qui est tombé dessus, en partie *parce qu'*elles étaient chanceuses. La recherche est un maximiseur ; elle trouvera toujours le coin de l'espace où le bruit ressemble par hasard à un signal. On ne peut pas déjouer cela avec une meilleure estimation ponctuelle. Il faut changer ce que signifie "meilleur" pour que le coin chanceux ne soit plus le maximum.
Acte 5 — La réparation : un plancher d'exposition et un shrinkage par nombre de trades

Nous avons deux maladies identifiées — trade trop rarement et repose sur trop peu d'observations — nous écrivons donc deux remèdes, chacun ciblant l'une d'elles.
Remède 1 : un plancher d'exposition. Le correctif le plus simple possible. Rejetez purement et simplement toute stratégie qui n'est pas dans le marché au moins du temps — si elle trade à peine, son score est et la recherche ne peut pas la sélectionner. Mais il y a une subtilité honnête dans ce qu'on plafonne, et c'est la leçon silencieuse de tout cet article. En tant qu'objectif autonome, nous avons plafonné le Sharpe pleine timeline, et sur ce marché cela ne change absolument rien : le gagnant propre du Sharpe pleine timeline est déjà à ~74% d'exposition, donc un plancher de 20% ne s'active jamais. C'est exactement pourquoi les lignes "plancher d'exposition" et "Sharpe pleine timeline" dans les tableaux ci-dessus sont identiques octet pour octet — visser un plancher sur une métrique déjà sûre revient simplement à redériver le Sharpe complet. Le plancher ne fait un travail visible que lorsqu'il protège une métrique qui sinon filerait vers le coin : une métrique par trade, comme dans l'objectif robuste ci-dessous. Autrement dit, "exiger de l'exposition" et "mesurer sur la timeline complète" sont, sur ces données, deux noms pour la même intervention.
Remède 2 : un shrinkage par nombre de trades — "conf_k". Pour quand vous êtes coincé avec une métrique par trade et voulez une correction douce plutôt qu'une coupure brutale : réduire le Sharpe continûment selon le nombre de trades sur lequel il repose. Multiplier par , où est le nombre de trades et une "constante de confiance" fixe — une force de prior équivalente en trades choisie avant la recherche :
Quand , le score s'écrase vers zéro peu importe l'ampleur du Sharpe brut ; quand , le score converge vers le Sharpe brut. C'est la même logique corrective que MinTRL et l'erreur standard de l'Acte 4 — réduire une estimation de petit échantillon vers zéro comme fonction décroissante de sa taille d'échantillon — repliée directement dans l'objectif plutôt qu'appliquée comme filtre a posteriori. Le précédent nommé le plus proche est le System Quality Number de van Tharp (), qui fait également évoluer une métrique de qualité par trade avec le nombre de trades — bien que la forme fonctionnelle diffère ( croît sans limite, tandis que sature à 1). Dans sa forme, la nôtre est un shrinkage bayésien pondéré par précision / de type empirique-bayésien ; c'est notre construction pour ce problème, pas un estimateur nommé tiré de la littérature.
def obj_active_sharpe(m): # the trap: Sharpe on only the active bars
return m["sharpe_active"]
def _shrink(n, conf_k): # trade-count shrinkage n / (n + k)
return n / (n + conf_k) if (n + conf_k) > 0 else 0.0
def obj_confk(m, conf_k=40.0): # few trades -> little credit
return m["sharpe_active"] * _shrink(m["n_trades"], conf_k)
def obj_robust(m, e_min=0.20, conf_k=40.0): # both cures at once
if m["exposure"] < e_min: # floor: reject strategies that barely trade
return -np.inf
return m["sharpe_active"] * _shrink(m["n_trades"], conf_k)
Passons à la partie honnête : combien de plancher, combien de shrinkage ? On balaye les deux et on lit toute la surface. Chaque cellule est le Sharpe moyen hors échantillon sur 200 seeds (un sous-ensemble d'un tiers des 600, pour garder le balayage bidimensionnel abordable) avec le taux de dégénérescence à côté :
| \ conf_k | |||
|---|---|---|---|
| 0.00 | 0.66 (59.5%) | 1.26 (22.5%) | 1.47 (11.5%) |
| 0.05 | 1.43 (10.0%) | 1.53 (6.0%) | 1.60 (4.0%) |
| 0.10 | 1.64 (1.5%) | 1.65 (1.0%) | 1.67 (1.0%) |
| 0.20 | 1.71 (0.0%) | 1.71 (0.0%) | 1.71 (0.0%) |
| 0.35 | 1.73 (0.0%) | 1.73 (0.0%) | 1.73 (0.0%) |
Sharpe annualisé moyen hors échantillon, avec le taux de dégénérescence entre parenthèses. La cellule en haut à gauche est le Sharpe par trade brut — sans plancher, sans shrinkage : OOS 0.66, dégénéré à 59.5%. C'est le même objectif que la ligne par trade de l'Acte 3, qui affichait 0.70 / 57% ; le petit écart provient purement de l'ensemble de seeds — ce balayage utilise 200 seeds, le Monte Carlo utilisait les 600. Même métrique, échantillon plus petit.
La surface raconte une histoire claire en trois lectures.
Chaque remède fonctionne seul. Déplacez-vous vers la droite le long de la ligne du haut (ajout de shrinkage, sans plancher) : l'OOS grimpe et la dégénérescence chute . Déplacez-vous vers le bas dans la colonne de gauche (ajout de plancher, sans shrinkage) : l'OOS grimpe et la dégénérescence chute . Chaque bouton, tourné seul, élève indépendamment la performance hors échantillon et tue la dégénérescence. Le plancher d'exposition est le levier individuel le plus fort ici, car il attaque de front la caractéristique déterminante du piège — une exposition proche de zéro.
Ensemble, ils atteignent le plateau — et le plateau, c'est exactement le Sharpe pleine timeline. À , la ligne est plate à OOS 1.71 avec 0% de dégénérescence à tous les niveaux de shrinkage ; en poussant à , ça monte légèrement à 1.73. Mais regardez bien *ce qu'*est ce 1.71 : c'est exactement le score que le simple Sharpe pleine timeline affiche à l'Acte 3 sans plancher ni aucun shrinkage. Au mieux, les correctifs ne dépassent pas le Sharpe pleine timeline — ils le reconstruisent. Et l'objectif robuste entièrement réparé n'y arrive même pas tout à fait : sur les 600 seeds, il atterrit à OOS 1.70 avec une dégénérescence résiduelle de 0.17%, un cheveu en dessous du 1.71 / 0% du Sharpe complet — il est faiblement dominé par la métrique plus simple. Un réglage intermédiaire modeste, avec , atteint OOS 1.65 à 1% de dégénérescence — pratique si une métrique par trade vous est imposée, mais jamais une raison d'en préférer une.
Les chiffres exacts dépendent de l'échelle — la forme est le résultat. Les valeurs spécifiques , qui réparent entièrement ce marché sont ajustées à ce processus générateur de données ; sur un marché différent avec des fréquences de trade et une épaisseur de queue différentes, le plateau se situe ailleurs. Ce qui se généralise, ce ne sont pas les coordonnées mais la surface : une élévation monotone dans les deux directions, la dégénérescence poussée vers zéro, un plateau à la vérité. Vous trouvez vos propres coordonnées en balayant, exactement comme ci-dessus.
Combinez les deux remèdes — l'objectif robuste, plancher 0.20 plus conf_k 40 — et revenez au seed 6. Le piège couronnait , huit trades, un Sharpe OOS pleine timeline de 0.13. L'objectif robuste sélectionne à la place : exposition au marché 0.66, 447 trades, Sharpe annualisé hors échantillon 1.77. Ce est un point de grille en dessous du véritable optimum , donc il récupère un seuil quasi optimal et bien exposé plutôt que de tomber en plein dans le mille — son Sharpe hors échantillon sur un seul seed (1.77) coïncide par hasard avec l'optimum de population. Mêmes données, même recherche, mêmes 80 seuils candidats. Seule la définition de "meilleur" a changé, et cela a déplacé le gagnant d'un mirage flat à huit trades vers l'edge réel et bien exposé — qui est, révélateur, exactement le même seuil que choisit le simple Sharpe pleine timeline sur ce seed.
Une mise en garde que le balayage rend explicite : conf_k seul ne suffit pas sur ce marché. À sans plancher, la dégénérescence reste à 22.5% à travers les seeds — et sur le seed 6 en particulier, conf_k seul choisit , 35 trades, un Sharpe hors échantillon de −0.06. Trente-cinq trades survivent à un shrinkage de avec assez de score restant pour gagner. Le plancher d'exposition est ce qui referme ce dernier écart, car il cible directement la véritable signature du piège — être flat — plutôt que de faire confiance au nombre de trades comme proxy.
Acte 6 — La leçon la plus profonde : mesurer sur toute la timeline

Prenez du recul par rapport à la réparation et remarquez ce qui a réellement séparé les objectifs sûrs du piège. Ce n'était pas la sophistication. Le PnL brut et le Sharpe pleine timeline sont plus simples que le Sharpe par trade, et ils n'ont jamais dégénéré — 0% sur 600 seeds — sans plancher, sans shrinkage, sans aucun réglage.
La ligne de partage est une propriété unique : quelle fenêtre la métrique mesure-t-elle ? Le Sharpe par trade ne mesure que les barres sur lesquelles la stratégie a choisi de se tenir — une fenêtre auto-sélectionnée que la recherche peut réduire à volonté. Le Sharpe pleine timeline et le PnL total mesurent l'ensemble de la timeline, barres flat incluses. Et on ne peut pas rendre grande une métrique pleine timeline en tradant rarement, car chaque heure passée flat est une heure au dénominateur qui ne gagne rien. Le plancher d'exposition et conf_k sont, au final, juste des moyens de réparer la métrique par trade avec la conscience d'exposition que les métriques pleine timeline ont gratuitement — et le balayage nous a déjà dit le plafond de cette réparation : au mieux, elle égale le Sharpe pleine timeline (OOS 1.70 contre 1.71), jamais elle ne le dépasse. Si vous êtes libre de choisir la fenêtre, choisissez toute la timeline et sautez la réparation entièrement.
Donc le principe de conception, énoncé clairement :
Concevez l'objectif de sorte qu'il ne puisse pas être trompé par des trades rares et chanceux. Vous avez trois outils, dans un ordre de préférence approximatif :
- Mesurez sur la timeline complète. Le défaut dont on ne devrait presque jamais s'écarter. Le Sharpe pleine timeline et le rendement total sont conscients de l'exposition par construction — l'inactivité est automatiquement pénalisée car les barres flat comptent. Si vous vous surprenez à rapporter une métrique calculée sur "seulement les barres où nous étions actifs", arrêtez-vous et demandez-vous ce que la recherche fera de la liberté de choisir ces barres.
- Exigez de l'exposition. Si vous devez utiliser une métrique conditionnée à l'activité, plafonnez l'exposition pour que la recherche ne puisse pas sélectionner une stratégie qui trade à peine. C'est le levier individuel le plus fort contre ce piège spécifique.
- Réduisez par le nombre de trades. Décomptez tout ratio par de sorte qu'un Sharpe reposant sur une poignée d'observations ne gagne qu'une fraction du crédit d'un Sharpe reposant sur des milliers. C'est l'application au niveau de l'objectif de la Minimum Track Record Length : un chiffre issu de peu d'observations est peu fiable (Acte 4), donc un objectif honnête intègre cette non-fiabilité au lieu de faire confiance à un humain pour la remarquer plus tard.
Rien de tout cela ne rend la recherche plus intelligente. Cela rend la cible honnête, de sorte que lorsque la recherche fait exactement ce qu'elle fait toujours — trouver le maximum — ce maximum est une stratégie que vous voulez réellement.
Notes d'honnêteté
Trois mises en garde, énoncées clairement, car une étude contrôlée ne mérite ses conclusions qu'en nommant ses limites.
- Le marché est synthétique, et délibérément. Un signal normal standard, un edge linéaire confiné à , un bruit Student-() à queues épaisses — choisis pour une vérité terrain contrôlée, pas pour le réalisme du marché. Nous ne pouvons prouver qu'un objectif choisit la mauvaise stratégie qu'en l'exécutant sur des données où nous savons quelle stratégie est correcte. Les marchés réels sont non stationnaires, autocorrélés et changeants de régime. Les queues épaisses sont un ingrédient réaliste que nous avons conservé, mais — contrairement à une première intuition naturelle, et contrairement à un brouillon antérieur de cet article même — elles ne sont pas ce qui alimente le piège : un contrôle à bruit gaussien (300 seeds) dégénère 55.7% du temps contre 57.0% ici, avec un Sharpe hors échantillon de 0.71 contre 0.70. Le piège est un artefact de petit échantillon plus sélection qui survit avec ou sans queues lourdes. Le livrable est le diagnostic et le schéma de réparation, pas une stratégie ni une constante universelle.
- Les valeurs de réparation dépendent de l'échelle. Le plancher spécifique et le shrinkage qui referment entièrement le piège sont ajustés à ce processus générateur de données — ses fréquences de trade, son épaisseur de queue, la taille de son edge. Sur d'autres données, le plateau se déplace. Ce qui se transfère, c'est la forme de la surface de balayage (élévation monotone dans les deux boutons, dégénérescence vers zéro, un plateau à la vérité) et la méthode pour trouver vos propres coordonnées : balayez les deux et lisez la surface, ne copiez pas les chiffres.
- conf_k est notre construction, pas un estimateur nommé. Le shrinkage par nombre de trades est un dispositif bayésien pondéré par précision / de type empirique-bayésien que nous avons construit pour ce problème ; sa justification s'appuie sur le résultat vérifié de l'erreur standard de Lo/Mertens et sur le MinTRL de Bailey–López de Prado, et son parent nommé le plus proche est le System Quality Number de van Tharp (, une forme fonctionnelle différente), mais nous n'affirmons pas que lui-même apparaît sous un nom dans la littérature. Ses remèdes compagnons — le plancher d'exposition, la mesure pleine timeline — sont des pratiques standard énoncées avec précision. Et notez quels objectifs étaient déjà sûrs ici : le PnL brut et le Sharpe pleine timeline n'ont jamais eu besoin de réparation, car ils sont conscients de l'exposition dès le départ — au point que plafonner le Sharpe pleine timeline se réduit au Sharpe pleine timeline, son gagnant dépassant déjà tout plancher raisonnable. Le piège est spécifiquement le Sharpe par trade / actif — et même l'objectif par trade entièrement réparé ne fait qu'égaler le Sharpe pleine timeline (OOS 1.70 contre 1.71), jamais le dépasser. La leçon principale n'est pas la réparation ; c'est de mesurer sur la timeline complète dès le départ.
Points clés à retenir
- L'objectif est la décision, pas une formalité. Une recherche ne trouve pas "une bonne stratégie" — elle trouve le maximiseur de quel que soit le scalaire que vous lui avez donné, et différents scalaires sélectionnent des stratégies radicalement différentes sur des données identiques. Choisir l'objectif, c'est choisir la stratégie ; tout ce qui suit en aval n'est que comptabilité. C'est la loi de Goodhart : au moment où votre métrique devient la cible de la recherche, la recherche exploitera chaque écart entre elle et ce que vous vouliez dire.
- Le Sharpe par trade est un piège. Mesuré uniquement sur les barres qu'une stratégie trade, il est maximisé en tradant aussi rarement que possible — moins d'observations, plus il est facile qu'un couple de mouvements chanceux gonflent le ratio (un contrôle gaussien confirme que les queues épaisses ne sont pas requises ; c'est un effet de petit échantillon plus sélection). Sur 600 seeds, il choisit une loterie à moins de 5% d'exposition dans 56% d'entre eux et dégénère dans 57% ; le choix dégénéré typique a en moyenne un Sharpe par trade in-sample de 4.58. Sur un seed délibérément extrême, il a couronné une stratégie à huit trades, 0.4% d'exposition, avec un Sharpe par trade in-sample de 21.09 s'effondrant à un Sharpe hors échantillon pleine timeline de 0.13. Un ratio construit sur huit observations a une erreur standard de l'ordre de ±7.7 annualisé (Acte 4) — il n'a jamais été de l'information.
- Les objectifs conscients de l'exposition sont naturellement sûrs. Le PnL brut et le Sharpe pleine timeline n'ont jamais dégénéré (0%), car ils mesurent l'ensemble de la timeline et l'inactivité est automatiquement pénalisée. On ne peut pas tricher avec une métrique pleine timeline en tradant rarement. Le seul défaut du PnL brut est le biais opposé — il sur-expose (exposition moyenne 0.859, OOS 1.61 contre le vrai 1.77), dérivant au-delà de l'optimum pour être davantage dans le marché.
- Les réparations fonctionnent — mais elles ne font que vous ramener au Sharpe pleine timeline. Un plancher d'exposition et un shrinkage par nombre de trades (conf_k) élèvent chacun indépendamment le Sharpe hors échantillon et poussent la dégénérescence vers zéro ; ensemble, ils atteignent un plateau. Mais ce plateau est le Sharpe pleine timeline : la dégénérescence tombe de 59.5% à à 0% à , et le Sharpe OOS grimpe de 0.66 à 1.71 — exactement le chiffre que le simple Sharpe complet affiche sans aide, et l'objectif robuste entièrement réparé atterrit en fait un cheveu en dessous (OOS 1.70, 0.17% de dégénérescence : faiblement dominé). Sur le seed 6, l'objectif robuste récupère un seuil quasi optimal et bien exposé (, un point de grille sous le véritable ; 447 trades ; Sharpe OOS 1.77). Traitez conf_k comme un filet de sécurité pour quand une métrique par trade vous est imposée, pas comme une amélioration par rapport à la mesure de la timeline complète. Les coordonnées exactes dépendent de l'échelle ; la forme de la surface est le résultat transférable.
- Concevez l'objectif de sorte qu'il ne puisse pas être trompé par des trades rares et chanceux. Par ordre de préférence : mesurer sur la timeline complète (par défaut), exiger de l'exposition (levier individuel le plus fort), réduire par le nombre de trades (Minimum Track Record Length au niveau de l'objectif). Rien de tout cela ne rend la recherche plus intelligente — cela rend la cible honnête, de sorte que le maximum que la recherche trouve inévitablement soit une stratégie que vous tradiez réellement.
Une recherche de paramètres est un génie obéissant. Il exauce exactement le vœu que vous formulez, pas celui que vous vouliez dire — et "maximise cette métrique" est le vœu. Formulez-le comme un Sharpe par trade et il conjurera huit trades chanceux et les appellera une fortune. Formulez-le de sorte qu'être flat soit puni et qu'une poignée de trades ne gagne qu'une poignée de crédit, et le même génie, sur les mêmes données, vous remet l'edge réel. La stratégie que vous déployez a été choisie au moment où vous avez tapé l'objectif. Choisissez-la délibérément.
L'expérience complète — le marché synthétique, les six objectifs, le Monte Carlo à 600 seeds, et la surface de balayage de réparation, chaque chiffre régénérable depuis un script déterministe — se trouve dans le paper compagnon sur objective-design.marketmaker.cc, avec le code et les données sur github.com/suenot/objective-design-degeneracy.
C'est un front de la même guerre que nos autres études mènent sous des angles différents. Le Deflated Sharpe Ratio évalue le gagnant d'une recherche après tests multiples — là où cet article demande si l'objectif a choisi la bonne stratégie en premier lieu, le DSR demande si la stratégie choisie bat ce que la chance seule produirait. L'étude à venir sur la probabilité de surajustement du backtest attaque le même biais de sélection du côté du rééchantillonnage, notant la procédure plutôt que le gagnant. Et la taxonomie du look-ahead bias répertorie l'autre grand fabricant de faux Sharpe — une fuite depuis le futur — qui produit le symptôme identique (un backtest glorieux qui meurt en direct) via un mécanisme entièrement différent. Conception d'objectif, déflation, probabilité de surajustement, look-ahead : quatre noms pour une seule discipline — ne pas se laisser tromper par son propre backtest.
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.