På tisdagsmorgonen låg vår trendstrategi för råolja lång i kontraktet som snart skulle förfalla. Signalen gjorde precis det vi hade bett den om: behöll positionen så länge trenden var positiv. Backtestet visade en måttlig vinst. Papperskontot visade en försäljning, ett köp i nästa kontrakt, två avgifter och ett sämre ingångspris än vad diagrammet antydde.
Inget mystiskt hade hänt med signalen. Backtestet hade behandlat ”terminspriset” som en enda sammanhängande serie. Kontot var tvunget att stänga ett kontrakt och öppna ett annat, i två olika orderböcker, till två olika priser.
Vi upptäckte avvikelsen när vi granskade en position som löpte över rullningsperioden. Strategin använde ett likvidt frontmånadskontrakt och behöll det tills en kalendregel flyttade positionen till nästa månad. Regeln var rimlig. Redovisningen kring den var det inte.
Vår kontinuerliga prisserie hade justerats bakåt för att ta bort gapet mellan kontrakten. Det gjorde diagrammet användbart för att beräkna en trend. Men det innebar också att serien inte innehöll något faktiskt pris som vi kunde stänga det gamla kontraktet eller öppna det nya till. Backtestet använde den justerade prisnivån för att värdera affären genom rullningen och återupptog sedan handeln som om positionen bara hade fortsatt.
För en signal kan en kontinuerlig prisserie vara ett användbart mätunderlag. För ett avslut är den fiktion. En rullning består av två affärer, och spreaden mellan kontrakten är en del av marknadsstrukturen, inte ett kosmetiskt hopp som kan jämnas ut.
Vi återskapade händelsen med de två noterade kontrakten. Det gamla månads kontraktet hade ett köpbud på 79.98 och ett säljbud på 80.00. Nästa månad hade ett köpbud på 80.42 och ett säljbud på 80.45. Vår långa position behövde sälja det gamla kontraktet till köpbudet och sedan köpa det nya till säljbudet. Kalenderspreaden mellan dessa exekverbara sidor var 44 cent.
Det talet innebar inte automatiskt en förlust på 44 cent. Kontrakten hade olika leveransmånader, och spreaden speglade carry, lagring, finansiering och förväntningar på utbudet. En position som hålls genom rullningen behåller exponeringen mot det nya kontraktets prisutveckling; hela den noterade spreaden betalas inte som en avgift. Men strategin måste realisera det gamla kontraktets utträde och etablera ingången i det nya. Om avkastningsberäkningen jämför de priserna som om de gällde samma instrument kan den hitta på eller radera P&L.
Vi delade upp uppgifterna i återskapningen. Den kontinuerliga prisserien genererade fortfarande trendsignalen. Kontraktsspecifika priser hanterade värderingar och order. Vid rullningen skickade simulatorn en stängningsorder för den utgående månaden och en öppningsorder för nästa, tillämpade avgifter för vart och ett av kontrakten och tog hänsyn till spreaden och det tillgängliga djupet i respektive orderbok.
Den första återskapningen stämde ändå inte med papperskontot. Vi hade synkroniserat båda avsluten till samma tidpunkt, trots att orderna skickades in sekventiellt. Stängningen av det gamla månadskontraktet gick igenom, men säljbudet i nästa kontrakt hann ändras innan köpet nådde orderboken. En rullning kan genomföras som en kalenderspread när handelsplatsen stöder det, eller som två ben med exponering däremellan. Det är olika antaganden om exekvering. Vi använde papperskontots faktiska orderföljd i jämförelsen.
Sedan upptäckte vi att själva kalenderregeln var otillräckligt specificerad. ”Rulla fem dagar före förfall” låter precist tills en helgdag förskjuter handelskalendern, likviditeten flyttar tidigare eller förfallskonventionen skiljer sig mellan kontrakt. På ett ställe hade vi räknat kalenderdagar och på ett annat handelsdagar. Pappersstrategin rullade under den femte handelssessionen före sista handelsdagen; backtestet rullade fem kalenderdagar före den.
En rullningsdag är en handelsregel. Skriv ner handelsplatsens kalender och vad som utlöser rullningen, annars kommer backtestet och kontot förr eller senare att vara oense om vilket kontrakt du äger.
Vi ändrade rullningsinstruktionen så att den angav kontraktets sista handelsdag, räknade sessioner enligt handelsplatsens kalender och krävde en miniminivå för likviditeten innan flytten. Den tröskeln var en praktisk säkerhetsregel, inte ett löfte om bättre avslut: volym och öppet intresse är ofullständiga mått på vad vår order faktiskt kan exekveras till. Vi loggade det valda kontraktet och priserna för båda benen så att varje återskapning kunde förklara övergången.
Efter de ändringarna sjönk strategins historiska avkastning. Skillnaden berodde inte på en enda enorm rullningsförlust. Den kom från många små korrigeringar: rätt kontrakt, rätt handelssession, verkliga avgifter för båda benen samt utträden och ingångar prissatta i sina egna orderböcker. En tunn rullning blev särskilt dyr, så vi lät den synas i stället för att jämna ut den med ett genomsnitt.
Om ditt terminbacktest använder ett kontinuerligt diagram bör du fråga dig vad diagrammet faktiskt får användas till. Det kan ge en signal ett konsekvent indataunderlag. Det kan inte ersätta ett kontrakt som du hade kunnat köpa eller sälja. För varje position som löper över förfall bör forskningsunderlaget ange det gamla kontraktet, det nya kontraktet, rullningsutlösaren, exekveringsmodellen och de två kassaflödena.
Den där tisdagshandeln var inget sofistikerat misslyckande. Det var en linje i ett diagram som såg lönsam ut men hoppade över ögonblicket då kontot behövde ändra vad det ägde. När vi lade tillbaka det ögonblicket i återskapningen blev resultatet mindre smickrande och mycket mer användbart.
← Alla inlägg


