← Terug naar artikelen
June 28, 2026
5 min leestijd

Objective-Function Design: de metriek die je optimaliseert kiest stiekem je strategie

#algotrading
#backtest
#overfitting
#objective-function
#optimization
#sharpe
#validation
🎯
Part 1 of 9 · Collection
Backtesting Without Fooling Yourself

Onderdeel van de serie "Backtests zonder illusies".

📄 Dit artikel is uitgegroeid tot een onderzoekspaper. Elk getal hieronder komt uit één deterministisch script dat een gecontroleerde grondwaarheid opbouwt — een synthetische markt met een bekende edge in een gematigde signaalband en fat-tailed ruis overal — en vervolgens één drempelzoektocht uitvoert onder zes verschillende objective functions en, out of sample, meet welke strategie elke objective daadwerkelijk selecteert. Lees het paper online (interactieve versie + PDF) op objective-design.marketmaker.cc, code en data op github.com/suenot/objective-design-degeneracy.

Je wilt de beste strategie. Dus voer je een zoektocht uit — je sweept een drempel, een lookback, een stopafstand, en houdt de instelling met de hoogste score. De zoektocht eindigt en levert je een winnaar op. Redelijk. Standaard. Het is wat elke optimizer, grid search en hyperparameter-tuner ter wereld doet.

Maar kijk naar het werkwoord: hoogste score. Hoogst op wat? Voordat de zoektocht iets kan kronen, moest je het één getal geven om te maximaliseren — een objective function. PnL. Sharpe. Sharpe op de bars die je hebt verhandeld. Return-over-max-drawdown. Je typte er één in, waarschijnlijk zonder er veel over na te denken, en toen besteedde de zoektocht een miljoen evaluaties aan precies datgene wat je had gevraagd.

Die ene keuze is geen formaliteit. Het is de hele beslissing. De zoektocht vindt niet "een goede strategie" — zoiets bestaat niet in abstracte zin. Hij vindt de strategie die de scalair maximaliseert die jij hebt gekozen, en verschillende scalairs wijzen naar compleet andere strategieën op dezelfde data. De objective is de geheime hand aan het stuur, en meestal kijkt niemand ernaar.

Hier is het hele artikel in één tabel. Eén drempelzoektocht, één synthetische markt met een echte, bekende edge, zes objectives — en de zes strategieën die ze selecteren, gemeten op achtergehouden data:

Objective (wat de zoektocht maximaliseert) Gemiddelde marktexposure In-sample Sharpe Out-of-sample Sharpe Gedegenereerde winnaars
Raw PnL 0.859 1.76 1.61 0%
Full-Timeline Sharpe 0.740 1.82 1.71 0%
Per-Trade ("actieve") Sharpe 0.286 1.00 0.70 57%
Exposure floor (emin=0.20e_{\min}=0.20) 0.740 1.82 1.71 0%
Trade-count shrinkage (conf_k=40=40) 0.523 1.54 1.31 20.7%
Robuust (floor + conf_k) 0.675 1.78 1.70 0.2%

600 onafhankelijke seeds, T=2000T = 2000 bars per stuk, 80 kandidaat-drempels per zoektocht, in-sample en out-of-sample onafhankelijk getrokken. Geannualiseerde Sharpe (252 periodes/jaar). "Gedegenereerd" = de geselecteerde winnaar is minder dan 5% van de tijd in de markt, of behaalt een niet-positieve out-of-sample Sharpe. Het werkelijke optimum van deze markt is een geannualiseerde out-of-sample Sharpe van 1.77.

