Prediksjonsmarkeder ser ut som det enkleste i verden å backteste. Prisen ligger mellom [0, 1]. Utbetalingen er en dollar eller ingenting. Ingen giring, ingen funding, ingen basis, ingen evigvarende swap-raritet kl. 00:00 UTC. Vi hadde allerede en backtester som håndterte krypto-perps med gebyrer, funding og markedspåvirkning, og planen var å bruke to dager på å tilpasse den og deretter begynne å generere strategier.
Det tok åtte. Her er loggen, omtrent i kronologisk rekkefølge, inkludert dagen da egenkapitalkurven så utrolig ut, og var det.
Dag 1: adapteren som skulle være en enkel sak
Den første tilordningen var én-til-én og virket ryddig. Et marked er et instrument. YES-prisen er prisen. Å kjøpe YES er å gå long, å kjøpe NO er å gå short. Utfallet avklares, og posisjonen tvangslukkes på 1.00 eller 0.00. Mat inn den timebaserte prisserien i den samme hendelsesløkken, ferdig.
Den tilordningen holdt i omtrent nitti minutter med ekte data. Det første som røk, var avkastningsserien. Hele risikolaget vårt — posisjonsstørrelsen, volatilitetsmålrettingen og Sharpe-rapporteringen — forutsatte logavkastning fra et instrument som fortsetter å eksistere. Et marked som går fra 0.04 til 0.00 har en udefinert logavkastning og et definert totalt tap. Og et marked som ligger på 0.04 tre dager før utfallet avklares, er noe helt annet enn ett som ligger på 0.04 fire minutter før, selv om begge radene viser 0.04.
Vi endte med å omparametrisere hele serien etter tid til avklaring i stedet for klokketid, og behandle PnL som endelig i stedet for markedsført. Det var riktig valg, og det gjorde all rapporteringskode som bygde på dette ugyldig.
Dag 2: gebyrformelen er strategien
På Kalshi er handelsgebyret ikke et avslag målt i basispunkter. Det er kvadratisk i prisen: omtrent 0.07 × contracts × P × (1−P), rundet opp til nærmeste cent på ordrenivå. Det betyr at gebyret er størst akkurat der et myntkastmarked er mest interessant, og nesten gratis ute i ytterkantene.
| Pris | Gebyr per kontrakt | Nødvendig fortrinn (sannsynlighetspoeng) | Gebyr som andel av innsatsen |
|---|---|---|---|
| 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% |
Les den tredje kolonnen som det viktige: For å gå i null når du kjøper på 50¢ og holder til utfallet avklares, må sannsynlighetsestimatet ditt slå markedets med 1.75 poeng. Ikke 1.75 prosent relativt. Absolutt. Hvis du går ut før utfallet avklares i stedet for å holde, betaler du gebyret to ganger, pluss spreaden.
Polymarkets CLOB har historisk hatt en helt annen gebyrprofil, nær null for selve handelen, slik at hele kostnaden ligger i spread og dybde. Den samme strategilogikken får altså helt forskjellig økonomi avhengig av handelsplattform, og enhver sammenligning på tvers av plattformer som bruker én gebyrmodell, er fiksjon. Nå har vi en gebyrfunksjon per plattform, ikke én enkeltverdi.
Hvis du bare leser én linje i en backtestrapport for prediksjonsmarkeder, la det være gebyret uttrykt i sannsynlighetspoeng. En strategi som hevder å ha et prognosefortrinn på 1.2 poeng i markeder rundt 50¢, taper penger på Kalshi før noen andre kostnader regnes med. Dette skal stå synlig på første side, ikke være noe leseren må regne seg fram til.
Dag 3: ordreboken er trappeformet og kort
Markedspåvirkningsmodellen vår var en kvadratrotfunksjon kalibrert på ordrebøker for BTC-perps. Det er feil form. Med et tick på 1¢ på et instrument til $1 finnes det bare 99 mulige prisnivåer i hele ordreboken, og et marked med middels likviditet kan ha et par hundre kontrakter på øverste nivå og så et sprang.
Her er et øyeblikksbilde fra et marked knyttet til økonomiske data som vi samplet, på YES-siden, omtrent 30 timer før utfallet ble avklart:
| Nivå | Størrelse (kontrakter) | Samlet kjøpskostnad |
|---|---|---|
| 42¢ | 310 | 310 @ 42.0¢ snitt |
| 43¢ | 85 | 395 @ 42.2¢ snitt |
| 45¢ | 140 | 535 @ 42.9¢ snitt |
| 49¢ | 600 | 1,135 @ 46.1¢ snitt |
En ordre på 1,000 kontrakter — fem hundre dollar i risiko, en avrundingsfeil i krypto — flytter den effektive prisen med fire cent. Fire cent er mer enn dobbelt så mye som gebyret. Det finnes ingen jevn funksjon å tilpasse her; du må gå gjennom ordreboken nivå for nivå, ellers finner du på tallene. Vi fjernet sqrt-modellen for denne aktivaklassen og skrev en bokstavelig ordrebokvandrer, som er tregere og riktig.
Et sted her tok jeg meg i å irritere meg over at disse markedene er «for små til å bety noe». De er små fordi det som prises, er ett konkret spørsmål fra virkeligheten med en frist, og det finnes bare så mange som har en mening om førstegangssøknader om dagpenger i USA på en onsdag. Størrelsen er markedet. Å klage på det er som å klage over at et pokerbord bare har plass til ni.
Dag 4: dagen da egenkapitalkurven var vakker
Sharpe 4.1 på 1,400 markeder. Jevn. Alle forskere burde få en klump i magen av dette, og det fikk jeg til slutt, omtrent førti minutter etter at jeg allerede hadde tatt et skjermbilde av den.
Feilen lå i resampleren. Prishistorikken for illikvide markeder kommer med uregelmessige tidsstempler, så vi indekserte den på nytt mot et jevnt timebasert rutenett. Det siste punktet i hver arkiverte serie er oppgjørsverdien, 1.00 eller 0.00. Reindekseringen vår brukte nærmeste nabo-fyll uten begrensning på retning, så for alle markeder der siste handel var timer før utfallet ble avklart, spredte oppgjørsverdien seg bakover over mellomrommet. Modellen leste morgendagens svar i dagens rad, nettopp for de illikvide markedene der den kunne øke posisjonen uten å treffe dybdegrensene.
Fyll med nærmeste nabo fungerer fint på et kontinuerlig instrument. På et instrument der den siste observasjonen er fasiten, blir det en maskin for framtidslekkasje. Nå sjekker vi at all utfylling bare går framover, og at oppgjørsraden er merket og utelukket fra alle funksjonsberegninger. Den sjekken er ni linjer lang, og den er den mest verdifulle koden vi skrev hele uka.
Dag 5–6: 1,412 markeder, omtrent 180 veddemål
Utvalgsstørrelsen i prediksjonsmarkeder er en felle med et vennlig ansikt. Du får avklart 1,412 markeder, føler at du har 1,412 observasjoner og beregner en t-statistikk deretter. Men fjorten NFL-kamper samme søndag deler værsystem, publisering av skaderapporter og en felles strøm av spillere. Femtién delstatsbaserte valgmarkeder deler én nasjonal opinionstrend. «Vil X skje innen 31. mars» og «vil X skje innen 30. juni» er samme veddemål med ulik utløpsdato, og utfallene avklares samtidig.
Vi grupperte markeder etter underliggende hendelseskilde og dato for avklaring, og fikk et effektivt antall uavhengige observasjoner på rundt 180. Det er ikke nok til å skille en reell fordel fra støy ved effektstørrelsene vi undersøkte, og uansett hvor mye du bootstrapper per marked, løser det ikke problemet, fordi bootstrapen må trekke klynger på nytt, ikke enkeltrader. Gjør du dette feil, blåser du opp signifikansen med en faktor på to eller tre, uten at det merkes.
Dag 7: avklaring er også en sannsynlighetsfordeling
Dette hadde vi ikke modellert i det hele tatt, og oppdaget på den harde måten:
- Tidlig avklaring. Et marked som løper «innen 31. desember», kan avklares 4. august når hendelsen faktisk skjer. Kapitalen din frigjøres tidligere, og holdeperioden var aldri det kontraktsnavnet ga inntrykk av.
- Tvister. Markeder der en oracle fastsetter utfallet, har en innsigelsesperiode. En posisjon kan bli hengende i limbo i flere dager etter hendelsen, og i noen få tilfeller snur utfallet fra det åpenbare svaret.
- Annullering. Tvetydige kildedata fører til at et marked kanselleres og alle får innsatsen tilbake. I utvalget vårt gjelder dette under 1% av markedene, men de samler seg nettopp rundt de tvetydige spørsmålene en modell finner feilpriset.
- Kapitalbinding. Et fortrinn på 3 poeng realisert over 90 dager og et fortrinn på 3 poeng realisert over 6 timer kan ikke sammenlignes, og en backtest som rapporterer samlet fortrinn uten å ta hensyn til kapitalbindingstid, vil alltid foretrekke den langsomme varianten.
Vi la til et ledd for kapitalkostnad og tilfeldig variasjon i avklaringsdatoen i simulatoren. Ingen av delene er presise. Begge er bedre enn den implisitte antakelsen om at avklaringen skjer nøyaktig på den oppgitte datoen, helt sikkert.
Dag 8: hva vi ville droppet, og hva vi ville gjort først
- Dropp hele det avkastningsbaserte rammeverket. Ikke tilpass et risikolag med volatilitetsmålretting til et instrument med endelig utbetaling. Skriv et lag for innsatsstørrelse som arbeider med sannsynlighet og innsats. Vi mistet to dager på å prøve å få den gamle løsningen til å passe.
- Bygg gebyrfunksjonen før strategien. Vis kurven for nødvendig fortrinn for å gå i null for hver handelsplattform du skal handle på, og heng den opp over pulten. Den tar livet av omtrent halvparten av ideene før de koster deg en backtestkjøring.
- Gå gjennom ordreboken fra dag én. Alle parametriske modeller for markedspåvirkning hentet fra et kontinuerlig marked vil ta feil på en måte som smigrer deg.
- Grupper før du teller. Bestem grupperingsnøkkelen for effektiv utvalgsstørrelse samtidig som du bestemmer universet, ikke etter at du har fått en Sharpe du liker.
- Kontroller retningen på utfyllingen. Én linje per join. Hvis en serie ender med fasiten, behandle bakoverfylling som en feil per definisjon, i stedet for noe du håper å oppdage i kodegjennomgangen.
De åtte dagene var verdt det, først og fremst fordi prediksjonsmarkeder fjerner tvetydigheten som gjør det så lett å lure seg selv med kryptobacktester. Ingen fundingrate å vifte bort, ingen konvensjon for markedspris å krangle om. Bare et spørsmål, en frist og et svar. Når backtesten tar feil her, kan du peke på akkurat hva som gikk galt.
← Alle innlegg


