5 september 2026 · risico

Je backtest werd nooit geliquideerd: margin, mark price en de hefboomgrens die je oversloeg

Je backtest werd nooit geliquideerd: margin, mark price en de hefboomgrens die je oversloeg

Vorige maand kwam er een vermogenscurve uit een gegenereerde strategie met een drawdown van 63%. Diep, lelijk, gevolgd door een strak herstel in de zes weken erna — zo'n patroon waar een onderzoeker naar tuurt en besluit dat het te overleven is als je je positieomvang verkleint. Ik draaide de strategie opnieuw door een margin engine die weet wat een onderhoudsmargintier is. De rekening werd op dag 41 geliquideerd, midden in die drawdown, en alles rechts van dag 41 was fictie.

Dit is de duurste klasse backtestbugs die ik ken, omdat die je rendement niet met een paar basispunten vertekenen. Ze verwijderen een absorberende toestand uit de simulatie. Een strategie die naar nul kan gaan en een strategie die dat niet kan, zijn verschillende strategieën. Een backtest die margin nooit controleert, kan je niet vertellen welke je hebt.

Drie manieren waarop ik dit steeds verkeerd zie doen.

Fout één: hefboom als een getal waarmee je de rendementen vermenigvuldigt

De meest voorkomende variant. Je berekent een rendementenreeks op basis van je signalen, besluit dat je met 10x gaat handelen en vermenigvuldigt de reeks. Soms is het iets geavanceerder — de positiegrootte is equity * leverage / price — maar de rekeningtoestand is nog steeds slechts een getal dat op en neer gaat. Geen margesaldo, geen limiet op de nominale waarde, geen faalconditie.

De schade is subtiel, en daarom komt die door reviews heen. Sharpe is schaalinvariant, dus je kerncijfer verandert niet als je de hefboom van 3x naar 30x verhoogt. De onderzoeker concludeert dan dat hefboom een gratis draaiknop is waarmee je volatiliteit tegen rendement inruilt. De maximale drawdown schaalt lineair en blijft door een rekenkundig toeval onder 100%, omdat een reeks vermenigvuldigde rendementen asymptotisch naar nul nadert zonder er ooit onder te komen. Vermenigvuldig een dag van -9% met 12 en je krijgt in de eerlijke versie -108%, en in de naïeve versie '-108%, maar de vermogenscurve is nog steeds positief', afhankelijk van of je samengesteld rendement berekende of de rendementen optelde. Ik heb beide gezien.

Wat ontbreekt, is dat je hefboom niet op je rendementen toepast. Je past die toe op je onderpand, en onderpand is een eindige hoeveelheid die de beurs elke seconde in de gaten houdt. Zodra het onder de onderhoudsvereiste zakt, is de positie niet langer van jou.

Het teken: als je simulatie bij geen enkele hefboom een totaalverlies kan opleveren, modelleert die geen hefboom.

Fout twee: een liquidatieprijs die alleen uit de hefboom wordt afgeleid

De volgende stap in verfijning voegt een liquidatiecontrole toe, meestal ongeveer zo: bij 20x veegt een ongunstige beweging van 5% de margin weg, dus liquideer je een longpositie op instapprijs × 0.95. Helder, intuïtief en op vier afzonderlijke manieren tegelijk fout.

Perp-platforms bepalen niet aan de hand van je hefboominstelling wanneer het afgelopen is. Ze gebruiken een onderhoudsmarginratio die stapsgewijs stijgt met de nominale positiewaarde, volgens een tabel met tiers. Dit is ongeveer de vorm van BTCUSDT USDⓈ-M; de waarden veranderen wanneer platforms ze herzien:

Nominale positiewaarde (USDT)OnderhoudsmarginratioMax. hefboom
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

De ongunstige beweging die je bij een geïsoleerde longpositie kunt opvangen, is dus ongeveer 1/L − MMR, niet 1/L. Bij 20x in de tweede tier is dat 5% − 0.5% = 4.5%. Een half procent klinkt als afronding. Bij BTC op 84,000 is dat 420 dollar aan prijsbeweging, en in een onrustig uur is 420 dollar het verschil tussen een wick die je eruit haalde en een die dat niet deed. Elke wick is een muntworp, en je hebt ze allemaal in je voordeel laten uitvallen.

Dan zijn er nog de kosten. De taker fee bij instap gaat van je margin af zodra je order wordt uitgevoerd: 0.045% over een nominale waarde van 500,000 is 225 USDT op een margesaldo van 25,000. Daardoor verschuift de liquidatieprijs nog voordat de positie ook maar iets heeft gedaan. Funding werkt net zo, doorlopend, en op een positie met hefboom is het veel groter dan onderzoekers verwachten:

4.55%werkelijke ongunstige beweging tot liquidatie bij 20x, inclusief instapfee
0.60%dagelijkse fundingdruk op margin bij 20x, 0.01%/8h
18%van die margin verdwenen in een vlakke maand

Een positie die dertig dagen niets doet — geen ongunstige beweging, geen transacties — heeft bijna een vijfde van haar onderpand verbruikt en haar liquidatieprijs flink dichterbij gebracht. De derde en vierde fout: tiers veranderen als je opschaalt. Een positie die begint in de tier van 0.5% en door bijkopen in de tier van 1.0% belandt, krijgt een ongunstigere liquidatieprijs dan de prijs die je bij instap berekende. En cross margin bundelt onderpand over posities, dus of je BTC-long overeind blijft, hangt af van wat je ETH-short doet. Als je cross margin simuleert als een reeks onafhankelijke geïsoleerde posities, heb je de correlatiestructuur van je eigen rekening verkeerd om.