Lees de derde rij tot het steekt. De per-trade Sharpe — een vertegenwoordiger van de hele familie activiteit-conditionele metrieken (per-trade Sharpe, expectancy, van Tharp's SQN, win rate), allemaal berekend op alleen de verhandelde bars — selecteert een strategie die out of sample slechter is dan de helft van de andere, en doet dat in 57% van de gevallen op gedegenereerde wijze. Het is geen subtiel slechtere objective. Op deze data is het een val, en de zoektocht loopt er meer dan de helft van de tijd in. Lees nu de rij er direct boven: gewone full-timeline Sharpe degenereert nooit en scoort out of sample 1.71. Dat is de clou van de hele reparatie, vroeg verklapt — de eerlijke oplossing is simpelweg meten over de volledige tijdlijn; de geavanceerdere lapmiddelen in de onderste rijen evenaren, op hun best, alleen dat getal, en overtreffen het nooit. Dit artikel is de anatomie van die val en de reparatie ervan, met de grondwaarheid steeds bekend, zodat "koos de objective de juiste strategie?" een feit is, geen mening.

Akte 1 — De geheime beslissing: de wet van Goodhart is de zoektocht

A parameter search drawn as a funnel of many candidate strategy curves, with a single lens labeled OBJECTIVE stamping one curve as the winner while identical-looking curves are discarded, illustrating that the choice of metric silently selects the strategy

In 1975 schreef econoom Charles Goodhart een zin die alles wat hij verder deed heeft overleefd:

"Any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes."

De populaire parafrase, meestal toegeschreven aan Marilyn Strathern, is scherper: wanneer een maatstaf een doel wordt, houdt hij op een goede maatstaf te zijn.

Een parameterzoektocht is het zuiverste mogelijke voorbeeld van de wet van Goodhart. De objective function is de maatstaf. De zoektocht is de druk — duizenden, miljoenen pogingen om die maatstaf zo hoog mogelijk te duwen. En het maakt de zoektocht geen fluit uit wat jij met die maatstaf bedoelde. Het gaat alleen om het getal. Als er een manier is om het getal groot te maken die niets te maken heeft met een echte, verhandelbare edge — zelden handelen, meestal plat blijven zitten, een paar gelukkige uitschieters vangen — dan zal de zoektocht die manier vinden, want het vinden van het maximum is het enige waarvoor hij gebouwd is.

Dit is hetzelfde falen dat de AI-veiligheidsliteratuur reward hacking noemt: een agent die een proxy optimaliseert voor wat jij wilt, zal elk gat tussen de proxy en het doel uitbuiten. Jouw zoektocht is die agent. "Sharpe ratio" is die proxy. "Een strategie die ik kan vertrouwen om volgend kwartaal echt geld mee te verhandelen" is het doel. De kloof daartussen is waar de hele discipline zich bevindt.

Om te zien hoe die kloof zich opent, hebben we een wereld nodig waarin we de waarheid kennen. Dus bouwen we er een.

De markt. Elke periode arriveert een predictor sts_t (een standaard-normaal signaal), gevolgd door het rendement rtr_t dat hij deels voorspelt. De edge is echt maar begrensd — hij bestaat alleen binnen een gematigde signaalband st1|s_t| \le 1 en verdwijnt daarbuiten:

rt=βst1[st1]+εt,β=0.3,εtt4 (unit variance).r_t = \beta\, s_t \cdot \mathbf{1}\big[\,|s_t| \le 1\,\big] + \varepsilon_t, \qquad \beta = 0.3, \qquad \varepsilon_t \sim t_{4}\ (\text{unit variance}).

Twee ontwerpkeuzes zijn belangrijk. Ten eerste zit de edge in de gematigde band: extreme signalen dragen geen voorspellende informatie, dus een strategie moet het midden verhandelen en de staarten overslaan. Ten tweede is de ruis εt\varepsilon_t fat-tailed (Student-tt met 4 vrijheidsgraden, het soort zware staart dat echte rendementen daadwerkelijk hebben) — maar dit ingrediënt dient hier voor realisme, niet voor mechanisme. Het is verleidelijk te zeggen dat de fat tails datgene zijn wat de val mogelijk maakt, en dat namen we precies zo aan totdat we de controle draaiden: een Gaussiaanse-ruisversie van deze markt (gaussian_control in de resultaten, 300 seeds) reproduceert de val vrijwel ongewijzigd — de per-trade objective degenereert onder Gaussiaanse ruis nog steeds 55.7% van de tijd tegenover 57.0% met fat tails, en de out-of-sample Sharpe is 0.71 tegenover 0.70. De val gaat dus niet over fat tails. Het is een puur klein-sample-plus-selectie-effect: neem het maximum, over ~20 low-exposure drempels, van een Sharpe berekend op een handvol observaties, en een of ander geluksmoment zal er altijd spectaculair uitzien. Elke ruisverdeling doet dit; een strategie die maar een paar bars in de markt is, kan door pure mazzel een paar gunstige bewegingen meemaken en een in-sample getal posten dat niets betekent. We houden de fat tails omdat echte rendementen ze hebben, niet omdat de val ze nodig heeft.

De strategie. Een familie met één parameter. Handel in de richting van het signaal wanneer de omvang ervan onder een drempel θ\theta ligt, anders blijf plat:

post=sign(st)1[stθ].\text{pos}_t = \operatorname{sign}(s_t)\cdot \mathbf{1}\big[\,|s_t| \le \theta\,\big].

Een piepklein θ\theta handelt alleen op de kleinste, meest onopvallende signalen — een loterij met zeldzame trades, bijna nooit in de markt. Een θ\theta dicht bij de bandrand vangt de hele echte edge en is goed geëxposeerd. Een enorme θ\theta verhandelt alles, inclusief de out-of-band bars die geen edge dragen en alleen ruis toevoegen.

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())

Omdat we de markt zelf hebben gebouwd, kunnen we de waarheid direct berekenen — gemiddelde prestatie bij elke drempel over alle 600 seeds, out of sample. Het werkelijke optimum ligt bij θ1.04\theta \approx 1.04: precies aan de rand van de signaalband, ongeveer 70% van de tijd in de markt (afgeleid: een standaard-normaal signaal valt binnen s1.04|s|\le 1.04 met kans P(s1.04)=0.70P(|s|\le 1.04)=0.70), met een geannualiseerde out-of-sample Sharpe van 1.77. Dat is het getal dat elke objective probeert te vinden. Houd het in gedachten: θ≈1.04, OOS Sharpe 1.77, ongeveer 70% van de tijdlijn in de markt. Alles wat een objective selecteert dat ver hiervandaan ligt, is een falen van de objective, niet een moeilijke markt.

Akte 2 — De val: acht gelukkige trades, een Sharpe van 21, een fata morgana

A slot machine paying out on a single lucky spin, showing eight trade tickets and a towering in-sample per-trade Sharpe of 21 that collapses to 0.13 out of sample, dramatizing a rare-trade lottery winner selected by a naive objective

Laten we nu een naïeve objective loslaten op één concrete trekking van deze markt — seed 6. Volledige openheid over de seed: het was niet de eerste trekking of een willekeurige. We scanden seeds op zoek naar een schril gedegenereerde per-trade winnaar en kozen deze, precies zodat het mechanisme onmogelijk te missen is. De uitkomst die het toont is volstrekt typisch — zoals Akte 3 zal bevestigen, kiest de per-trade objective in 56% van alle seeds een loterij met minder dan 5% exposure — maar de omvang van seed 6 ligt aan het extreme uiteinde van die verdeling. Lees het als een bijzonder schril voorbeeld van een veelvoorkomend falen, niet als een mediaan. We optimaliseren de per-trade Sharpe: de Sharpe ratio berekend op alleen de bars waarin de strategie daadwerkelijk een positie heeft. Dit is iets extreem natuurlijks om te rapporteren. "Als hij handelt, hoe goed zijn zijn trades dan?" Het voelt alsof het skill isoleert van inactiviteit. Het doet het tegenovergestelde.

