5. syyskuu 2026 · risk

Backtestisi ei koskaan realisoitu: marginaali, markkinahinta ja vivutusraja, jonka sivuutit

Backtestisi ei koskaan realisoitu: marginaali, markkinahinta ja vivutusraja, jonka sivuutit

Viime kuussa generoitu strategia tuotti pääomakäyrän, jossa oli 63 %:n drawdown. Syvä ja ruma pudotus, jota seurasi siisti palautuminen seuraavan 6 viikon aikana — sellainen kuvio, jota tutkija katsoo siristäen silmiään ja päättää sen olevan kestettävissä, jos positiokokoa pienennetään. Ajoin sen uudelleen marginaalimoottorilla, joka tuntee ylläpitomarginaalin portaat. Tili likvidoitiin 41. päivänä, keskellä pudotusta, ja kaikki 41. päivän jälkeinen oli kuvitelmaa.

Tämä on kallein tuntemani backtestausvirheiden luokka, sillä se ei vääristä tuottoja muutamalla korkopisteellä. Se poistaa simulaatiosta tilan, josta ei ole paluuta. Strategia, joka voi menettää kaiken, ja strategia, joka ei voi, ovat eri strategioita. Backtesti, joka ei koskaan tarkista marginaalia, ei voi kertoa, kumpi sinulla on.

Näen tämän tehtävän väärin yhä kolmella tavalla.

Väärä tapa 1: vivutus lukuna, jolla kerrotaan tuotot

Yleisin tapa. Lasket signaaleistasi tuottosarjan, päätät käyttää 10x-vivutusta ja kerrot sillä tuotot. Joskus ratkaisu on hieman hienostuneempi — position koko on equity * leverage / price — mutta tilin tila on silti vain ylös ja alas liikkuva kerroin. Ei marginaalisaldoa, nimellisarvon ylärajaa eikä ehtoa, joka pysäyttäisi toiminnan.

Vahingot ovat hienovaraisia, minkä takia ne menevät läpi katselmoinnista. Sharpe on skaala-invariantti, joten otsikkolukusi ei muutu, kun vaihdat vivutuksen 3x:stä 30x:ään. Tutkija päättelee, että vivutus on ilmainen säädin, jolla vaihdetaan volatiliteettia tuottoon. Maksimidrawdown skaalautuu lineaarisesti ja pysyy alle 100 %:n laskennallisen sattuman ansiosta, koska kerrottujen tuottojen sarja lähestyy nollaa asymptoottisesti mutta ei koskaan ylitä sitä. Kun -9 %:n päivä kerrotaan 12:lla, rehellisessä mallissa tulos on -108 %, kun taas naiivi malli näyttää "-108 %, mutta pääomakäyrä on silti positiivinen" riippuen siitä, kerroitko tuotot korkoa korolle vai summasitko ne. Olen nähnyt molempia.

Puuttuu se, ettei vivutusta kohdisteta tuottoihin. Se kohdistetaan vakuuksiisi, ja vakuudet ovat rajallinen määrä, jota pörssi valvoo joka sekunti. Kun ne laskevat alle ylläpitovaatimuksen, positio ei enää ole sinun.

Tunnusmerkki: jos simulaatiosi ei voi tuottaa täyttä tappiota millään vivutuksella, se ei mallinna vivutusta.

Väärä tapa 2: likvidointihinta, joka lasketaan pelkän vivutuksen perusteella

Seuraava taso lisää likvidointitarkistuksen, yleensä tähän tapaan: 20x-vivutuksella 5 %:n epäsuotuisa liike pyyhkii marginaalin, joten pitkä positio likvidoidaan hinnassa avaus × 0,95. Siistiä, intuitiivista ja väärin 4 eri tavalla yhtä aikaa.

Perpetual-futuuripörssit eivät käytä valitsemaasi vivutusta päättääkseen, milloin pelisi on ohi. Ne käyttävät ylläpitomarginaaliprosenttia, joka nousee position nimellisarvon kasvaessa porrastetun taulukon mukaan. BTCUSDT USDⓈ-M:n likimääräinen rakenne, joka muuttuu pörssien päivittäessä sitä:

Position nimellisarvo (USDT)YlläpitomarginaaliprosenttiEnimmäisvivutus
0 – 50,0000.40%125x
50,000 – 600,0000.50%100x
600,000 – 3,000,0001.00%50x
3,000,000 – 12,000,0002.50%20x
12,000,000 – 70,000,0005.00%10x