Fout drie: liquidatie afhandelen op de verkeerde prijs, op het verkeerde moment en tegen de verkeerde uitvoeringsprijs

Stel dat je het triggerniveau goed hebt. Dan blijft de vraag: welke prijs overschrijdt het, wanneer controleer je dat en tegen welke prijs wordt je order uitgevoerd?

Liquidatie wordt geactiveerd op basis van de mark price, een index van meerdere spotplatforms met een afgevlakte basiscomponent, die bewust zo is opgebouwd dat een wick op één platform niet doorslaggevend is. Je stop-loss wordt, afhankelijk van je instellingen, waarschijnlijk geactiveerd op basis van de laatst verhandelde prijs. Die twee prijzen lopen precies uiteen wanneer het er het meest toe doet. Tijdens een cascade kan de laatste prijs van de perp tientallen seconden lang 1–2% onder de mark price liggen. Een backtest die zowel de stop als de liquidatie baseert op dezelfde OHLCV-low, modelleert een platform dat niet bestaat.

Beide fouten zijn hier relevant en ze heffen elkaar niet op. Op basis van de laatste prijs liquideer je op wicks die het platform negeerde. Op basis van de mark price mis je het geval waarin de mark zelf bewoog: een ontkoppeling van de index op een spotplatform is een reële manier om geliquideerd te worden tegen een prijs die nooit op de perp waarin je handelde is verschenen.

Dan de uitvoering. Naïeve engines sluiten de positie op de liquidatieprijs en boeken het verlies alsof het een stop was. In werkelijkheid neemt de liquidatie-engine de positie over tegen de faillissementsprijs — het niveau waarop je margin precies nul is, ongunstiger dan de trigger — en wordt daarbovenop een afwikkelingsfee gerekend. Die hangt af van de tier en bedraagt bij de lagere tiers ongeveer 1% van de nominale waarde. Bij 20x is 1% van de nominale waarde 20% van je resterende margin. Voert de engine de order uit onder de faillissementsprijs, dan dekt het verzekeringsfonds het verschil. Op sommige platforms kan het verlies, als het fonds leeg is, worden gedeeld met de winstgevende kant van het orderboek. Je gerealiseerde verlies is niet de drawdown tot aan de liquidatieprijs. Het is groter, en het overschot is het grootst op de dagen waarop het orderboek dun genoeg was om het verlies te verergeren.

Ook de timingvraag uit de intrabar-mechanica speelt hier, met scherpere gevolgen dan gewoonlijk. Bevat een 1-minute candle zowel je take-profit als je liquidatieniveau, dan boekt een backtest die exits vóór margin controleert vrolijk de winst. Het platform controleert margin bij elke update van de mark price, ongeveer één keer per seconde, vóór alles wat je verder had willen laten gebeuren.

Wat de engine in plaats daarvan moet bijhouden

Dit hoeft allemaal niet ingewikkeld te zijn. De simulatie moet wel toestand bijhouden. De rekening is een object met een saldo, geen rendementenreeks, en bij elke candle wordt die bijgewerkt in de volgorde waarin het platform dat zou doen:

  1. Walletsaldo en ongerealiseerde PnL, apart bijgehouden. De marginratio is de onderhoudsmargin gedeeld door het margesaldo, en het margesaldo omvat de ongerealiseerde PnL. Als je die samenvoegt, lijkt een verlieslatende positie beter gedekt dan ze is.
  2. De tiertabel voor elk symbool, met een versiedatum. Tiers worden herzien. Een backtest uit 2023 draaien met de tiers van 2026 is een subtiele vorm van look-ahead — meestal in je voordeel, want platforms hebben de vereisten voor grote munten over het algemeen versoepeld.
  3. Een mark price-reeks, niet alleen candles. Kun je geen historische mark price-data vinden, vermeld dat dan in de resultaten en gebruik een conservatieve benadering. Vervang die nooit stilzwijgend door de laatste prijs.
  4. De margincontrole eerst in de volgorde van gebeurtenissen binnen de candle, vóór stops, targets, signalen of herbalancering.
  5. Uitvoering tegen de faillissementsprijs plus de afwikkelingsfee, waarbij het feepercentage uit dezelfde tierrij komt als de MMR.
  6. Een absorberende eindtoestand. Zodra het eigen vermogen nul bereikt, stopt de run. Geen herbasering, geen 'ga ervan uit dat de trader geld bijstort', geen voortzetting van de reeks met een nieuwe nominale waarde.

Dat laatste leidt tot de meeste discussies. Iemand merkt altijd op dat een echte desk meer onderpand zou storten, dus dat de simulatie beëindigen onrealistisch streng is. Misschien. Maar 'deze strategie werkt als je er geld in blijft pompen nadat die is opgeblazen' is een bewering die je precies zo moet formuleren en bewust moet testen, met de bijstortingen als expliciete invoer. Je moet ze niet ongemerkt als standaardinstelling opnemen. Zodra je het eerlijk opschrijft, ontdekken de meeste mensen dat ze het niet zo bedoelden.

Het praktische voordeel hiervan: als je dezelfde strategie op papier tegen het live platform draait, zouden de marginratio van de beurs en die van je simulator de hele dag binnen een basispunt of twee bij elkaar moeten blijven. Dat kun je gratis elke minuut controleren, voor elke open positie. Het is de goedkoopste pariteitstest in de hele stack en bijna niemand voert die uit. En als de twee getallen uiteenlopen, heeft de beurs gelijk en heb je een bug die je beter kunt opsporen voordat de drawdown dat voor je doet.

perpetual futureshefboomliquidatiemargin enginebacktesten
← Alle artikelen