Hier is de strategie die de per-trade Sharpe kroont op seed 6:

  • Drempel θ=0.005\theta = 0.005 — hij handelt alleen op de allerkleinste signalen.
  • Marktexposure 0.4% — plat 99.6% van de tijd.
  • Acht trades. Acht. Over 2000 bars.
  • In-sample per-trade geannualiseerde Sharpe: 21.09.
  • In-sample full-timeline Sharpe: 0.82.
  • Out-of-sample full-timeline Sharpe: 0.13.

De per-trade metriek leest 21.09 — een getal dat geen echte strategie ooit heeft gehaald, het soort cijfer dat een fonds zou lanceren. En het is een complete fata morgana. Die acht trades vingen toevallig een paar gunstige bewegingen op; gemeten over alleen die acht bars is de verhouding tussen gemiddelde en standaarddeviatie astronomisch. Maar op de volledige tijdlijn — waar de strategie 99.6% van de tijd plat is — draagt die "edge" vrijwel niets bij: een full-timeline Sharpe van 0.82 in-sample, die instort tot 0.13 op verse data. De winnaar die de objective selecteerde, is voor alle handelsdoeleinden plat.

En het is niet eens een echte edge bij die drempel. Herinner je de markt: de edge zit in de band s1|s|\le 1, en θ=0.005\theta = 0.005 ligt precies in het dode midden waar het signaal het zwakst is. De ware out-of-sample curve bij θ=0.005\theta = 0.005 is −0.01 — niet te onderscheiden van nul (afgeleid uit de grondwaarheidscurve). De zoektocht vond geen kleine echte edge. Hij vond acht gelukkige trekkingen van ruis en rapporteerde ze als een Sharpe van 21.

Dit is de val in miniatuur: de per-trade Sharpe beloont de strategie voor zo zelden mogelijk handelen, omdat hoe minder bars je vasthoudt, hoe makkelijker het is dat een paar ervan mazzel hebben, en de metriek vraagt nooit "maar was je eigenlijk wel in de markt?" De omvang van seed 6 is uitgekozen — we zochten opzettelijk naar een schrille — maar de soort is dat niet. Over alle 600 seeds selecteert de per-trade Sharpe in 57% ervan een gedegenereerde winnaar (een die nauwelijks handelt, of verliest out of sample), en specifiek een loterij met minder dan 5% exposure in 56%. De typische gedegenereerde keuze is veel milder dan de Sharpe van 21 van seed 6: gemiddeld over alle 600 seeds heeft de winnaar van de per-trade objective een in-sample per-trade Sharpe van 4.58 en een gemiddelde exposure van 0.286 — nog steeds meestal plat, alleen niet 99.6% plat. Seed 6 dramatiseert het mechanisme; de 56% is het deel dat je zorgen zou moeten baren. Meer dan de helft van de tijd geeft deze alledaagse metriek je een lot en noemt het een strategie.

Akte 3 — De statistische waarheid: zes objectives, 600 seeds

Six objective functions as contestants on a leaderboard, the per-trade Sharpe glowing brightest in sample but stamped degenerate 57 percent while the exposure-aware objectives hold steady out of sample, illustrating that a great in-sample number does not mean a good selection

Eén seed bewijst niets; het illustreert alleen. Om een objective te meten moeten we vragen wat hij gemiddeld selecteert, over vele onafhankelijke markten, en die selectie scoren op data die de zoektocht nooit heeft gezien. Dus: 600 seeds, elk een onafhankelijke trekking van de markt; op elk voeren we de 80-drempel zoektocht uit onder elke objective; we noteren de exposure, de in-sample en out-of-sample Sharpe van wat er gekozen werd, en of die keuze gedegenereerd was.

Objective Gemiddelde exposure In-sample Sharpe Out-of-sample Sharpe IS→OOS-daling (abs.) Gedegenereerd
Raw PnL 0.859 1.76 1.61 0.15 0.0%
Full-Timeline Sharpe 0.740 1.82 1.71 0.11 0.0%
Per-Trade Sharpe 0.286 1.00 0.70 0.30 57%
Exposure floor (emin=0.20e_{\min}=0.20) 0.740 1.82 1.71 0.11 0.0%
conf_k shrinkage (k=40k=40) 0.523 1.54 1.31 0.23 20.7%
Robuust (floor + conf_k) 0.675 1.78 1.70 0.08 0.2%

De kolom "IS→OOS-daling" is de absolute daling in geannualiseerde Sharpe van in-sample naar out-of-sample (bijvoorbeeld 1.000.701.00\to0.70 is een daling van 0.30), geen percentage. En merk op dat de rij "Exposure floor" byte-voor-byte identiek is aan "Full-Timeline Sharpe": dat is geen toeval, en Akte 5 legt uit waarom.

Drie feiten springen eruit, en elk is een les.

De per-trade Sharpe is de enige naïeve objective die degenereert. Zijn gemiddelde exposure is 0.286 — hij selecteert strategieën die meestal plat zijn — en zijn in-sample Sharpe van 1.00 daalt met 0.30 naar een out-of-sample 0.70, de slechtste van het veld. Let op het teken: zijn in-sample getal (1.00) is zelfs niet indrukwekkend, maar op elke individuele seed rapporteert hij vrolijk een per-trade cijfer van 21. Het gemiddelde vervaagt omdat de gelukkige vensters willekeurige richtingen op wijzen; wat overblijft tot out-of-sample is slechts 0.70, en 57% van de individuele selecties is ronduit waardeloos.

