En egenkapitalkurve fra en generert strategi viste et fall på 63% i forrige måned. Dypt, stygt, og så en ren innhenting over de neste 6 ukene — den typen kurve en analytiker gransker og bestemmer seg for at kan tåles hvis man reduserer posisjonsstørrelsen. Jeg kjørte den på nytt gjennom en marginkalkulator som kjenner til nivåer for vedlikeholdsmargin. Kontoen ble likvidert på dag 41, midt i fallet, og alt etter dag 41 var fiksjon.
Dette er den dyreste typen feil i backtesting jeg kjenner til, fordi den ikke forvrenger avkastningen med noen få basispunkter. Den fjerner en absorberende tilstand fra simuleringen. En strategi som kan gå til null og en strategi som ikke kan det, er forskjellige strategier, og en backtest som aldri sjekker margin, kan ikke fortelle deg hvilken av dem du har.
Jeg ser stadig at det gjøres feil på 3 måter.
Feil måte 1: giring som et tall du ganger avkastningen med
Den vanligste varianten. Du beregner en avkastningsserie fra signalene dine, bestemmer deg for å kjøre den med 10x giring og ganger med 10. Noen ganger er det litt mer avansert — posisjonsstørrelsen er equity * leverage / price — men kontotilstanden er fortsatt bare en skalar som går opp og ned. Ingen marginbalanse, ingen grense for nominell verdi, ingen betingelse for når alt går galt.
Skadene er subtile, og derfor overlever feilen gjennomgangen. Sharpe er skaleringsinvariant, så hovedtallet endres ikke når du øker giringen fra 3x til 30x, og analytikeren konkluderer med at giring er en gratis innstilling som bytter volatilitet mot avkastning. Maksimalt fall skalerer lineært og holder seg under 100% ved et aritmetisk sammentreff, fordi en serie multipliserte avkastninger nærmer seg null asymptotisk uten å krysse den. Multipliser en dag med -9% med 12, så får du -108% i den korrekte versjonen og «-108%, men egenkapitalkurven er fortsatt positiv» i den naive, avhengig av om du rentes rente-beregnet eller summerte. Jeg har sett begge deler.
Det som mangler, er at giringen ikke brukes på avkastningen. Den brukes på sikkerheten, og sikkerheten er et begrenset beløp som handelsplattformen overvåker hvert sekund. Når den faller under kravet til vedlikeholdsmargin, er ikke posisjonen din lenger.
Tegn på feilen: Hvis simuleringen din ikke kan gi totaltap ved noen giring, modellerer den ikke giring.
Feil måte 2: en likvideringspris beregnet ut fra giringen alene
Neste nivå av sofistikering legger til en likvideringssjekk, vanligvis omtrent slik: Ved 20x utsletter en ugunstig kursbevegelse på 5% marginen, så likvider på inngangskurs × 0.95 for en long. Enkelt, intuitivt og feil på 4 forskjellige måter samtidig.
Perpetual-plattformer bruker ikke giringsinnstillingen din til å avgjøre når det er slutt. De bruker en vedlikeholdsmarginsats som øker trinnvis med posisjonens nominelle verdi, i henhold til en nivåtabel. Omtrentlig struktur for BTCUSDT USDⓈ-M, som endres når handelsplattformene reviderer den:
| Posisjonens nominelle verdi (USDT) | Vedlikeholdsmarginsats | Maksimal giring |
|---|---|---|
| 0 – 50,000 | 0.40% | 125x |
| 50,000 – 600,000 | 0.50% | 100x |
| 600,000 – 3,000,000 | 1.00% | 50x |
| 3,000,000 – 12,000,000 | 2.50% | 20x |
| 12,000,000 – 70,000,000 | 5.00% | 10x |
Den ugunstige kursbevegelsen en isolert long kan tåle, er altså omtrent 1/L − MMR, ikke 1/L. Ved 20x i nivå 2 er den 5% − 0.5% = 4.5%. En halv prosent høres ut som avrunding. For BTC til 84,000 er det 420 dollar i kursverdi, og i en voldsom time er 420 dollar forskjellen på en wick som utløste likvidering og en som ikke gjorde det. Hver wick blir et myntkast, og du har vektet dem alle i din favør.
Så kommer gebyrene. Taker-gebyret ved inngang trekkes fra marginen din idet ordren fylles: 0.045% av en nominell verdi på 500,000 er 225 USDT mot en marginbalanse på 25,000, noe som flytter likvideringsprisen før posisjonen har rukket å gjøre noe som helst. Funding gjør det samme kontinuerlig, og på gearet nominell verdi er effekten mye større enn analytikere forventer:
En posisjon som ikke gjør noe på 30 dager — ingen ugunstig kursbevegelse, ingen handler — har brukt opp nesten en femtedel av sikkerheten og flyttet likvideringsprisen merkbart nærmere. Den tredje og fjerde feilen er at nivået endres når du bygger opp posisjonen, slik at en posisjon som starter på nivået med 0.5% og økes til nivået med 1.0%, får en dårligere likvideringspris enn den du beregnet ved inngang; og at kryssmargin samler sikkerhet på tvers av posisjoner, slik at om BTC-longen din overlever, avhenger av hva ETH-shorten din gjør. Hvis du simulerer kryssmargin som et sett med uavhengige isolerte posisjoner, har du snudd korrelasjonsstrukturen i din egen konto på hodet.
Feil måte 3: å avgjøre likvideringen med feil pris, på feil tidspunkt, til feil fyllkurs
La oss si at du traff riktig utløsingsnivå. Nå gjenstår spørsmålene: Hvilken pris krysser nivået, når sjekker du, og hvilken fyllkurs får du?
Likvidering utløses av markedsprisen, som er en indeks basert på flere spotplattformer med en utjevnet basisfaktor, bevisst laget for å motstå en wick på én enkelt plattform. Stop-loss-ordren din utløses sannsynligvis av sist omsatte pris, avhengig av hvordan du konfigurerte den. Disse 2 prisene avviker akkurat når det betyr mest. Under en likvideringskaskade kan perpetual-kontraktens siste pris ligge 1–2% under markedsprisen i flere titalls sekunder. En backtest som bruker samme OHLCV-lavpunkt for både stop-loss og likvidering, modellerer en handelsplattform som ikke finnes.
Begge feilene finnes her, og de opphever ikke hverandre. Bruker du sist omsatte pris, blir du likvidert av wick-er plattformen ignorerte. Bruker du markedsprisen, overser du tilfeller der selve markedsprisen flyttet seg — avvik i indeksen på en spotplattform er en reell måte å bli likvidert på til en pris som aldri ble registrert for perpetual-kontrakten du handlet.
Så er det fyllkursen. Naive kalkulatorer lukker posisjonen til likvideringsprisen og bokfører tapet som om det var en stop-loss. I virkeligheten overtar likvideringskalkulatoren posisjonen til konkursprisen — nivået der marginen din er nøyaktig null, og som er dårligere enn utløsningsnivået — og legger til et gebyr for likvideringsoppgjør. Gebyret avhenger av nivået og ligger rundt 1% av nominell verdi på de lavere nivåene. Ved 20x er 1% av nominell verdi 20% av den gjenværende marginen din. Hvis kalkulatoren fyller under konkursprisen, dekker forsikringsfondet mellomlegget; på noen handelsplattformer kan sosialisert tap ramme den lønnsomme siden av ordreboken hvis fondet er tømt. Det realiserte tapet ditt er ikke fallet fram til likvideringsprisen. Det er større, og overskytende tap er størst nettopp på dagene da ordreboken var tynn nok til å gjøre det verst.
Spørsmålet om timing fra intrabar-mekanikk gjelder også her, med enda større konsekvenser enn vanlig. Hvis en 1-minuttsbar inneholder både take-profit-nivået og likvideringsnivået ditt, vil en backtest som sjekker utganger før margin, gladelig bokføre gevinsten. Handelsplattformen sjekker margin ved hver oppdatering av markedsprisen, omtrent én gang i sekundet, før alt annet du måtte ønske skulle skje.
Dette må kalkulatoren holde oversikt over
Ingenting av dette trenger å være avansert. Det må holde rede på tilstanden. Kontoen er et objekt med en saldo, ikke en avkastningsserie, og for hver bar oppdateres den i samme rekkefølge som handelsplattformen ville brukt:
- Lommeboksaldo og urealisert PnL, separat. Marginforholdet er vedlikeholdsmargin delt på marginbalanse, og marginbalansen inkluderer urealisert PnL. Blander du disse sammen, ser en tapsbringende posisjon ut til å være bedre sikret enn den er.
- Nivåtabellen for hvert symbol, versjonert etter dato. Nivåene revideres. En backtest fra 2023 kjørt mot 2026-nivåer innebærer subtil bruk av framtidsinformasjon — vanligvis i din favør, siden handelsplattformer stort sett har lempet på kravene for store aktiva over tid.
- En serie med markedspriser, ikke bare kline-data. Hvis du ikke kan hente historikk for markedspriser, opplys om det i resultatene og bruk en konservativ tilnærming. Bytt aldri stilltiende ut med sist omsatte pris.
- Marginsjekk først i hendelsesrekkefølgen for baren, før stoppordrer, målkurser, signaler eller rebalansering.
- Fyll til konkurspris pluss oppgjørsgebyret, med gebyrsatsen hentet fra samme nivålinje som MMR.
- En absorberende sluttstatus. Når egenkapitalen treffer null, avsluttes kjøringen. Ingen ny basis, ingen «anta at traderen fyller på», og ingen videreføring av serien fra en ny nominell verdi.
Det siste punktet fører til flest diskusjoner. Noen påpeker alltid at et virkelig tradingbord ville satt inn mer sikkerhet, så det er urealistisk strengt å avslutte simuleringen. Kanskje. Men «denne strategien fungerer hvis du fortsetter å fylle på penger etter at den har gått på trynet» er en påstand som bør sies akkurat slik og testes med hensikt, med påfyll som en eksplisitt inndata, i stedet for å snike seg inn som standard. Når du først skriver det ærlig ned, oppdager de fleste at det ikke var det de mente.
Den praktiske gevinsten ved alt dette: Når du kjører samme strategi på papiret mot handelsplattformen i sanntid, bør marginforholdet som børsen rapporterer, og det simulatoren beregner, følge hverandre med et avvik på høyst 1 eller 2 basispunkter hele dagen. Det kan sjekkes gratis hvert minutt for hver åpen posisjon. Det er den billigste samsvarstesten i hele systemet, og nesten ingen kjører den — og når de 2 tallene avviker, har børsen rett, og du har en feil som er verdt å finne før fallet gjør det for deg.
← Alle innlegg


