Prediktionsmarknader ser ut att vara det enklaste i världen att backtesta. Priset ligger i intervallet [0, 1]. Utfallet är en dollar eller ingenting. Ingen hävstång, ingen funding, ingen basis, inga eviga swappars märkligheter kl. 00:00 UTC. Vi hade redan en backtester som hanterade eviga kryptokontrakt med avgifter, funding och marknadspåverkan, och planen var att lägga två dagar på att anpassa den och sedan börja ta fram strategier.
Det tog 8 dagar. Här är loggen, ungefär i kronologisk ordning, inklusive dagen då aktiekurvan såg otrolig ut och faktiskt var det.
Dag 1: adaptern som borde ha varit enkel
Den ursprungliga mappningen var ett-till-ett och kändes ren. En marknad är ett instrument. YES-priset är priset. Att köpa YES är en lång position, att köpa NO är en kort position. Avräkning är en tvångsstängning på 1.00 eller 0.00. Mata in prisserien per timme i samma händelseslinga, klart.
Den mappningen överlever ungefär 90 minuter med verkliga data. Det första som föll sönder var avkastningsserien. Hela vårt risklager — positionsstorlek, volatilitetsstyrning, Sharpe-rapporteringen — utgick från logavkastning för ett fortlöpande instrument. En marknad som går från 0.04 till 0.00 har en odefinierad logavkastning och en tydligt definierad totalförlust. Och en marknad som ligger på 0.04 tre dagar före avräkning är ett helt annat slags objekt än en som ligger på 0.04 fyra minuter före, trots att båda raderna säger 0.04.
Det slutade med att vi parametriserade om hela serien efter tid till avräkning i stället för klocktid, och behandlade PnL som slutligt snarare än mark-to-market. Det var rätt beslut, och det gjorde all rapporteringskod nedströms ogiltig.
Dag 2: avgiftsformeln är strategin
På Kalshi är handelsavgiften inget avdrag i baspunkter. Den är kvadratisk i priset: ungefär 0.07 × contracts × P × (1−P), avrundad uppåt till närmaste cent på ordernivå. Det betyder att avgiften är som högst precis där en marknad med 50/50-odds är mest intressant, och nästan gratis ute i svansarna.
| Pris | Avgift per kontrakt | Nödvändig edge (sannolikhetspoäng) | Avgift som % av insatsen |
|---|---|---|---|
| 5¢ | 0.33¢ | 0.33 | 6.7% |
| 10¢ | 0.63¢ | 0.63 | 6.3% |
| 25¢ | 1.31¢ | 1.31 | 5.3% |
| 50¢ | 1.75¢ | 1.75 | 3.5% |
| 75¢ | 1.31¢ | 1.31 | 1.8% |
| 90¢ | 0.63¢ | 0.63 | 0.7% |
| 95¢ | 0.33¢ | 0.33 | 0.35% |
Läs den tredje kolumnen som det viktiga: för att gå jämnt upp när du köper på 50¢ och håller till avräkning måste din sannolikhetsbedömning överträffa marknadens med 1.75 punkter. Inte 1.75 procent relativt. Absolut. Om du säljer före avräkning i stället för att hålla betalar du avgiften två gånger, plus spreaden.
Polymarkets CLOB har historiskt haft en helt annan avgiftsprofil, närmare noll för själva handeln, vilket flyttar hela kostnaden till spread och djup. Samma strategilogik får alltså helt olika ekonomi beroende på handelsplats, och varje jämförelse mellan handelsplatser som använder en enda avgiftsmodell är fiktion. Nu använder vi en avgiftsfunktion per handelsplats i stället för ett skalärt värde.
Om du bara läser en rad i en backtestrapport för prediktionsmarknader, läs raden om avgifter uttryckt i sannolikhetspoäng. En strategi med en påstådd prognosedge på 1.2 punkter på 50¢-marknader går med förlust på Kalshi redan innan någon annan kostnad räknas in. Det ska synas på första sidan, utan att läsaren behöver räkna ut det själv.
Dag 3: orderboken är trappstegsformad och kort
Vår modell för marknadspåverkan var en kvadratrotsfunktion kalibrerad på orderböcker för BTC-eviga kontrakt. Det är fel form. Med ett tick på 1¢ för ett instrument värt $1 finns det bara 99 möjliga prisnivåer i hela orderboken, och en marknad med medelhög likviditet kan ha ett par hundra kontrakt på den översta nivån och sedan ett glapp.
Här är en ögonblicksbild från en marknad för ekonomisk statistik som vi samplade, YES-sidan, ungefär 30 timmar före avräkning:
| Nivå | Storlek (kontrakt) | Ackumulerad köpkostnad |
|---|---|---|
| 42¢ | 310 | 310 @ 42.0¢ i snitt |
| 43¢ | 85 | 395 @ 42.2¢ i snitt |
| 45¢ | 140 | 535 @ 42.9¢ i snitt |
| 49¢ | 600 | 1,135 @ 46.1¢ i snitt |
En order på 1,000 kontrakt — femhundra dollar i risk, en avrundningsdifferens i krypto — flyttar det effektiva priset med fyra cent. Fyra cent är mer än dubbelt så mycket som avgiften. Det finns ingen jämn funktion att anpassa här; du går igenom orderboken nivå för nivå, annars hittar du på. Vi tog bort sqrt-modellen för den här tillgångsklassen och skrev en bokstavlig orderboksvandrare, som är långsammare och korrekt.
Någonstans här kom jag på mig själv med att irritera mig över att marknaderna är ”för små för att spela roll”. De är små eftersom det som prissätts är en enskild fråga om verkligheten med en deadline, och det finns bara så många som har en åsikt om antalet nya ansökningar om arbetslöshetsersättning i USA en onsdag. Storleken är marknaden. Att klaga på den är som att klaga på att ett pokerbord bara har plats för nio.
Dag 4: dagen då aktiekurvan var vacker
Sharpe 4.1 på 1,400 marknader. Jämn kurva. Varje forskares mage borde knyta sig av det här, och det gjorde min också till slut, ungefär 40 minuter efter att jag redan hade tagit en skärmbild.
Felet låg i omsamplingen. Prishistoriken för illikvida marknader kommer med oregelbundna tidsstämplar, så vi indexerade om den till ett jämnt rutnät per timme. Den sista punkten i varje arkiverad serie är avräkningsvärdet, 1.00 eller 0.00. Vår omindexering använde närmaste grannvärde utan riktningsbegränsning, så för varje marknad där den sista handeln skedde flera timmar före avräkning spreds avräkningsvärdet bakåt över glappet. Modellen läste morgondagens svar i dagens rad, just för de illikvida marknader där den kunde ta större positioner utan att slå i djupgränserna.
Närmaste grannvärde fungerar bra för ett kontinuerligt instrument. För ett instrument där den sista observationen är facit blir det en maskin för framtidsläckage. Nu kontrollerar vi att varje ifyllnad bara sker framåt och att avräkningsraden är märkt och utesluten från all beräkning av features. Den kontrollen är nio rader lång och är den mest värdefulla koden vi skrev den veckan.
Dag 5–6: 1,412 marknader, ungefär 180 vad
Urvalsstorleken på prediktionsmarknader är en fälla med ett vänligt ansikte. Du får utfall för 1,412 marknader, känner att du har 1,412 observationer och beräknar ett t-värde därefter. Men fjorton NFL-matcher samma söndag delar vädersystem, en skaderapport och gemensamma spelarrörelser. 51 delstatsbaserade valmarknader påverkas av samma nationella opinionssvängning. ”Kommer X att hända senast den 31 mars” och ”kommer X att hända senast den 30 juni” är samma vad med olika sluttider, och de avgörs tillsammans.
Vi grupperade marknader efter underliggande händelsekälla och avräkningsdatum och fick ett effektivt antal oberoende observationer på ungefär 180. Det räcker inte för att skilja en verklig edge från brus vid de effektstorlekar vi tittade på, och ingen mängd bootstrapning per marknad löser det, eftersom bootstrapen måste sampla grupper snarare än rader. Om man gör fel här blåses signifikansen tyst upp med en faktor på två eller tre.
Dag 7: även avräkning är en sannolikhetsfördelning
Sakerna vi inte hade modellerat alls och upptäckte den hårda vägen:
- Tidig avräkning. En marknad som gäller ”senast den 31 december” kan avgöras den 4 augusti när händelsen faktiskt inträffar. Ditt kapital blir tillgängligt tidigare, och innehavstiden var aldrig den som kontraktsnamnet antydde.
- Tvister. Marknader som avgörs av ett orakel har en invändningsperiod. En position kan bli hängande i limbo i flera dagar efter händelsen, och i ett fåtal fall ändras utfallet från den uppenbara tolkningen.
- Ogiltigförklaringar. Tvetydiga källdata leder till att en marknad ställs in och alla får pengarna tillbaka. I vårt urval gäller det mindre än 1% av marknaderna, men de klustrar just kring de tvetydiga frågor som en modell bedömer som felprissatta.
- Kapitalbindning. En edge på 3 punkter som realiseras över 90 dagar och en edge på 3 punkter som realiseras över 6 timmar är inte jämförbara, och en backtester som rapporterar total edge utan att ta hänsyn till kapitalbindningstid kommer alltid att föredra den långsamma.
Vi lade till en term för innehavskostnad och en slumpmässig variation i avräkningsdatum i simulatorn. Ingen av dem är precis. Båda är bättre än det underförstådda antagandet att avräkningen sker exakt på det angivna datumet med full säkerhet.
Dag 8: vad vi skulle hoppa över och vad vi skulle göra först
- Hoppa över hela avkastningsbaserade ramverket. Anpassa inte ett risklager med volatilitetsstyrning till ett instrument med slutlig utbetalning. Skriv ett lager för vadstorlek som arbetar med sannolikhet och insats. Vi förlorade två dagar på att försöka få det gamla att passa.
- Bygg avgiftsfunktionen före strategin. Visa kurvan för nödvändig edge för att gå jämnt upp på varje handelsplats du tänker handla på, och sätt upp den ovanför handelsbordet. Den dödar ungefär hälften av idéerna innan de kostar dig en backtestkörning.
- Gå igenom orderboken från dag 1. Alla parametriska modeller för marknadspåverkan som importeras från en kontinuerlig marknad blir fel på ett sätt som smickrar dig.
- Gruppera innan du räknar. Bestäm grupperingsnyckeln för effektiv urvalsstorlek samtidigt som du bestämmer marknadsuniversumet, inte efter att du fått en Sharpe du gillar.
- Kontrollera ifyllnadsriktningen. En rad per join. Om en serie slutar med facit ska bakåtifyllnad per konstruktion behandlas som en bugg, i stället för något du hoppas upptäcka vid granskning.
De 8 dagarna var värda det, mest för att prediktionsmarknader skalar bort den tvetydighet som gör det så lätt att lura sig själv med kryptobacktester. Det finns ingen fundingränta att vifta bort, ingen konvention för mark price att diskutera. Bara en fråga, en deadline och ett svar. När backtestet har fel här går det att peka på exakt vad som är fel.
← Alla inlägg


