De config zei starting_capital: 100000, en de y-as van de grafiek zei USD. Elke fill in het log was een USDC-getal. Elf maanden van die run leefden die twee feiten in dezelfde cel en niemand had reden om ze te splitsen.
Toen ging Silicon Valley Bank failliet, zei Circle dat $3.3 miljard aan USDC-reserves daar vastzat, en noteerde USDC 87 cent. Ons "dollar"-boek ging omhoog. BTC in USDC explodeerde. De perp printte groen. De cash die we als een risicovrije 100,000 hadden behandeld, was wat bewoog.
Ik betrap nog steeds researchpipelines die USDC, USDT en USD als één kolom markeren. Dit is dat weekend, uit elkaar getrokken in de volgorde waarin de ledger het zag.
De regel die $100,000 zei
Paperaccount, USDC-gemarginede BTC-perpetual, bescheiden long. 30,000 USDC BTC-notional, ongeveer 1.5 BTC op de vrijdagmark rond $20,150. De overige 70,000 zat als USDC-collateral. Bewust onderbelegd. We waren een strategie aan het opwarmen. De rest van de stack zat in cash.
De NAV-functie deed wat de meeste van hen doen. Hij telde USDC-cash op bij de ongerealiseerde USDC-pnl en schreef de som in een reeks genaamd equity_usd. Er stond een comment in de config die ik zelf had geschreven:
stablecoins = 1 dollar. FX niet dubbeltellen.
Ik had bedoeld: maak van een USDT-fundingbetaling geen tweede dollarbeweging door hem twee keer om te rekenen. Wat ik in werkelijkheid had gedaan, was de FX-koers voor de rest van het bestand op 1.0 bevriezen.
quote_asset = "USDC"
Het venue was een USDC-venue. Fills, margin, funding, liquidatiemarks, de lot size, de min notional, allemaal. Hyperliquid, dYdX v3, Coinbase International, een dozijn anderen, dezelfde vorm. Het researchnotebook importeerde een BTCUSDC-candle en een BTCUSD-candle, gebruikte de eerste om te traden, en zette de tweede op de plot omdat de plot professioneler oogde in dollars.
En dit is het kleine, stomme detail waar ik op rare uren nog aan denk: de standaard-astitel van de plotbibliotheek is "USD". Ik heb hem nooit overschreven. Mensen liepen langs het scherm en lazen een eenheid die de reeks niet had.
Vrijdagavond, de tweet van Circle
10 maart 2023. SVB is al weg. Circle maakt bekend dat $3.3 miljard van de toen ~$40 miljard USDC-reserve bij de failliete bank stond, ongeveer 8%. Coinbase schort diezelfde nacht USDC-conversies op. Redemption, het eigenlijke pegmechanisme, is het weekend gesloten.
De backtest had voor dit alles geen rij. Geen redemption-halt-flag, geen issuer-reserveveld, geen "kan ik voor maandag dollars voor dit token krijgen." Hij had een close. De close op vrijdag was in ons FX-bestand nog steeds 1.0000, omdat het FX-bestand een stub was die 1.0 teruggaf voor alles waarvan de ticker met USD begon.
Vroeger behandelde ik een USDT-premie als leerboekruis, het soort ding dat je in een voetnoot noemt en daarna negeert. We hebben ooit twintig minuten in een keuken gestaan te redetwisten of 1.03 "het boeken waard" was. We waren allebei aan het opiniëren. Het pair is een reeks. Sla het op. Stop met erover stemmen.
0.8789
Zaterdagochtend. De low van CoinGecko op USDC is $0.8789. Andere tapes printen $0.87. Een paar DEX-pools gaan door $0.80. DAI, volgestouwd met USDC als collateral, volgt hem naar beneden. USDT gaat de andere kant op, $1.03 op sommige schermen, $1.06 op Kraken.
Het stub-FX-bestand geeft nog steeds 1.0 terug. De klok van de backtest weet dat het zaterdag is. Hij weet niet dat de eenheid van het boek nu een noodlijdend token is.
De Kraken-print op 26,000
Bitstamp BTC/USD cirkelt rond $20,200. Kraken BTC/USDC print boven $26,000. Dat is dezelfde bitcoin. Het tweede getal is een dollarprijs gedeeld door een gebroken peg, plus de lucht die een dun USDC-boek op een zaterdag toevoegt.
Ons venue markeerde de perpetual in USDC. Neem een conservatieve tape, BTC/USDC op ~$23,000, dat is $20,200 / 0.88. De 1.5 BTC-long staat ongeveer 4,300 USDC in de plus. Account in native eenheden: 104,300 USDC. De engine rapporteert $104,300, een weekend van 4.3% omhoog, en daar bovenop landt een fundingbetaling in dezelfde eenheid.
In dollars is de 70,000 USDC aan inactief collateral ongeveer $61,600 waard. De hele 104,300 USDC is ongeveer $91,800 waard. Het boek dat 4.3% "verdiende" verloor 8% van zijn dollarkapitaal terwijl het grotendeels in cash zat.
Het weekendrendement was een verandering van eenheid, geen verandering van fortuin. Een long BTC/USDC-positie op een dag dat USDC daalt is mechanisch long de depeg. Je kunt die weddenschap willen. Je kunt hem niet achteraf ontdekken in een reeks gelabeld USD.
cash_usd = cash_usdc * 1.0
Die regel is degene die ik bewaar. Hij draaide op elke bar, inclusief de bars waarop USDCUSD 0.87 was. Vermenigvuldigen met 1.0 voelt als een no-op, daarom overleeft het code review. Het is een FX-markering. Een bevroren.
De 70,000 USDC aan collateral triggerde nooit een trade, dus geen enkel slippage-model keek ernaar, geen fee-tabel, geen funding. Cash hoort de saaie kolom te zijn. Op dit boek was het het grootste risico, en het enige dat we niet prijsden.
Een maker-rebate op de BTC-fills dat weekend was 2 of 3 bps, als je überhaupt gevuld werd. De quote-assetbeweging was 1,300 bps. We hebben een hele stack voor de 3 en een stub voor de 1,300.
Het groene weekend op de grafiek
Maandagochtend Slack, voordat iemand USDCUSD had geopend: we printten 4% overnight. Iemand vroeg of we de papersize moesten opschalen. Ik keek naar de grafiek, toen naar Kraken, toen naar de stub.
| Grootboekpost | Wat de engine opsloeg | Zaterdag, native | Hetzelfde moment, in dollars |
|---|---|---|---|
| Inactief collateral | 70,000 USDC × 1.00 | 70,000 USDC | ~$61,600 |
| BTC-perp-mark | BTCUSDC last | ~23,000 USDC (26,000 op Kraken) | BTCUSD ~$20,200 |
| Ongerealiseerd op 1.5 BTC | +4,300 USDC | +4,300 USDC | vooral de peg, een beetje bitcoin |
| Gerapporteerde NAV | 104,300 "USD" | 104,300 USDC | ~$91,800 |
USDT-boeken hadden de omgekeerde cartoon. USDT noteerde rijk, dus een USDT-gemarginede flat account toonde een dollarwinst die het evenmin had verdiend, en een BTCUSDT-mark die te laag was ten opzichte van BTCUSD. Als je dat weekend twee "identieke" BTC-perps rangschikte, één op een USDC-venue en één op een USDT-venue, rangschikte je de quote-tokens en noemde je het alpha.
Het paperaccount, het account dat daadwerkelijk USDC aanhield, stond dichter bij de waarheid dan het researchdashboard. Het beweerde nooit dollars te zijn. Dat deden wij in de export.
De export die we maandag verstuurden
USDC kroop terug richting $1 nadat het Treasury, de Fed en de FDIC zeiden dat SVB-deposanten schadeloos zouden worden gesteld, en nadat Circle zei dat het een tekort zou dekken. Tegen maandag was de peg grotendeels gerepareerd. Het stub-FX-bestand, dat 48 uur fout was geweest, klopte weer.
Maar dagelijkse bars verborgen het. De 00:00 UTC-sample op 11 maart ving USDC al af, of al aan het stuiteren, afhankelijk van de vendor, en de sample van 12 maart was een andere film. Als je alleen NAV opsloeg en niet de quote-mark, kon je niet reconstrueren welke. Het lelijke weekend werd platgeslagen tot een blip klein genoeg om te negeren, wat we deden, omdat we dagelijks sampled.
Wat we nu op het boek bijhouden zijn drie reeksen, altijd, ook als ze maandenlang op elkaar liggen:
- NAV in het quote-asset van het venue, de eenheid die je daadwerkelijk kunt opnemen.
- Quote-asset versus USD, een echte tape, inclusief zaterdag, inclusief 0.87, inclusief de uren dat Coinbase niet converteerde.
- NAV in dollars, als afgeleide reeks, zodat een plotlabel van USD een parent heeft.
Als een agent de backtest schrijft, is de check hetzelfde. Vraag hem naar het quote-asset van elke positie en van cash. Als hij USD antwoordt op een USDC-venue, is de run geen dollarrun. Maart 2023 is de week die ik opnieuw afspeel wanneer iemand me vertelt dat het onderscheid de Sharpe niet beweegt. Het bewoog deze meer dan de strategie deed, en de strategie was het deel waar we modellen voor hadden.
← Alle artikelen