Exposure-bewuste objectives zijn van nature veilig. Raw PnL en full-timeline Sharpe degenereren nooit (0.0%). De reden is structureel: beide worden gemeten over de hele tijdlijn, dus een strategie die 99.6% van de tijd plat is, verdient bijna niets onder deze metrieken. Je kunt een full-timeline metriek niet manipuleren door zelden te handelen — plat blijven wordt direct en automatisch bestraft, omdat platte bars in de noemer zitten. Dit is het belangrijkste idee van het artikel, en we komen erop terug in Akte 6.

Raw PnL is veilig maar niet optimaal — het over-exposeert. Kijk goed: de gemiddelde exposure van raw PnL is 0.859, de hoogste van allemaal, en zijn out-of-sample Sharpe (1.61) ligt een tikje onder de full-timeline Sharpe (1.71) en het werkelijke optimum (1.77). PnL beloont in de markt zijn, dus duwt de zoektocht θ\theta te hoog (op seed 6 kiest raw PnL θ=1.84\theta=1.84 tegenover het optimale 1.04), waardoor out-of-band bars worden binnengehaald die geen edge dragen en alleen ruis toevoegen. Het ontploft niet — maar het drijft voorbij het echte optimum in de tegenovergestelde richting van de per-trade val. Andere objective, andere bias, dezelfde les: de metriek koos de strategie.

De twee rijen die we nog niet hebben besproken — de exposure floor en conf_k — zijn de reparatie. Dat is de volgende akte.

Akte 4 — Waarom acht trades nooit vertrouwd kunnen worden

A single Sharpe point estimate marked with an enormous confidence-interval error bar because it rests on only eight observations, beside a ruler labeled minimum track record length, illustrating that a ratio measured on a handful of trades is statistically meaningless

Voordat we de val repareren, loont het te preciseren waarom acht trades een Sharpe van 21 opleveren die niets betekent — want de oplossing volgt rechtstreeks uit die reden.

Een Sharpe ratio is een schatting, en schattingen hebben foutmarges. Andrew Lo's resultaat uit 2002 geeft de standaardfout van een Sharpe ratio geschat uit TT observaties, onder de meest genereuze mogelijke aanname (IID Gaussiaanse rendementen):

SE(SR^)1+SR^2/2T.\operatorname{SE}\big(\widehat{SR}\big) \approx \sqrt{\frac{1 + \widehat{SR}^{\,2}/2}{T}}.

De fout krimpt alleen als 1/T1/\sqrt{T}. Voeden we hem met de val. De per-trade Sharpe op seed 6 is 21.0921.09 geannualiseerd, wat 1.331.33 per observatie is, berekend op T=8T = 8 bars. De standaardfout is

SE1+1.332/280.49 per observatie = 7.7 geannualiseerd\operatorname{SE} \approx \sqrt{\frac{1 + 1.33^2/2}{8}} \approx 0.49 \ \text{per observatie} \ = \ \textbf{7.7 geannualiseerd}

