12 september 2026 · risk

Fem positioneringsregler, en signal: delen av ditt backtest som gör det verkliga jobbet

Fem positioneringsregler, en signal: delen av ditt backtest som gör det verkliga jobbet

Din ingångssignal är förmodligen den minst betydelsefulla delen av ditt backtest. Jag kan ta en medioker momentumregel, låta alla tidsstämplar för in- och utträden vara orörda, bara ändra funktionen som avgör hur många kontrakt vi håller och flytta net Sharpe från 0.41 till 0.71 och maximal drawdown från 31% till 13%. Samma affärer. Samma avslut. Olika strategi.

Det där påståendet irriterar folk, och det borde det göra, eftersom det antyder att det mesta av tiden vi lägger på att finjustera lookback-perioder och filtertrösklar går åt till den mindre termen. Så låt mig visa de faktiska körningarna och sedan ge kritikerna rätt där de har rätt, för det finns en version av det här argumentet som är fel, och det är värt att veta vilken version jag framför.

En signal, 6 sätt att hålla positionen

Signalen: ETHUSDT perpetual på Binance USDⓈ-M, 1-timmesstaplar, lång när 12-timmars EMA ligger över 96-timmars EMA, annars flat, inga korta positioner. Juli 2022 till juni 2026. 431 tur-och-retur-affärer. Taker-avgifter på båda sidor med 5.0 bps, funding betald eller mottagen var 8:e timme utifrån den faktiska positionen, slippage modellerad utifrån djupet på bästa köp- och säljkurs. Det är medvetet en tråkig signal — jag valde den eftersom ingen skulle försvara den, vilket ger oss en ren testyta.

Alla rader nedan har identiska tidsstämplar för in- och utträdesstaplar. Den enda skillnaden är storleksfunktionen.

StorleksregelNet SharpeMax DDHandlad nominell volym/år (× genomsnittsposition)Kostnader som % av bruttovinstMaximal hävstång
Fast nominellt belopp på $10k0.4118.2%246×14%1.0×
Fast andel, 100% av eget kapital0.4430.8%251×15%1.0×
Invers 20-dagars realiserad volatilitet0.6814.1%690×29%4.4×
20% annualiserat volatilitetsmål, ombalansering varje timme, utan tak0.7112.9%1,180×41%6.3×
20% volatilitetsmål, 20% band utan handel, hävstångstak på 3×0.6615.3%402×19%3.0×
Halv-Kelly på rullande medelvärde/varians över 60 dagar0.5224.6%830×33%8.1×
0.41 → 0.71net Sharpe, identiska ingångar
41%av bruttovinsten åts upp av ombalansering varje timme
6.3×maximal hävstång som körningen med bäst Sharpe i det tysta använde

Titta på skillnaden. Mellan sämsta och bästa raden är det 73% relativ skillnad i Sharpe och en faktor på 2.4 i drawdown. Försök nu hitta en parameter för ingångssignalen i det här datasetet som flyttar Sharpe med 0.30 utan att samtidigt uppvisa tydlig överanpassning. Jag har letat. Längden på EMA-paret flyttar den med ungefär 0.12 över hela det rimliga parameterfältet, och det mesta av den rörelsen är brus som inte håller utanför urvalet.

Varför invers volatilitet ser så bra ut, och hur mycket som är verkligt

Mekanismen är inte mystisk. Med fast nominellt belopp är din positionsstorlek okorrelerad med realiserad volatilitet, vilket betyder att din risk i dollar per affär står i proportion till den volatilitet som råkar råda den veckan. För ETH under den här perioden varierade 20-dagars realiserad volatilitet mellan 31% och 118% annualiserat. Körningen med fast nominellt belopp tog 3.8× mer risk i dollar i mars 2024 än i juli 2023, inte för att signalen var säkrare, utan för att marknaden rörde sig mer. Nästan hela drawdownen är koncentrerad till den högsta volatilitetskvintilen. Positionsstorlek med invers volatilitet tar bort den kopplingen, och det ger en verklig förbättring av avkastningsseriens form.

Men en del av Sharpe-ökningen är en mätartefakt, och om du inte skiljer de två åt kommer du att fatta dåliga beslut senare. Sharpe dividerar med avkastningens standardavvikelse. Volatilitetsmål innebär per definition en operation som stabiliserar avkastningens standardavvikelse. Du optimerar nämnaren direkt. En regel som skalar positionerna för att nå konstant ex ante-volatilitet kommer att förbättra Sharpe för nästan alla avkastningsserier med volatilitetsklustring, även serier utan edge. Jag har verifierat det med omblandade signaler: slumpa ingångstidsstämplarna, behåll volatilitetsmålet som ett överlägg och Sharpe förbättras fortfarande med ungefär 0.06 jämfört med fast nominellt belopp på en bas med medelvärde noll. Litet, men inte noll, och det beror helt på mekaniken.