Eristetyssä pitkässä positiossa kestettävä epäsuotuisa liike on siis suunnilleen 1/L − MMR, ei 1/L. 20x-vivutuksella toisella portaalla se on 5 % − 0.5 % = 4.5 %. Puoli prosenttia kuulostaa pyöristysvirheeltä. Kun BTC:n hinta on 84,000, se tarkoittaa 420 dollarin liikettä hinnassa. Rajun tunnin aikana 420 dollaria ratkaisee, osuiko likvidointi sinuun aiheuttaneeseen varjoon vai ei. Jokainen varjo on kolikonheitto, ja olet kallistanut ne kaikki eduksesi.

Sitten tulevat kulut. Avaavan position taker-maksu vähennetään marginaalista heti täytön yhteydessä: 0.045 % 500,000:n nimellisarvosta on 225 USDT:tä, joka veloitetaan 25,000:n marginaalisaldosta. Tämä siirtää likvidointihintaa ennen kuin positio on ehtinyt tehdä mitään. Rahoitusmaksu vaikuttaa samalla tavalla jatkuvasti, ja vivutetusta nimellisarvosta laskettuna se on paljon suurempi kuin tutkijat odottavat:

4.55%todellinen epäsuotuisa liike likvidointiin 20x-vivutuksella, avausmaksu mukaan lukien
0.60%päivittäinen rahoitusmaksun rasitus marginaalille 20x-vivutuksella, 0.01%/8h
18%marginaalista hävinnyt vakaassa kuukaudessa

Positio, joka ei tee mitään 30 päivään — ei epäsuotuisaa liikettä eikä kauppoja — on kuluttanut lähes viidenneksen vakuuksistaan ja tuonut likvidointihintaa selvästi lähemmäs. Kolmas ja neljäs virhe: portaat vaihtuvat, kun kasvatat positiota. Positio, joka alkaa 0.5 %:n portaalla ja kasvaa keskihintaa laskemalla 1.0 %:n portaalle, saa huonomman likvidointihinnan kuin avaushetkellä laskettu. Lisäksi cross margin yhdistää vakuudet positioiden välillä, joten BTC-longisi selviytyminen riippuu siitä, mitä ETH-shortillesi tapahtuu. Jos simuloit cross marginia erillisten eristettyjen positioiden joukkona, olet mallintanut oman tilisi korrelaatiot rakenteen väärin.

Väärä tapa 3: likvidoinnin käsittely väärällä hinnalla, väärään aikaan ja väärällä täyttöhinnalla

Oletetaan, että sait laukaisutason oikein. Seuraavaksi: mikä hinta ylittää sen, milloin tarkistat asian ja millä hinnalla positiosi täytetään?

Likvidoinnin laukaisee markkinahinta, joka on usean spot-pörssin indeksi tasoitetulla preemiokomponentilla. Se on tarkoituksella rakennettu kestämään yksittäisen pörssin hintavarjot. Stop-lossisi laukeaa asetuksistasi riippuen luultavasti viimeisestä kaupankäyntihinnasta. Nämä 2 lukua eroavat toisistaan juuri silloin, kun sillä on eniten merkitystä. Ketjureaktion aikana perpetual-futuurin viimeinen hinta voi erkaantua markkinahinnasta 1–2 % kymmeniksi sekunneiksi. Backtesti, joka tarkistaa sekä stopin että likvidoinnin saman OHLCV-kynttilän alimmasta hinnasta, mallintaa pörssiä, jota ei ole olemassa.

Molemmat virheet ovat tässä mukana, eivätkä ne kumoa toisiaan. Viimeisen hinnan perusteella likvidoidaan varjoissa, jotka pörssi sivuutti. Markkinahinnan perusteella taas jää huomaamatta tapaus, jossa markkinahinta itse liikkui — spot-pörssin indeksin erkaantuminen on todellinen tapa tulla likvidoiduksi hinnassa, jota ei koskaan nähty käymässä siinä perpetual-futuurissa, jolla kävit kauppaa.