(afgeleid uit Lo's formule). De puntschatting is 21.0921.09; de foutmarge van één sigma is van de orde ±7.7\pm 7.7 — lees dit als een illustratieve grootteorde, niet als een gekalibreerd betrouwbaarheidsinterval, aangezien de formule IID Gaussiaanse rendementen aanneemt die onze fat-tailed t4t_4-ruis schendt. Toch is de boodschap onmiskenbaar: de "Sharpe van 21" is een getal getrokken uit een verdeling die zo breed is dat hij vrijwel geen informatie draagt — en dat is de coulante berekening, want Mertens' uitbreiding toont aan dat fat tails en skew de standaardfout alleen maar verder opblazen. De Sharpe van een backtest met zeldzame trades is minder betrouwbaar dan zijn puntwaarde, in elke richting tegelijk: te weinig observaties, en de verkeerde verdeling.

Dit is precies wat de Minimum Track Record Length formaliseert (Bailey & López de Prado, 2012). Het draait de vraag om — hoeveel observaties heb ik nodig voordat ik een Sharpe van deze omvang mag geloven bij zekerheid pp?

MinTRL=1+[1γ^3SR^+γ^414SR^2](Z1pSR^SR)2,\text{MinTRL} = 1 + \Big[\,1 - \hat\gamma_3\,\widehat{SR} + \tfrac{\hat\gamma_4 - 1}{4}\,\widehat{SR}^{\,2}\,\Big]\left(\frac{Z_{1-p}}{\widehat{SR} - SR^*}\right)^{2},

waarmee "vertrouw backtests met weinig trades minder" wordt omgezet in een expliciet, controleerbaar aantal trades. Het diepere punt voor objective design is dit: een goede objective zou van binnenuit een minimale track record moeten afdwingen, in plaats van een mens achteraf te laten opmerken dat de winnaar op acht observaties rust. De per-trade Sharpe doet het tegenovergestelde — hij wordt gemaximaliseerd door het aantal observaties richting het minimum te drijven. Elke objective waarvan het optimum ligt bij "zo min mogelijk trades" is, door constructie, een objective die zijn eigen minst betrouwbare schatting opzoekt.

Twee fouten versterken elkaar in de val, en beide benoemen vertelt ons hoe we het moeten oplossen. Ten eerste, kleine-sample-ruis: acht observaties kunnen geen enkele ratio vastpinnen. Ten tweede, selectie: die acht bars werden ons niet zomaar gegeven — de zoektocht koos de drempel die erop uitkwam, deels omdat ze geluk hadden. De zoektocht is een maximizer; hij zal altijd de hoek van de ruimte vinden waar ruis toevallig op signaal lijkt. Dit kan je niet uitslimmen met een betere puntschatting. Je moet veranderen wat "beste" betekent, zodat de gelukkige hoek niet het maximum is.

Akte 5 — De reparatie: een exposure floor en een trade-count shrinkage

A control panel with two knobs labeled exposure floor and conf_k shrinkage, both lifting an out-of-sample performance surface up onto a high flat plateau while a degeneracy indicator goes dark, illustrating two independent fixes that together recover the true optimum

We hebben twee benoemde kwalen — handelt te zelden en rust op te weinig observaties — dus schrijven we twee remedies, elk gericht op één ervan.

Remedie 1: een exposure floor. De simpelst mogelijke oplossing. Wijs elke strategie die niet minstens emine_{\min} van de tijd in de markt is, ronduit af — als hij nauwelijks handelt, is zijn score -\infty en kan de zoektocht hem niet selecteren. Maar er zit een eerlijke subtiliteit in wat je begrenst, en dat is de stille les van dit hele artikel. Als op zichzelf staande objective hebben we full-timeline Sharpe begrensd, en op deze markt verandert dat helemaal niets: de eigen winnaar van full-timeline Sharpe zit al op ~74% exposure, dus een 20%-vloer treedt nooit in werking. Precies daarom zijn de rijen "exposure floor" en "full-timeline Sharpe" in de bovenstaande tabellen byte-voor-byte identiek — een vloer vastschroeven aan een al veilige metriek betekent simpelweg de volledige Sharpe opnieuw afleiden. De vloer verricht alleen zichtbaar werk wanneer hij een metriek bewaakt die anders naar de hoek zou sprinten: een per-trade metriek, zoals in de robuuste objective hieronder. Met andere woorden, "exposure eisen" en "meten over de volledige tijdlijn" zijn, op deze data, twee namen voor dezelfde interventie.

Remedie 2: een trade-count shrinkage — "conf_k". Voor wanneer je vastzit met een per-trade metriek en een zachte correctie wilt in plaats van een harde afkap: verdisconteer de Sharpe continu naar gelang op hoeveel trades hij rust. Vermenigvuldig met n/(n+k)n/(n+k), waarbij nn het aantal trades is en kk een vaste "vertrouwensconstante" — een aan trades gelijkwaardige priorsterkte gekozen vóór de zoektocht:

score(θ)=SR^(θ)n(θ)n(θ)+k.\text{score}(\theta) = \widehat{SR}(\theta)\cdot \frac{n(\theta)}{n(\theta) + k}.

Als n0n \to 0 wordt de score naar nul gedrukt, ongeacht hoe groot de ruwe Sharpe is; als nn \to \infty convergeert de score naar de ruwe Sharpe. Dit is dezelfde correctieve logica als MinTRL en de standaardfout van Akte 4 — een kleine-sample-schatting naar nul krimpen als een afnemende functie van zijn steekproefomvang — direct in de objective gevouwen in plaats van toegepast als een achteraf-filter. Het dichtstbijzijnde benoemde precedent is van Tharp's System Quality Number (SQN=Ntrade/σtrade\text{SQN} = \sqrt{N}\cdot \overline{\text{trade}}/\sigma_{\text{trade}}), die eveneens een per-trade kwaliteitsmetriek laat schalen met het aantal trades NN — hoewel de functionele vorm verschilt (N\sqrt{N} groeit onbeperkt, terwijl n/(n+k)n/(n+k) verzadigt bij 1). Qua vorm is de onze een Bayesiaanse, precisie-gewogen / empirical-Bayes-achtige shrinkage; het is onze constructie voor dit probleem, geen benoemde schatter uit de literatuur.

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)

Nu het eerlijke gedeelte: hoeveel vloer, hoeveel shrinkage? Sweep beide en lees het hele oppervlak. Elke cel is de gemiddelde out-of-sample Sharpe over 200 seeds (een derde deelverzameling van de 600, om de tweedimensionale sweep betaalbaar te houden) met het degeneratiepercentage ernaast:

emine_{\min} \ conf_k k=0k=0 k=40k=40 k=80k=80
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%)

Gemiddelde geannualiseerde out-of-sample Sharpe, met het degeneratiepercentage tussen haakjes. De cel linksboven (0,0)(0,0) is de ruwe per-trade Sharpe — geen vloer, geen shrinkage: OOS 0.66, gedegenereerd 59.5%. Dat is dezelfde objective als de per-trade rij uit Akte 3, die 0.70 / 57% las; het kleine verschil komt puur door de seedset — deze sweep gebruikt 200 seeds, de Monte Carlo gebruikte alle 600. Dezelfde metriek, kleinere steekproef.

Het oppervlak vertelt een helder verhaal in drie lezingen.

Elke remedie werkt alleen. Beweeg naar rechts langs de bovenste rij (shrinkage toevoegen, geen vloer): OOS stijgt 0.661.261.470.66 \to 1.26 \to 1.47 en degeneratie daalt 59.5%22.5%11.5%59.5\% \to 22.5\% \to 11.5\%. Beweeg omlaag in de linkerkolom (vloer toevoegen, geen shrinkage): OOS stijgt 0.661.431.641.710.66 \to 1.43 \to 1.64 \to 1.71 en degeneratie daalt 59.5%10%1.5%0%59.5\% \to 10\% \to 1.5\% \to 0\%. Elke knop, alleen gedraaid, verhoogt onafhankelijk de out-of-sample prestatie en doodt de degeneratie. De exposure floor is hier de sterkste losse hendel, omdat hij het bepalende kenmerk van de val — bijna-nul exposure — frontaal aanpakt.

