Du sendte meg notatboken søndag kveld, og den har stått åpen på den andre skjermen siden. Tverrsnittsmomentum, de 150 Binance USDⓈ-M-perpetualene med høyest dollarvolum over 30 dager, ukentlig rebalansering, long på øverste desil og short på nederste, 2021-01 til 2026-06. Sharpe 2.31, maksimalt fall 14.2 %, og en kostnadsmodell som så troverdig ut: taker inn, taker ut, funding beregnet for hvert intervall, og et slippage-ledd som skalerer med størrelsen din målt mot ordreboken. Du gjorde de vanskelige tingene riktig. Så spurte du hvorfor seks uker med papirsimulering har gått i null, og om edge-en har blitt svakere.
Den ble ikke svakere. Den var aldri med i backtesten. Se på celle 4:
info = requests.get(BASE + "/fapi/v1/exchangeInfo").json()
symbols = [s["symbol"] for s in info["symbols"]
if s["status"] == "TRADING" and s["quoteAsset"] == "USDT"]
Du kalte dette endepunktet i juni 2026 og brukte svaret til å definere hva som kunne handles i mars 2021. Alle symbolene på listen overlevde til juni 2026, per definisjon. Det er hele feilen, og den betyr mer enn resten av kostnadsmodellen din til sammen.
Det endepunktet ikke forteller deg
Det finnes ingen historikk i exchangeInfo. Ingen asOf-parameter, ikke noe arkiv, ingen endringslogg. Det er et bilde av situasjonen akkurat nå, og Binance har aldri lovet deg noe annet. Når en kontrakt avnoteres, slettes oppføringen fra svaret, og tickeren slutter å eksistere sett fra API-et. Binance har notert over 600 USDⓈ-M-perpetualer siden 2019 og avviklet godt over hundre av dem. BTS, COCOS, TOMO, RAY, FTT, SC – en lang hale av kontrakter fra altcoin-sesongen i 2021 som hadde ett strålende kvartal, før omsetningen tynnet ut og handelsplassen trakk dem tilbake.
Spør deg selv hvilke navn en 30-dagers momentumscreen liker. Ikke BTC. Den liker det som nettopp tredoblet seg på en noteringspumpe og en Twitter-bølge. Disse gruppene overlapper i stor grad med dem som til slutt avnoteres, og universfilteret ditt fjernet overlappet.
Jeg kjørte analysen din på nytt mot øyeblikksbildearkivet vårt, med et punkt-i-tid-univers, samme signal og samme kostnader. Sharpe ble 0.74 med et fall på 31 %. Omtrent to femtedeler av avstanden skyldes avnoterte navn du aldri skulle ha kunnet holde. Ytterligere en fjerdedel skyldes det motsatte problemet, som er mer subtilt, og som jeg tror du liker enda dårligere.
Den andre enden av tidsmaskinen: symboler som ennå ikke fantes
Funksjonen din bruker avkastningen over 90 dager. Det rullerende vinduet har min_periods=20, fordi du satte det én gang for å hindre at oppvarmingen ødela det første kvartalet i utvalget, og aldri så på det igjen. Dermed får en kontrakt som ble notert for 21 dager siden en momentumscore beregnet på tre ukers prishistorikk etter notering. Den havner i øverste desil omtrent hver gang noteringen går bra, og kommer inn i porteføljen din.
Den delen kan forsvares. Her er det som ikke kan det: Dataleverandøren din har fylt inn data for noen av disse symbolene med spot- eller indeksdata fra før perpetualen fantes, så noen kontrakter har kline-historikk som går lenger tilbake enn deres egen onboardDate. Du kan sjekke dette på omtrent ett minutt. Koble pristabellen mot noteringsdatoene, og tell radene før noteringen. I dataene dine har 41 symboler barer fra før notering, og ett av dem bidrar sommeren 2023 med en gevinst på 6 % på én uke til egenkapitalkurven, fra en posisjon i en kontrakt som ikke skulle finnes før ni dager senere.
En tickerstreng er ikke en identifikator. Det er en etikett børsen leier ut, noen ganger to ganger.
Så har vi navneendringer. MATICUSDT ble POLUSDT. FTMUSDT ble SUSDT etter en konvertering på 1:1. LUNA-situasjonen i mai 2022 etterlot seg en LUNCUSDT og senere en helt ny LUNAUSDT, med samme tickerrot som noe som mistet mer eller mindre alt. Hvis innleseren din bruker symbolstrengen som nøkkel og setter sammen filene den finner, har du minst én serie med et brudd som ikke skyldes en prisbevegelse. Momentumfunksjonen din vil lese bruddet som det sterkeste signalet i tverrsnittet.
Alt det andre som endrer seg underveis
Når du først godtar at symbolisten varierer over tid, gjelder det samme resonnementet for alle andre felt i svaret. Du bruker dagens verdier for dem alle.
| Felt | Hvordan det endrer seg | Hva som går galt |
|---|---|---|
| status | TRADING → SETTLING → borte | Overlevelsesskjevhet; fantomutganger til en sluttkurs som aldri ble handlet |
| onboardDate | Nye noteringer hver uke; mangler for døde symboler | Handle kontrakter før de fantes |
| tickSize / stepSize | Justeres når prisnivåene endrer seg | Avrunding av ordre og limitpriser som ville blitt avvist |
| minNotional | Heves over tid i ordrebøker med liten likviditet | Små posisjoner som den aktive ordredirigeringen din ville avvist |
| fundingIntervalHours | 8h i årevis, deretter 4h eller 1h for mange symboler | Carry feil med en faktor på 2–3× nettopp for altcoinene screeningen din holder |
| leverage brackets | Trinn og vedlikeholdsmargin revideres | Likvidasjonsmodellering og marginkapasitet |
Funding-biten svir mest i ditt tilfelle. Beregningsløkken din antar tre betalinger om dagen gjennom hele historikken. En betydelig del av altcoin-porteføljen gikk over til funding hver fjerde time, og det er shortposisjoner i navn med høy funding som står for mye av den simulerte PnL-en din. Avviket skyldes ikke en avrundingsfeil. Det skyldes en faktor.
Avnoteringen er en hendelse, og du modellerer den ikke
I den nye kjøringen med punkt-i-tid-data ga jeg strategien en raus utgang. I virkeligheten følger avnoteringer et fast forløp: en kunngjøring, vanligvis sju til fjorten dager i forveien, deretter en periode der bare posisjoner kan reduseres, og så tvangsoppgjør til en markpris. Kunngjøringen er offentlig informasjon, og du kan handle på den, så en redelig simulering går ut ved sluttkursen på kunngjøringsdagen. Men den kursen ligger allerede 10-20 % under kursen uka før ved en typisk avnotering av en altcoin. Ordreboken har liten likviditet, og slippage-leddet må vite at det nå opererer i et annet regime. Hvis utførelsesmotoren gir deg oppgjørskursen uten markedspåvirkning, har du i stillhet gjort døende aktiva omsettelige til virkelig verdi.
Hvis du aldri arkiverte exchangeInfo, er du ikke ute å kjøre. Den offentlige datadumpen på data.binance.vision/data/futures/um/monthly/klines/ har fortsatt kataloger for avnoterte symboler lenge etter at API-et har glemt dem. Gå gjennom katalogoversikten, så gir den første og siste månedsfilen for hvert symbol deg et brukbart vindu for notering og avnotering uten noen dataleverandør. Dette er en rekonstruksjon, ikke en logg, og den kan ikke gjenopprette tickstørrelser eller fundingintervaller. Men den forteller deg hvilke symboler som fantes når, og det dekker 80 % av det du trenger på mandag.
Dette ville jeg fått deg til å bygge før du rører signalet igjen
- En cron-jobb som henter exchangeInfo fra alle handelsplassene du undersøker, hver dag, og skriver det til objektlagring med dato som nøkkel. Gzip-komprimert er det under en halv megabyte. Ti år koster deg en avrundingsfeil i S3 og gir deg en forskningsmulighet du ikke kan kjøpe deg senere.
- En aktivamaster bygget fra disse øyeblikksbildene: én rad per (handelsplass, symbol, gyldig_fra, gyldig_til), med alle feltene. Sammenlign påfølgende øyeblikksbilder for å generere den, og behandle hver feltendring som en ny rad.
- En universfunksjon med et obligatorisk tidsstempelargument.
universe(ts), aldriuniverse(). Gjør standardvalget umulig, så ingen – heller ikke du selv i fremtiden klokka 1am – kan komme til å velge overleverlisten ved et uhell. - En kontroll før notering i datainnleseren: ingen bar kan finnes før
onboard_tsminus én dag. Stopp kjøringen; ikke vis en advarsel. - En stabil intern instrument-ID som overlever navneendringer, med tickeren som en vanlig attributt. Koble POL og MATIC til én ID, og merk redenomineringer slik at kontinuitetslogikken kan nekte å slå sammen serier på tvers av dem.
Gjør dette, og kjør analysen på nytt. Jeg tipper du lander nær 0.74, og da blir det interessante spørsmålet om en Sharpe på 0.74, som inkluderer de døde navnene, har noe i seg som er verdt å papirsimulere. Kanskje. Tverrsnittsmomentum i perpetualer er ikke verdiløst, og en del av det som står igjen etter at du retter universet, er reell carry fra short-siden. Du vil også se at resultatene fra papirsimuleringen begynner å samsvare med backtesten, fordi papirsimuleringen alltid har brukt et punkt-i-tid-univers. Den hadde ikke noe valg.
P.S. Dette er ikke et særtrekk ved krypto, det bare synes tydeligere her. Aksjeanalytikere har kjempet med avnoteringsavkastning og gjenbrukte tickere helt siden CRSP begynte å levere dem, og prediksjonsmarkeder tar det til det ytterste: Alle kontrakter utløper med vilje, så universet består bare av noteringer og avnoteringer. Hvis du noen gang overfører denne screeningen til Kalshi, bør du bygge aktivamasteren først. Der finnes det ingen annen type historikk.
← Alle innlegg