När jag jämför storleksregler internt är Sharpe därför aldrig det enda talet i kalkylbladet. Jag vill ha Calmar, net PnL per enhet genomsnittligt investerat nominellt belopp och en uppdelning från brutto till netto, eftersom de tre tillsammans är mycket svårare att manipulera med ett knep med nämnaren.

Volatilitetsestimatet är en modell, och det läcker information som modeller gör

Det allra vanligaste sättet som ett bra resultat för positionsstorlek visar sig vara falskt: volatilitetsestimatet använder information från stapeln som positionen bestäms för. Om din volatilitetsserie beräknas med ett centrerat fönster, eller med pandas standardfunktion `rolling().std()` efter en omsampling som inkluderar den aktuella ofullständiga stapeln, eller med standardisering över hela urvalet, har du läckage. Det är subtilt eftersom volatiliteten är persistent, så läckaget är litet på varje enskild rad och aktiekurvan ser fortfarande rimlig ut. Den ser bara lite för jämn ut precis under de veckor som spelar roll.

Våra agenter kontrollerar 4 saker för varje storleksregel innan ett resultat flyttas till kön för papperstrading:

  1. Tillgänglighet vid beslutstillfället. Storleken som används för stapeln som öppnar kl. 14:00 måste kunna beräknas från data vars stängningstidsstämpel är ≤ 13:59:59.999. Vi verifierar detta genom att beräkna om storleksserien från en trunkerad dataram för ett slumpmässigt urval av 200 beslutspunkter och jämföra resultaten.
  2. Estimatorns lookback är en riktig parameter. Ett volatilitetsfönster på 20 dagar och ett på 60 dagar är två olika strategier. Lookback-perioden tas med i walk-forward-parameterfältet tillsammans med allt annat, och om resultatet bara fungerar vid en fönsterlängd är det en indikation på skörhet.
  3. Hävstångsförloppet, inte bara toppen. Redovisa hela fördelningen av bruttoskuldsättning. Körningen med volatilitetsmål utan tak ovan låg över 5× under 4% av timmarna. Det är den sortens sak som aldrig syns i en sammanfattningstabell och som helt avgör om strategin går att implementera.
  4. Känslighet för positionsstorlek som robusthetstest. Om Sharpe kollapsar när du ändrar volatilitetsmålet från 20% till 25% är strategin inte volatilitetsstyrd, den är hävstångsoptimerad, och du har hittat din edge genom att välja ett tal.

Hävstångstaket är ingen pyntdetalj i riskhanteringen, det är en del av strategidefinitionen. Binances ETHUSDT-nivåer sänker maximal hävstång när positionsbeloppet växer, och underhållsmarginalkravet ökar stegvis samtidigt. Ett backtest som låter regeln med volatilitetsmål gå upp till 6.3× vid ett nominellt belopp på $400k beskriver en position som handelsplatsen inte låter dig hålla med den marginalen. Den begränsade raden i tabellen kostar 0.05 Sharpe och är den enda av de två som beskriver något verkligt.

Det är vid ombalanseringen pengarna försvinner

Lägg märke till kostnadskolumnen. Ombalansering varje timme mot ett volatilitetsmål gav den bästa Sharpe-siffran och lämnade samtidigt över 41% av bruttovinsten till handelsplatsen. Det motsvarar en årligen handlad nominell volym på 1,180× genomsnittspositionen vid 5 bps per sida, plus spread och marknadspåverkan. Den naiva lösningen är att ombalansera mer sällan enligt ett schema. Den bättre lösningen är ett band utan handel: ändra bara storleken när den aktuella positionen avviker från målet med mer än en viss gräns.

Ett band på 20% sänkte den årligen handlade nominella volymen från 1,180× till 402× — en minskning med 66% — och kostade 0.05 Sharpe. Jag har testat detta på 8 signaler nu, och mönstret återkommer: band mellan 15% och 25% ger tillbaka merparten av riskkontrollens fördelar med en tredjedel av omsättningen, medan allt under 10% bara innebär att man betalar avgifter för kosmetisk precision i en storlek som man ändå uppskattar med ett 20-dagarsfönster. Du kan inte ombalansera med 3 decimalers precision mot ett tal med ett standardfel på 15%.