Sitten täyttöhinta. Naiivit moottorit sulkevat position likvidointihinnassa ja kirjaavat tappion kuin kyseessä olisi stop. Todellisuudessa likvidointimoottori ottaa position haltuunsa konkurssihinnassa — tasolla, jolla marginaalisi on täsmälleen nolla ja joka on laukaisutasoa huonompi — ja lisäksi veloitetaan portaan mukaan määräytyvä selvitysmaksu, joka on alemmilla portailla noin 1 % nimellisarvosta. 20x-vivutuksella 1 % nimellisarvosta on 20 % jäljellä olevasta marginaalistasi. Jos moottori täyttää position konkurssihintaa huonompaan hintaan, vakuutusrahasto kattaa erotuksen. Joissakin pörsseissä rahaston tyhjennyttyä sosiaalistettu tappio ulottuu myös kirjanpidon voitolliselle puolelle. Toteutunut tappiosi ei ole pudotus likvidointihintaan asti. Se on suurempi, ja ylimääräinen tappio on suurimmillaan juuri niinä päivinä, jolloin ohut kirja pahensi tilannetta eniten.

Myös kynttilänsisäisen mekaniikan ajoituskysymys pätee tässä, tavallista terävämmin. Jos 1-minute-kynttilä sisältää sekä take-profit- että likvidointitason, backtesti, joka tarkistaa poistumiset ennen marginaalia, kirjaa mielellään voiton. Pörssi tarkistaa marginaalin jokaisella markkinahinnan päivityksellä, suunnilleen kerran sekunnissa, ennen kaikkea muuta, mitä olit halunnut tapahtuvan.

Mitä moottorin pitää seurata sen sijaan

Mikään tästä ei vaadi eksoottisia ratkaisuja. Tila pitää vain tallentaa. Tili on saldon sisältävä olio, ei tuottosarja, ja jokainen kynttilä päivittää sen siinä järjestyksessä kuin pörssi sen tekisi:

  1. Lompakon saldo ja realisoitumaton PnL erikseen. Marginaalisuhde on ylläpitomarginaali jaettuna marginaalisaldolla, johon realisoitumaton PnL sisältyy. Niiden sekoittaminen saa tappiollisen position näyttämään paremmin vakuutetulta kuin se on.
  2. Kunkin symbolin porras taulukkona, versioituna päivämäärän mukaan. Portaita päivitetään. Vuoden 2023 backtesti vuoden 2026 portailla on hienovarainen tulevaisuustiedon vuoto — yleensä edullinen, koska pörssit ovat ajan mittaan yleensä höllentäneet suurten kohteiden vaatimuksia.
  3. Markkinahintasarja, ei vain kline-dataa. Jos et saa markkinahistoriaa, kerro se tuloksissa ja käytä varovaista arviota. Älä koskaan korvaa sitä hiljaisesti viimeisellä hinnalla.
  4. Marginaalitarkistus ensin kynttilän tapahtumajärjestyksessä, ennen stoppeja, tavoitteita, signaaleja tai tasapainotusta.
  5. Täytöt konkurssihinnassa sekä selvitysmaksu, jonka prosentti luetaan samalta porrastaulukon riviltä kuin MMR.
  6. Lopullinen tila, josta ei ole paluuta. Kun pääoma saavuttaa nollan, ajo päättyy. Ei saldon uudelleenlaskentaa, ei oletusta "treidaaja lisää varoja" eikä sarjan jatkamista uudesta nimellisarvosta.

Juuri viimeisestä kohdasta syntyy eniten väittelyä. Joku huomauttaa aina, että oikea treidaustiimi tallettaisi lisää vakuuksia, joten simulaation päättäminen on epärealistisen ankaraa. Ehkä. Mutta väite "tämä strategia toimii, jos jatkat sen rahoittamista sen romahdettua" ansaitsee tulla sanotuksi juuri näin ja testatuksi tarkoituksella. Lisätalletukset pitää antaa syötteenä sen sijaan, että ne ujuttaisi mukaan oletusarvona. Kun asian kirjoittaa rehellisesti auki, useimmat huomaavat, etteivät he tarkoittaneet sitä.

Tämän käytännön hyöty on se, että kun ajat samaa strategiaa paperilla reaaliaikaista pörssiä vasten, pörssin ilmoittaman marginaalisuhteen ja simulaattorisi laskeman suhteen pitäisi seurata toisiaan yhden tai kahden korkopisteen sisällä koko päivän. Yhtäpitävyyden voi tarkistaa ilmaiseksi joka minuutti jokaisesta avoimesta positiosta. Se on koko järjestelmän halvin pariteettitesti, ja tuskin kukaan tekee sitä. Kun luvut erkanevat, pörssi on oikeassa ja sinulla on virhe, joka kannattaa löytää ennen kuin drawdown löytää sen puolestasi.

perpetual-futuuritvivutuslikvidointimarginaalimoottoribacktestaus
← Kaikki kirjoitukset