Je entrysignaal is waarschijnlijk het minst bepalende onderdeel van je backtest. Ik kan één middelmatige momentumregel nemen, alle entry- en exittijdstippen ongemoeid laten, alleen de functie aanpassen die bepaalt hoeveel contracten je aanhoudt, en de netto Sharpe verschuiven van 0.41 naar 0.71 en de maximale drawdown van 31% naar 13%. Dezelfde trades. Dezelfde fills. Een andere strategie.
Die bewering irriteert mensen, en dat is terecht, want ze impliceert dat we het grootste deel van onze tijd besteden aan het finetunen van terugkijkperiodes en filterdrempels terwijl dat maar een kleine factor is. Laat me dus de daadwerkelijke runs zien en daarna de critici gelijk geven waar dat terecht is. Want er bestaat een versie van dit argument die niet klopt, en het is goed om te weten welke versie ik maak.
Eén signaal, 6 manieren om het aan te houden
Het signaal: ETHUSDT perpetual op Binance USDⓈ-M, candles van 1 uur, long wanneer de 12-uurs-EMA boven de 96-uurs-EMA ligt, anders flat, geen shorts. Juli 2022 tot en met juni 2026. 431 roundtrips. Takerkosten aan beide kanten van 5.0 bps, elke 8 uur funding betaald of ontvangen op basis van de daadwerkelijke positie, slippage gemodelleerd op basis van de diepte van het orderboek op de beste bied- en laatprijs. Het is bewust een saai signaal — ik koos het omdat niemand het zou verdedigen, wat een zuivere test oplevert.
Elke rij hieronder heeft identieke entry- en exitcandletijdstippen. Alleen de sizingfunctie verschilt.
| Sizingregel | Netto Sharpe | Max. DD | Verhandeld notional/jaar (× gem. positie) | Kosten als % van bruto-PnL | Piekleverage |
|---|---|---|---|---|---|
| Vast notional van $10k | 0.41 | 18.2% | 246× | 14% | 1.0× |
| Vaste fractie, 100% van het eigen vermogen | 0.44 | 30.8% | 251× | 15% | 1.0× |
| Omgekeerde gerealiseerde vol over 20 dagen | 0.68 | 14.1% | 690× | 29% | 4.4× |
| Vol-target van 20% op jaarbasis, elk uur herschikt, zonder limiet | 0.71 | 12.9% | 1,180× | 41% | 6.3× |
| Vol-target van 20%, no-trade band van 20%, leveragelimiet van 3× | 0.66 | 15.3% | 402× | 19% | 3.0× |
| Half-Kelly op rollend gemiddelde en variantie over 60 dagen | 0.52 | 24.6% | 830× | 33% | 8.1× |
Kijk naar het verschil. Tussen de slechtste en beste rij zit een relatief verschil van 73% in Sharpe en een factor 2.4 in drawdown. Zoek nu maar eens een parameter van het entrysignaal in deze dataset die de Sharpe met 0.30 verschuift zonder dat het ook duidelijk overfitting is. Ik heb gezocht. De lengte van het EMA-paar verschuift de Sharpe met ongeveer 0.12 over het hele plausibele bereik, en het grootste deel van die beweging is ruis die buiten de steekproef niet standhoudt.
Waarom inverse vol er zo goed uitziet, en hoeveel daarvan echt is
Het mechanisme is niet mysterieus. Bij een vast notional is je positiegrootte niet gecorreleerd met de gerealiseerde volatiliteit. Dat betekent dat je risico in dollars per trade evenredig is aan de volatiliteit die er die week toevallig is. Bij ETH liep de gerealiseerde volatiliteit over 20 dagen in deze periode uiteen van 31% tot 118% op jaarbasis. De run met vast notional nam in maart 2024 3.8× zoveel risico in dollars als in juli 2023, niet omdat het signaal meer vertrouwen wekte, maar omdat de markt beweeglijker was. Bijna de volledige drawdown zit in het hoogste vol-kwintiel. Sizing op basis van inverse vol haalt die koppeling weg, en dat verbetert de vorm van het rendementsverloop daadwerkelijk.
Maar een deel van de Sharpe-winst is een meetartefact. Als je die twee niet uit elkaar haalt, neem je later slechte beslissingen. Sharpe deelt door de standaarddeviatie van de rendementen. Vol targeting is per definitie een bewerking die de standaarddeviatie van de rendementen stabiliseert. Je optimaliseert rechtstreeks de noemer. Een regel die posities schaalt om een constante ex-ante vol te bereiken, verbetert de Sharpe op bijna elk rendementsverloop met vol-clustering, ook op reeksen zonder edge. Dat heb ik gecontroleerd met geschudde signalen: randomiseer de entrytijdstippen, behoud de vol-target-overlay en de Sharpe verbetert nog steeds met ongeveer 0.06 ten opzichte van vast notional bij een basisreeks met gemiddelde nul. Weinig, maar niet nul, en het komt puur door de werking van de methode.
Daarom is Sharpe intern nooit het enige cijfer waarop ik sizingregels vergelijk. Ik wil Calmar, ik wil netto-PnL per eenheid gemiddeld ingezet notional, en ik wil het verloop van bruto naar netto, want samen zijn die 3 veel moeilijker te manipuleren met een trucje met de noemer.
De volschatting is een model, en lekt net als een model
De meest voorkomende reden waarom een goed sizingresultaat nep blijkt: de volatiliteitsschatting gebruikt informatie uit de candle waarvoor de grootte wordt bepaald. Als je volreeks wordt berekend met een gecentreerd venster, of met pandas' standaard `rolling().std()` na een resample waarin de huidige gedeeltelijke candle is opgenomen, of op basis van een standaardisatie over de volledige steekproef, heb je datalekken. Dat is subtiel, omdat vol persistent is: het lek is op elke afzonderlijke rij klein en de equitycurve ziet er nog steeds plausibel uit. Alleen is die net iets te glad, precies in de weken die ertoe doen.
Onze agents controleren voor elke sizingregel 4 zaken voordat een resultaat wordt toegelaten tot de papertradingwachtrij:
- Beschikbaarheid op het beslismoment. De grootte voor de candle die om 14:00 opent, moet berekend kunnen worden met gegevens waarvan de sluittijdstempel ≤ 13:59:59.999 is. We controleren dit door de grootte-reeks opnieuw te berekenen op basis van een afgekapt dataframe voor een willekeurige steekproef van 200 beslismomenten en de uitkomsten te vergelijken.
- De terugkijkperiode van de schatter is een echte parameter. Een volvenster van 20 dagen en een volvenster van 60 dagen zijn 2 verschillende strategieën. De terugkijkperiode gaat samen met al het andere in het walk-forward-bereik, en als het resultaat maar bij één vensterlengte werkt, zegt dat iets over de kwetsbaarheid.
- Het leverageverloop, niet alleen de piek. Toon de volledige verdeling van de bruto leverage. De run met een vol-target zonder limiet zat hierboven 4% van de uren boven 5×. Dat is precies het soort informatie dat nooit in een samenvattingstabel staat en volledig bepaalt of de strategie uitvoerbaar is.
- Sizinggevoeligheid als robuustheidstest. Als de Sharpe instort wanneer je het vol-target van 20% naar 25% verandert, wordt de strategie niet op vol getarget maar op leverage afgesteld, en heb je je edge gevonden door een getal te kiezen.
De leveragelimiet is geen opsmuk voor risicobeheer, maar onderdeel van de strategiedefinitie. Binance verlaagt de maximale leverage in de ETHUSDT-tiers naarmate het positie-notional groeit, en de onderhoudsmarge neemt mee toe. Een backtest waarin de vol-targetregel tot 6.3× kan gaan bij een notional van $400k, beschrijft een positie die het platform je bij die marge niet laat aanhouden. De begrensde rij in de tabel kost 0.05 Sharpe en is de enige van de 2 die een echte situatie beschrijft.
Hier gaat het geld heen bij herschikken
Let op de kolom met kosten. Elk uur herschikken naar een vol-target leverde de beste Sharpe op papier op, maar droeg ook 41% van de bruto-PnL af aan de exchange. Dat is jaarlijks 1,180× het gemiddelde positie-notional aan verhandelde posities, tegen 5 bps per kant plus spread en impact. De voor de hand liggende oplossing is minder vaak herschikken, volgens een schema. Beter is een no-trade band: pas de positie alleen aan wanneer die meer dan een bepaalde drempel afwijkt van het target.
Een band van 20% bracht het jaarlijks verhandelde notional terug van 1,180× naar 402× — een daling van 66% — en kostte 0.05 Sharpe. Ik heb dit inmiddels op 8 signalen getest en het patroon herhaalt zich: banden tussen 15% en 25% leveren het grootste deel van het risicobeheervoordeel op met een derde van de omloopsnelheid, en alles onder 10% betekent alleen dat je kosten betaalt voor cosmetische precisie in een hoeveelheid die je toch al met een venster van 20 dagen schat. Je kunt niet tot op 3 decimalen herschikken op basis van een getal met een standaardfout van 15%.
In februari hadden we een run waarbij het rapport van een agent een Sharpe-verbetering van 0.22 toeschreef aan "het verbeterde entryfilter". De diff was één regel in de sizingmodule. Het filter was niet veranderd. Ik laat het rapport nu bovenaan de hash van de sizingconfig afdrukken, want attributie vereist discipline en modellen vertellen net zo graag een mooi afgerond verhaal als ieder ander.
Wat papertrading doet met je sizingregel
Hier wordt de kloof tussen backtest en paper het grootst, en dat komt vooral door de rekenkunde. Bij volresponsieve sizing schommelt je positiegrootte in de steekproef met een factor 4 tot 8. Aan beide uiteinden van dat bereik loop je tegen platformbeperkingen aan die de backtest nooit heeft gemodelleerd.
Aan de kleine kant: stapgrootte en minimaal notional. De ETHUSDT-perp heeft een hoeveelheidsstap van 0.001 en een minimum van $5. Als je positie bij lage vol 0.0004 ETH bedraagt, houdt de backtest die aan en neemt paper helemaal geen positie. Dat klinkt als een randgeval, totdat je beseft dat een vol-targetregel de kleinste posities aanhoudt in de rustigste markten, precies waar bij een trendsignaal vaak de goede entries zitten. Aan de grote kant: positielimieten, margintiers en het feit dat een positie van 6× geïsoleerde marge vereist, terwijl je geen liquidatiemodel hebt getest.
We ontdekten een geval waarbij de paper-equitycurve 6 weken lang binnen 3% van de backtest bleef en daarna sterk afweek. De oorzaak was afronding: `int()` kapt af in plaats van af te ronden op de stapgrootte in de order-sizer, toegepast op posities die gemiddeld 1.4 stappen groot waren. De backtest bepaalde de grootte in een doorlopende ruimte, terwijl de live-sizer bij elke kleine trade 20-30% van de beoogde positie liet liggen. Geen exotische fillmodellen, geen verhaal over latency. Afkappen.
Waar de critici gelijk hebben
3 bezwaren houden stand, en ik wil er niet omheen praten.
Ten eerste, en het belangrijkste: sizing verdeelt edge, maar kan die niet creëren. Als de brutoverwachtingswaarde van je signaal na realistische kosten en funding nul of lager is, verliest elke regel in die tabel geld — de fancy regels verliezen het alleen met een fraaier variantieprofiel. Ik koos een signaal met een kleine maar positieve netto-edge in deze periode. Voer dezelfde 6 regels uit op een signaal met −1.2 bps netto per trade en de rangorde blijft hetzelfde, terwijl het eindvermogen bij alle regels lager ligt dan het startvermogen. Sizing is een vermenigvuldiger van iets. Je hebt dat iets nog steeds nodig.
Ten tweede heeft vol targeting een reële en goed gedocumenteerde faalmodus: de leverage wordt afgebouwd tijdens de sterkste daling en weer opgebouwd na het herstel. Bij een scherpe V wint vast notional, soms met groot verschil. Zowel maart 2020 bij aandelen als de cryptodaling van augustus 2024 pakten nadelig uit voor volresponsieve sizing tijdens het herstel. In mijn ETH-venster van 4 jaar zitten toevallig meer langdurige periodes met geclusterde volatiliteit dan V-vormige whipsaws, wat de rijen met inverse vol gunstig afschildert. In een ander venster draait een deel van de rangorde om, en als ik een tabel uit 2020 als eerste had laten zien, zou mijn argument minder sterk zijn.
Ten derde kun je de sizingregel net zo goed overfitten als al het andere. Half-Kelly op rollende schattingen is de verrader in mijn tabel: het ziet er verfijnd uit en is theoretisch onderbouwd, maar leverde de op één na slechtste drawdown op. De schatting van het rollende gemiddelde van een ruisachtige rendementsreeks is waardeloos en Kelly is er enorm gevoelig voor. Elke sizingregel die een schatting van het verwachte rendement als invoer gebruikt, neemt de fout in die schatting over en vergroot die uit. Regels die alleen een variantieschatting gebruiken, gedragen zich veel beter, omdat variantie het enige moment is dat je daadwerkelijk kunt schatten op basis van 4 jaar aan uurlijkse gegevens.
Wat ik hiervan onthoud: als een backtestresultaat je verrast, controleer dan eerst de sizingmodule voordat je naar slimme trucs in het signaal gaat zoeken. En rapporteer bij een Sharpe ook het leverageverloop en het kostenverloop, want een getal dat zo sterk afhangt van een sizingkeuze is helemaal geen eigenschap van het signaal.
← Alle artikelen