Vi hade en körning i februari där rapporten som en agent skrev tillskrev en Sharpe-förbättring på 0.22 till ”det förbättrade ingångsfiltret”. Diffen var en rad i storleksmodulen. Filtret hade inte ändrats. Nu låter jag rapporten skriva ut hashen för storlekskonfigurationen högst upp, eftersom attribuering kräver disciplin och modeller gärna berättar en prydlig historia, precis som alla andra.

Vad papperstrading gör med din storleksregel

Det är här gapet mellan backtest och paper blir som störst, och orsaken är till största delen aritmetik. Volatilitetsanpassad positionsstorlek innebär att positionen varierar med en faktor på 4 till 8 under urvalet. Båda ändarna av det intervallet stöter på begränsningar hos handelsplatsen som backtestet aldrig modellerade.

I den nedre änden: stegstorlek och minsta nominella belopp. ETHUSDT perp har ett kvantitetssteg på 0.001 och ett minimibelopp på $5. Om din storlek i en lågt volatilitetsregim är 0.0004 ETH behåller backtestet den, medan paper inte håller någon position alls. Det låter som ett specialfall tills man inser att en regel med volatilitetsmål ger sina minsta storlekar på de lugnaste marknaderna, vilket för en trendföljande signal ofta är precis där de bra ingångarna finns. I den övre änden: positionsgränser, marginnivåer och det faktum att en position med 6× hävstång kräver en disciplin kring isolerad marginal som du inte backtestade någon likvideringsmodell för.

Vi upptäckte en körning där aktiekurvan i paper följde backtestet inom 3% i 6 veckor och sedan vek av rejält. Orsaken var avrundning: trunkering med `int()` i stället för avrundning till steg i orderstorleksberäkningen, tillämpad på positioner som i snitt var 1.4 steg stora. Backtestet beräknade storleken i ett kontinuerligt värderum, medan den livebaserade storleksberäkningen tappade 20-30% av den avsedda positionen på varje liten affär. Inga exotiska fillmodeller, ingen latensförklaring. Trunkering.

Där kritikerna har rätt

3 invändningar håller, och jag vill inte försöka prata bort dem.

För det första, och viktigast: positionsstorlek fördelar edge, den kan inte skapa den. Om din signals bruttoförväntan efter realistiska avgifter och funding är noll eller lägre förlorar alla regler i tabellen pengar — de mer avancerade förlorar dem bara med en snyggare variansprofil. Jag valde en signal med en liten men positiv net edge under den här perioden. Kör samma 6 regler på en signal med −1.2 bps per affär netto så behålls rangordningen, men slutvärdet på eget kapital ligger under startvärdet för samtliga. Positionsstorlek multiplicerar något. Du behöver fortfarande ha det där något.

För det andra har volatilitetsmål ett verkligt och väl dokumenterat fel: det minskar hävstången vid botten av ett snabbt ras och ökar den igen efter återhämtningen. Vid en skarp V-formad rörelse vinner fast nominellt belopp, ibland med stor marginal. Börsraset i mars 2020 och kryptofallet i augusti 2024 straffade båda volatilitetsanpassad positionsstorlek under återhämtningsfasen. Min fyraåriga ETH-period råkar innehålla mer volatilitetsklustrad, utdragen rörelse än V-formade kast, vilket gynnar raderna med invers volatilitet. En annan period vänder på delar av rangordningen, och om jag hade inlett med en tabell från 2020 skulle jag ha framfört en svagare version av det här argumentet.

För det tredje går det att överanpassa storleksregeln lika mycket som allt annat. Halv-Kelly baserad på rullande estimat är det avslöjande exemplet i min tabell: den ser sofistikerad ut, har teoretisk grund och gav den näst sämsta drawdownen, eftersom det rullande medelvärdesestimatet för en brusig avkastningsserie är värdelöst och Kelly är brutalt känslig för det. Alla storleksregler som använder ett estimat av förväntad avkastning som indata ärver felet i det estimatet, med förstärkt effekt. Regler som bara använder ett variansestimat beter sig mycket bättre, eftersom varians är det enda moment du faktiskt kan uppskatta från 4 år av timdata.

Det jag skulle ta med mig från allt det här: när ett backtestresultat överraskar dig, kontrollera storleksmodulen innan du börjar leta efter smarta knep i signalen. Och när du rapporterar Sharpe, redovisa hävstångsförloppet och kostnadsuppdelningen bredvid, för ett tal som beror så här mycket på ett beslut om positionsstorlek är inte alls en egenskap hos signalen.

positionsstorlekvolatilitetsmålsharpekvotriskhanteringbacktestning
← Alla inlägg