Samen bereiken ze het plateau — en het plateau is precies full-timeline Sharpe. Bij emin=0.20e_{\min} = 0.20 is de rij vlak op OOS 1.71 met 0% degeneratie over elk shrinkage-niveau; doorduwen naar emin=0.35e_{\min}=0.35 kruipt naar 1.73. Maar kijk goed naar wat die 1.71 is: het is exact de score die gewone full-timeline Sharpe post in Akte 3 zonder vloer en zonder enige shrinkage. In het beste geval overtreffen de lapmiddelen full-timeline Sharpe niet — ze reconstrueren het. En de volledig gerepareerde robuuste objective komt er zelfs niet helemaal: over alle 600 seeds landt hij op OOS 1.70 met een resterende degeneratie van 0.17%, net onder de 1.71 / 0% van volledige Sharpe — hij wordt zwak gedomineerd door de eenvoudigere metriek. Een bescheiden middeninstelling, emin=0.10e_{\min}=0.10 met k=40k=40, bereikt OOS 1.65 bij 1% degeneratie — handig als een per-trade metriek je opgedrongen wordt, maar nooit een reden om er een te verkiezen.

De exacte getallen zijn schaalafhankelijk — de vorm is het resultaat. De specifieke waarden emin=0.20e_{\min}=0.20, k=40k=40 die deze markt volledig repareren, zijn afgestemd op dit data-genererende proces; bij een andere markt met andere handelsfrequenties en staartdikte zit het plateau elders. Wat generaliseert, zijn niet de coördinaten maar het oppervlak: een monotone stijging in beide richtingen, degeneratie naar nul gedreven, een plateau bij de waarheid. Je vindt je eigen coördinaten door te sweepen, precies zoals hierboven.

Zet beide remedies samen — de robuuste objective, vloer 0.20 plus conf_k 40 — en keer terug naar seed 6. De val kroonde θ=0.005\theta = 0.005, acht trades, een full-timeline OOS Sharpe van 0.13. De robuuste objective selecteert in plaats daarvan θ=0.979\theta = 0.979: marktexposure 0.66, 447 trades, geannualiseerde out-of-sample Sharpe 1.77. Die θ=0.979\theta = 0.979 ligt één rasterpunt onder het werkelijke optimum θ=1.04\theta = 1.04, dus herstelt hij een bijna-optimale, goed geëxposeerde drempel in plaats van precies in de roos te schieten — zijn single-seed out-of-sample Sharpe (1.77) valt toevallig samen met het populatie-optimum. Dezelfde data, dezelfde zoektocht, dezelfde 80 kandidaat-drempels. Alleen de definitie van "beste" veranderde, en dat verplaatste de winnaar van een platte fata morgana met acht trades naar de echte, goed geëxposeerde edge — die, veelzeggend, precies dezelfde drempel is die gewone full-timeline Sharpe kiest op deze seed.

Eén waarschuwing die de sweep expliciet maakt: conf_k alleen is niet genoeg op deze markt. Bij k=40k=40 zonder vloer is de degeneratie nog steeds 22.5% over de seeds — en op seed 6 specifiek kiest conf_k alleen θ=0.015\theta = 0.015, 35 trades, een out-of-sample Sharpe van −0.06. Vijfendertig trades overleven een shrinkage van 35/(35+40)0.4735/(35+40) \approx 0.47 met genoeg overgebleven score om te winnen. De exposure floor is wat die laatste kloof dicht, omdat hij zich rechtstreeks richt op de werkelijke signatuur van de val — plat zijn — in plaats van te vertrouwen op het aantal trades als proxy ervoor.

Akte 6 — De diepere les: meet over de hele tijdlijn

Two ways of scoring the same strategy contrasted: a narrow spotlight illuminating only the few bars a strategy traded versus a floodlight measuring the entire timeline including the flat stretches, illustrating that exposure-aware objectives cannot be gamed by rare lucky trades

Stap terug van de reparatie en merk op wat de veilige objectives daadwerkelijk scheidde van de val. Het was geen verfijning. Raw PnL en full-timeline Sharpe zijn eenvoudiger dan de per-trade Sharpe, en ze degenereerden nooit — 0% over 600 seeds — zonder vloer, zonder shrinkage, zonder enige afstelling.

De scheidslijn is één eigenschap: welk venster meet de metriek? De per-trade Sharpe meet alleen de bars waarop de strategie besloot te staan — een zelf-geselecteerd venster dat de zoektocht naar believen kan verkleinen. Full-timeline Sharpe en totale PnL meten de hele tijdlijn, platte bars inbegrepen. En je kunt een full-timeline metriek niet groot maken door zelden te handelen, want elk uur dat je plat zit is een uur in de noemer dat niets verdient. De exposure floor en conf_k zijn, uiteindelijk, gewoon manieren om de per-trade metriek te retrofitten met het exposure-bewustzijn dat full-timeline metrieken gratis hebben — en de sweep vertelde ons al het plafond van die retrofit: op zijn best evenaart hij full-timeline Sharpe (OOS 1.70 tegen 1.71), nooit meer. Als je vrij bent om het venster te kiezen, kies dan de hele tijdlijn en sla de retrofit helemaal over.

Dus het ontwerpprincipe, helder gesteld:

Ontwerp de objective zo dat hij niet gemanipuleerd kan worden door zeldzame gelukkige trades. Je hebt drie hulpmiddelen, in ruwe volgorde van voorkeur:

  1. Meet over de volledige tijdlijn. De standaard waarvan je bijna nooit zou moeten afwijken. Full-timeline Sharpe en totaal rendement zijn door constructie exposure-bewust — inactiviteit wordt automatisch bestraft omdat platte bars meetellen. Als je jezelf betrapt op het rapporteren van een metriek berekend op "alleen de bars waarin we actief waren", stop dan en vraag je af wat de zoektocht zal doen met de vrijheid om die bars te kiezen.
  2. Eis exposure. Als je een activiteit-conditionele metriek moet gebruiken, begrens dan de exposure zodat de zoektocht geen strategie kan selecteren die nauwelijks handelt. Dit is de sterkste losse hendel tegen deze specifieke val.
  3. Krimp naar aantal trades. Verdisconteer elke ratio met n/(n+k)n/(n+k) zodat een Sharpe die op een handvol observaties rust slechts een fractie verdient van het krediet van een die op duizenden rust. Dit is de objective-niveau handhaving van de Minimum Track Record Length: een getal uit weinig observaties is onbetrouwbaar (Akte 4), dus een eerlijke objective prijst die onbetrouwbaarheid in in plaats van erop te vertrouwen dat een mens het later opmerkt.

Niets hiervan maakt de zoektocht slimmer. Het maakt het doel eerlijk, zodat wanneer de zoektocht precies doet wat hij altijd doet — het maximum vinden — dat maximum een strategie is die je daadwerkelijk wilt.

Eerlijkheidsopmerkingen

Drie kanttekeningen, helder gesteld, want een gecontroleerde studie verdient haar conclusies alleen door haar grenzen te benoemen.

  • De markt is synthetisch, en met opzet. Een standaard-normaal signaal, een lineaire edge beperkt tot s1|s|\le 1, fat-tailed Student-tt(44) ruis — gekozen voor gecontroleerde grondwaarheid, niet voor marktrealisme. We kunnen alleen bewijzen dat een objective de verkeerde strategie kiest door hem uit te voeren op data waar we weten welke strategie juist is. Echte markten zijn niet-stationair, autogecorreleerd en regimewisselend. De fat tails zijn een realistisch ingrediënt dat we hebben behouden, maar — in tegenstelling tot een natuurlijke eerste gok, en in tegenstelling tot een eerdere versie van dit artikel zelf — zijn ze niet wat de val aandrijft: een controle met Gaussiaanse ruis (300 seeds) degenereert 55.7% van de tijd tegenover 57.0% hier, met out-of-sample Sharpe 0.71 tegenover 0.70. De val is een klein-sample-plus-selectie-artefact dat overleeft met of zonder zware staarten. Het opleverbare product is de diagnose en het reparatiepatroon, geen strategie en geen universele constante.
  • De reparatiewaarden zijn schaalafhankelijk. De specifieke vloer emin=0.20e_{\min}=0.20 en shrinkage k=40k=40 die de val volledig sluiten, zijn gefit op dit data-genererende proces — zijn handelsfrequenties, zijn staartdikte, zijn edge-omvang. Op andere data verschuift het plateau. Wat overdraagbaar is, is de vorm van het sweepoppervlak (monotone stijging in beide knoppen, degeneratie naar nul, een plateau bij de waarheid) en de methode om je eigen coördinaten te vinden: sweep beide en lees het oppervlak, kopieer de getallen niet.
  • conf_k is onze constructie, geen benoemde schatter. De trade-count shrinkage SR^n/(n+k)\widehat{SR}\cdot n/(n+k) is een Bayesiaans, precisie-gewogen / empirical-Bayes-achtig middel dat we voor dit probleem hebben gebouwd; de rationale is gegrond in het geverifieerde Lo/Mertens standaardfout-resultaat en de Bailey–López de Prado MinTRL, en de dichtstbijzijnde benoemde verwant is van Tharp's System Quality Number (Ntrade/σtrade\sqrt{N}\cdot \overline{\text{trade}}/\sigma_{\text{trade}}, een andere functionele vorm), maar we beweren niet dat n/(n+k)n/(n+k) zelf onder een naam in de literatuur voorkomt. De begeleidende remedies — de exposure floor, full-timeline meting — zijn precies gestelde standaardpraktijk. En merk op welke objectives hier al veilig waren: raw PnL en full-timeline Sharpe hadden nooit reparatie nodig, omdat ze van meet af aan exposure-bewust zijn — zozeer zelfs dat het begrenzen van full-timeline Sharpe reduceert tot full-timeline Sharpe, waarvan de winnaar al elke redelijke vloer haalt. De val is specifiek de per-trade / actieve Sharpe — en zelfs de volledig gerepareerde per-trade objective evenaart slechts full-timeline Sharpe (OOS 1.70 tegen 1.71), nooit meer. De hoofdles is niet de reparatie; het is meten over de volledige tijdlijn vanaf het begin.

