La config diceva starting_capital: 100000, e l'asse y del grafico diceva USD. Ogni fill nel log era un numero in USDC. Per undici mesi di quella run i due fatti hanno convissuto nella stessa cella e nessuno aveva motivo di separarli.
Poi Silicon Valley Bank è fallita, Circle ha detto che $3.3 miliardi di riserve USDC erano bloccati lì, e l'USDC quotava a 87 centesimi. Il nostro book in «dollari» è andato su. BTC prezzato in USDC è schizzato. Il perp ha stampato verde. La cassa che avevamo trattato come un 100,000 risk-free era la cosa che si è mossa.
Continuo a imbattermi in pipeline di ricerca che mettono USDC, USDT e USD in un'unica colonna. Questo è quel weekend, smontato nell'ordine in cui il ledger l'ha visto.
La riga che diceva $100,000
Conto paper, perpetual BTC marginato in USDC, long modesto. 30,000 USDC di nozionale BTC, circa 1.5 BTC al mark del venerdì vicino a $20,150. Gli altri 70,000 stavano come collaterale USDC. Sottoutilizzati di proposito. Stavamo scaldando una strategia. Il resto dello stack stava in cassa.
La funzione NAV faceva quello che fanno quasi tutte. Sommava la cassa USDC al pnl non realizzato USDC e scriveva la somma in una serie di nome equity_usd. C'era un commento nella config, scritto da me:
stablecoins = 1 dollaro. non contare due volte l'FX.
Volevo dire: non trasformare un pagamento di funding in USDT in un secondo movimento in dollari convertendolo due volte. Quello che avevo fatto in realtà era congelare il tasso FX a 1.0 per il resto del file.
quote_asset = "USDC"
Il venue era un venue USDC. Fill, margin, funding, mark di liquidazione, il lot size, il min notional, tutto. Hyperliquid, dYdX v3, Coinbase International, una dozzina di altri, stessa forma. Il notebook di ricerca importava una candela BTCUSDC e una candela BTCUSD, usava la prima per il trading e metteva l'etichetta della seconda sul plot, perché il grafico sembrava più professionale in dollari.
E questa è la piccola, stupida cosa a cui penso ancora a ore strane: il titolo di default dell'asse della libreria di plotting è «USD». Non l'ho mai sovrascritto. La gente passava davanti allo schermo e leggeva un'unità che la serie non aveva.
Venerdì sera, il tweet di Circle
10 marzo 2023. SVB è già saltata. Circle comunica che $3.3 miliardi della sua riserva USDC, allora di ~$40 miliardi, erano parcheggiati nella banca fallita, circa l'8%. Coinbase sospende le conversioni USDC quella stessa notte. Il redemption, il vero meccanismo del peg, è chiuso per il weekend.
Il backtest non aveva una riga per niente di tutto questo. Nessun flag di halt del redemption, nessun campo issuer-reserve, nessun «posso avere dollari per questo token prima di lunedì». Aveva un close. Il close del venerdì era ancora 1.0000 nel nostro file FX, perché il file FX era uno stub che restituiva 1.0 per qualsiasi cosa il cui ticker iniziasse con USD.
Un tempo trattavo un premio USDT come rumore da manuale, il genere di cosa che citi in una nota a piè di pagina e poi ignori. Una volta abbiamo passato venti minuti in una cucina a discutere se 1.03 «valesse la pena di metterlo a libro». Stavamo entrambi editorializzando. La coppia è una serie. Conservala. Smettila di metterla ai voti.
0.8789
Sabato mattina. Il minimo di CoinGecko su USDC è $0.8789. Altri tape stampano $0.87. Qualche pool DEX passa per $0.80. DAI, imbottito di USDC come collaterale, lo insegue verso il basso. USDT va dalla parte opposta, $1.03 su alcuni schermi, $1.06 su Kraken.
Il file FX stub restituisce ancora 1.0. L'orologio del backtest sa che è sabato. Non sa che l'unità del book è ormai un token in distress.
Il print di Kraken a 26,000
Bitstamp BTC/USD gira intorno a $20,200. Kraken BTC/USDC stampa sopra $26,000. È lo stesso bitcoin. Il secondo numero è un prezzo in dollari diviso per un peg rotto, più tutta l'aria che un book USDC sottile aggiunge di sabato.
Il nostro venue marcava il perpetual in USDC. Prendiamo un tape conservativo, BTC/USDC a ~$23,000, cioè $20,200 / 0.88. Il long da 1.5 BTC è in guadagno di circa 4,300 USDC. Conto in unità native: 104,300 USDC. Il motore riporta $104,300, un weekend in rialzo del 4.3%, e un pagamento di funding ci atterra sopra, nella stessa unità.
In dollari, i 70,000 USDC di collaterale idle valgono circa $61,600. L'intero 104,300 USDC vale circa $91,800. Il book che aveva «fatto» il 4.3% ha perso l'8% del suo capitale in dollari mentre stava per lo più fermo in cassa.
Il rendimento del weekend era un cambio di unità, non un cambio di fortuna. Una posizione long BTC/USDC in un giorno di USDC giù è meccanicamente long sul depeg. Puoi volere quella scommessa. Non puoi scoprirla dopo in una serie etichettata USD.
cash_usd = cash_usdc * 1.0
Quella riga è quella che mi tengo. Girava su ogni barra, comprese le barre in cui USDCUSD era 0.87. Moltiplicare per 1.0 sembra un no-op, ed è per questo che sopravvive alla code review. È un mark FX. Uno congelato.
I 70,000 USDC di collaterale non hanno mai innescato un trade, quindi nessun modello di slippage li ha mai guardati, nessuna tabella di fee, nessun funding. La cassa dovrebbe essere la colonna noiosa. Su questo book era il rischio più grande, e l'unico che non avevamo prezzato.
Un rebate maker sui fill BTC di quel weekend era 2 o 3 bps, se venivi filled proprio. Il movimento della quote asset era 1,300 bps. Abbiamo un intero stack per il 3 e uno stub per il 1,300.
Il weekend verde sul grafico
Lunedì mattina su Slack, prima che qualcuno avesse aperto USDCUSD: avevamo stampato il 4% overnight. Qualcuno ha chiesto se dovevamo scalare la size del paper. Ho guardato il grafico, poi Kraken, poi lo stub.
| Voce del ledger | Cosa memorizzava il motore | Sabato, nativo | Stesso momento, in dollari |
|---|---|---|---|
| Collaterale idle | 70,000 USDC × 1.00 | 70,000 USDC | ~$61,600 |
| Mark del perp BTC | BTCUSDC last | ~23,000 USDC (26,000 su Kraken) | BTCUSD ~$20,200 |
| Non realizzato su 1.5 BTC | +4,300 USDC | +4,300 USDC | per lo più il peg, un po' di bitcoin |
| NAV riportato | 104,300 "USD" | 104,300 USDC | ~$91,800 |
I book USDT avevano la caricatura opposta. USDT quotava rich, quindi un conto flat marginato in USDT mostrava un guadagno in dollari che anch'esso non aveva guadagnato, e un mark BTCUSDT troppo basso rispetto a BTCUSD. Se classificavi due perp BTC «identici» quel weekend, uno su un venue USDC e uno su un venue USDT, classificavi i token di quotazione e lo chiamavi alpha.
Il conto paper, quello che teneva davvero USDC, era più vicino alla verità della dashboard di ricerca. Non ha mai preteso di essere dollari. Quello l'abbiamo fatto noi nell'export.
L'export che abbiamo spedito lunedì
L'USDC è risalito strisciando verso $1 dopo che Treasury, Fed e FDIC hanno detto che i depositanti di SVB sarebbero stati rimborsati per intero, e dopo che Circle ha detto che avrebbe coperto un eventuale buco. Entro lunedì il peg era per lo più rattoppato. Il file FX stub, che era stato sbagliato per 48 ore, era di nuovo corretto.
Ma le barre daily lo hanno nascosto. Il campione delle 00:00 UTC dell'11 marzo ha catturato USDC già staccato, o già in rimbalzo, a seconda del vendor, e il campione del 12 marzo era un altro film. Se memorizzavi solo il NAV e non il mark della quote, non potevi ricostruire quale. Il weekend brutto si è appiattito in un blip abbastanza piccolo da ignorare, e l'abbiamo ignorato, perché campionavamo daily.
Quello che teniamo ora sul book sono tre serie, sempre, anche quando stanno una sopra l'altra per mesi:
- NAV nella quote asset del venue, l'unità che puoi effettivamente prelevare.
- Quote asset contro USD, un tape reale, compreso il sabato, compreso 0.87, comprese le ore in cui Coinbase non convertiva.
- NAV in dollari, come serie derivata, così un'etichetta di plot in USD ha un genitore.
Se un agent scrive il backtest, il controllo è lo stesso. Chiedigli la quote asset di ogni posizione e della cassa. Se risponde USD su un venue USDC, la run non è una run in dollari. Marzo 2023 è la settimana che rimetto in play quando qualcuno mi dice che la distinzione non muove lo Sharpe. Ha mosso questo più di quanto abbia fatto la strategia, e la strategia era la parte per cui avevamo dei modelli.
← Tutti gli articoli