Belangrijkste inzichten

  1. De objective is de beslissing, geen formaliteit. Een zoektocht vindt niet "een goede strategie" — hij vindt de maximizer van welke scalair je hem ook hebt gegeven, en verschillende scalairs selecteren compleet andere strategieën op identieke data. De objective kiezen is de strategie kiezen; alles stroomafwaarts is boekhouding. Dat is de wet van Goodhart: op het moment dat jouw metriek het doel van de zoektocht wordt, buit de zoektocht elk gat uit tussen die metriek en wat je bedoelde.
  2. De per-trade Sharpe is een val. Gemeten op alleen de bars die een strategie verhandelt, wordt hij gemaximaliseerd door zo zelden mogelijk te handelen — hoe minder observaties, hoe makkelijker een paar gelukkige bewegingen de ratio opblazen (een Gaussiaanse controle bevestigt dat fat tails niet vereist zijn; het is een klein-sample-plus-selectie-effect). Over 600 seeds kiest hij in 56% ervan een loterij met minder dan 5% exposure en degenereert in 57%; de typische gedegenereerde keuze heeft gemiddeld een in-sample per-trade Sharpe van 4.58. Op één opzettelijk schrille seed kroonde hij een strategie met acht trades en 0.4% exposure met een in-sample per-trade Sharpe van 21.09, die instortte tot een full-timeline out-of-sample Sharpe van 0.13. Een ratio gebouwd op acht observaties heeft een standaardfout van de orde ±7.7 geannualiseerd (Akte 4) — het was nooit informatie.
  3. Exposure-bewuste objectives zijn van nature veilig. Raw PnL en full-timeline Sharpe degenereerden nooit (0%), omdat ze de hele tijdlijn meten en inactiviteit automatisch bestraft wordt. Je kunt een full-timeline metriek niet manipuleren door zelden te handelen. Raw PnL's enige gebrek is de tegenovergestelde bias — het over-exposeert (gemiddelde exposure 0.859, OOS 1.61 tegenover het werkelijke 1.77), waardoor θ\theta voorbij het optimum drijft om meer in de markt te zijn.
  4. De reparaties werken — maar ze brengen je slechts terug naar full-timeline Sharpe. Een exposure floor en een trade-count (conf_k) shrinkage tillen elk onafhankelijk de out-of-sample Sharpe op en drijven degeneratie naar nul; samen bereiken ze een plateau. Maar dat plateau is full-timeline Sharpe: degeneratie daalt van 59.5% bij (emin,k)=(0,0)(e_{\min},k)=(0,0) naar 0% bij emin=0.20e_{\min}=0.20 en OOS Sharpe klimt van 0.66 naar 1.71 — precies het getal dat gewone volledige Sharpe zonder hulp post, en de volledig gerepareerde robuuste objective landt in werkelijkheid net eronder (OOS 1.70, 0.17% degeneratie: zwak gedomineerd). Op seed 6 herstelt de robuuste objective een bijna-optimale, goed geëxposeerde drempel (θ=0.979\theta = 0.979, één rasterpunt onder het werkelijke 1.041.04; 447 trades; OOS Sharpe 1.77). Behandel conf_k als een terugvaloptie voor wanneer een per-trade metriek je wordt opgedrongen, niet als een upgrade ten opzichte van het meten van de volledige tijdlijn. De exacte coördinaten zijn schaalafhankelijk; de vorm van het oppervlak is het overdraagbare resultaat.
  5. Ontwerp de objective zo dat hij niet gemanipuleerd kan worden door zeldzame gelukkige trades. In volgorde van voorkeur: meet over de volledige tijdlijn (standaard), eis exposure (sterkste losse hendel), krimp naar aantal trades (objective-niveau Minimum Track Record Length). Niets hiervan maakt de zoektocht slimmer — het maakt het doel eerlijk, zodat het maximum dat de zoektocht onvermijdelijk vindt een strategie is die je daadwerkelijk zou verhandelen.

Een parameterzoektocht is een gehoorzame geest. Hij verleent precies de wens die jij formuleert, niet degene die je bedoelde — en "maximaliseer deze metriek" is de wens. Formuleer hem als een per-trade Sharpe en hij zal acht gelukkige trades oproepen en ze een fortuin noemen. Formuleer hem zo dat plat zitten wordt bestraft en een handvol trades slechts een handvol krediet verdient, en dezelfde geest, op dezelfde data, geeft je de echte edge. De strategie die je inzet, werd gekozen op het moment dat je de objective intypte. Kies hem met opzet.

Het volledige experiment — de synthetische markt, de zes objectives, de 600-seed Monte Carlo, en het reparatie-sweepoppervlak, elk getal opnieuw te genereren uit één deterministisch script — staat in het bijbehorende paper op objective-design.marketmaker.cc, met code en data op github.com/suenot/objective-design-degeneracy.

Dit is één front in dezelfde oorlog die onze andere studies vanuit verschillende hoeken voeren. De Deflated Sharpe Ratio beprijst de winnaar van een zoektocht na multiple testing — waar dit artikel vraagt of de objective überhaupt de juiste strategie koos, vraagt DSR of de gekozen strategie beter presteert dan wat pure mazzel alleen zou opleveren. De aankomende probability of backtest overfitting-studie valt dezelfde selectiebias aan vanaf de resamplingkant, en scoort de procedure in plaats van de winnaar. En de look-ahead bias taxonomie catalogiseert de andere grote producent van nep-Sharpe — een lek uit de toekomst — die hetzelfde symptoom (een glorieuze backtest die live sterft) produceert via een compleet ander mechanisme. Objective design, deflatie, overfitting-waarschijnlijkheid, look-ahead: vier namen voor één discipline — jezelf niet laten bedriegen door je eigen backtest.

Disclaimer: De informatie in dit artikel is uitsluitend bedoeld voor educatieve en informatieve doeleinden en vormt geen financieel, beleggings- of handelsadvies. Het handelen in cryptovaluta brengt een aanzienlijk risico op verlies met zich mee.

Auteurs

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

Blijf de markt voor

Abonneer je op onze nieuwsbrief voor exclusieve AI-handelsinzichten, marktanalyses en platformupdates.

We respecteren je privacy. Je kunt je op elk moment afmelden.