La config disait starting_capital: 100000, et l'axe des y du graphique disait USD. Chaque exécution dans le journal était un nombre en USDC. Pendant onze mois de ce run, les deux faits habitaient la même cellule et personne n'avait de raison de les séparer.
Puis Silicon Valley Bank a fait faillite, Circle a dit que $3.3 billion de réserves d'USDC y étaient coincés, et l'USDC s'est échangé à 87 cents. Notre book « dollar » est monté. Le BTC coté en USDC s'est envolé. Le perp a imprimé du vert. Le cash que nous avions traité comme un 100,000 sans risque, c'est lui qui a bougé.
Je tombe encore sur des pipelines de recherche qui marquent USDC, USDT et USD comme une seule colonne. Voici ce week-end, décortiqué dans l'ordre où le ledger l'a vu.
La ligne qui indiquait $100,000
Compte papier, perpetual BTC margé en USDC, long modeste. 30,000 USDC de notionnel BTC, environ 1.5 BTC au mark du vendredi près de $20,150. Les autres 70,000 restaient en collatéral USDC. Sous-déployé exprès. Nous faisions chauffer une stratégie. Le reste du stack était en cash.
La fonction de NAV a fait ce que la plupart d'entre elles font. Elle a additionné le cash USDC au pnl latent USDC et a écrit la somme dans une série nommée equity_usd. Il y avait un commentaire dans la config, que j'avais écrit moi-même :
stablecoins = 1 dollar. ne pas compter le FX deux fois.
Je voulais dire : ne pas transformer un paiement de funding USDT en un second mouvement dollar en le convertissant deux fois. Ce que j'avais réellement fait, c'était geler le taux de FX à 1.0 pour le reste du fichier.
quote_asset = "USDC"
La venue était une venue USDC. Exécutions, marge, funding, marks de liquidation, la taille de lot, le notionnel min, tout. Hyperliquid, dYdX v3, Coinbase International, une douzaine d'autres, même forme. Le notebook de recherche importait une bougie BTCUSDC et une bougie BTCUSD, utilisait la première pour trader, et libellait la seconde sur le graphique parce que le graphique avait l'air plus professionnel en dollars.
Et c'est le petit détail stupide auquel je pense encore à des heures indues : le titre d'axe par défaut de la bibliothèque de graphiques est « USD ». Je n'y ai jamais touché. Les gens passaient devant l'écran et lisaient une unité que la série n'avait pas.
Vendredi soir, le tweet de Circle
10 mars 2023. SVB n'est déjà plus. Circle révèle que $3.3 billion de ses alors ~$40 billion de réserves d'USDC étaient chez la banque faillie, environ 8%. Coinbase suspend les conversions USDC cette même nuit. Le rachat, le véritable mécanisme du peg, est fermé pour le week-end.
Le backtest n'avait aucune ligne pour tout ça. Pas de flag d'arrêt de rachat, pas de champ de réserve émetteur, pas de « est-ce que je peux obtenir des dollars pour ce token avant lundi. » Il avait un close. Le close du vendredi était encore 1.0000 dans notre fichier FX, parce que le fichier FX était un stub qui renvoyait 1.0 pour tout ce dont le ticker commençait par USD.
Je traitais autrefois une prime USDT comme du bruit de manuel, le genre de chose qu'on mentionne en note de bas de page puis qu'on ignore. Nous avons un jour passé vingt minutes dans une cuisine à débattre si 1.03 « valait d'être booké. » Nous éditorialisions tous les deux. La paire est une série. Stockez-la. Arrêtez de voter dessus.
0.8789
Samedi matin. Le plus bas de CoinGecko sur l'USDC est $0.8789. D'autres tapes impriment $0.87. Quelques pools DEX traversent $0.80. DAI, gorgé d'USDC comme collatéral, le suit à la baisse. L'USDT part dans l'autre sens, $1.03 sur certains écrans, $1.06 sur Kraken.
Le fichier FX stub renvoie toujours 1.0. L'horloge du backtest sait que c'est samedi. Elle ne sait pas que l'unité du book est désormais un token en détresse.
Le print Kraken à 26,000
Le BTC/USD de Bitstamp tourne autour de $20,200. Le BTC/USDC de Kraken imprime au-dessus de $26,000. C'est le même bitcoin. Le second nombre est un prix en dollars divisé par un peg cassé, plus l'air qu'un carnet USDC mince ajoute un samedi.
Notre venue marquait le perpetual en USDC. Prenons un tape conservateur, BTC/USDC à ~$23,000, soit $20,200 / 0.88. Le long de 1.5 BTC est en hausse d'environ 4,300 USDC. Compte en unités natives : 104,300 USDC. Le moteur rapporte $104,300, un week-end en hausse de 4.3%, et un paiement de funding se pose par-dessus dans la même unité.
En dollars, les 70,000 USDC de collatéral inactif valent environ $61,600. Les 104,300 USDC au total valent environ $91,800. Le book qui avait « fait » 4.3% a perdu 8% de son capital en dollars alors qu'il était surtout assis sur du cash.
Le rendement du week-end était un changement d'unité, pas un changement de fortune. Une position longue BTC/USDC un jour de baisse de l'USDC est mécaniquement long le depeg. On peut vouloir ce pari. On ne peut pas le découvrir après coup dans une série libellée USD.
cash_usd = cash_usdc * 1.0
Cette ligne, c'est celle que je retiens. Elle s'exécutait à chaque barre, y compris les barres où USDCUSD valait 0.87. Multiplier par 1.0 a l'air d'un no-op, c'est pour ça qu'elle survit à la revue de code. C'est un mark de FX. Un mark gelé.
Les 70,000 USDC de collatéral n'ont jamais déclenché de trade, donc aucun modèle de slippage ne les a regardés, aucune table de frais, aucun funding. Le cash est censé être la colonne ennuyeuse. Sur ce book, c'était le plus grand risque, et le seul que nous n'avons pas pricé.
Un rebate maker sur les exécutions BTC ce week-end était de 2 ou 3 bps, si vous aviez un fill tout court. Le mouvement de l'actif de cotation était de 1,300 bps. Nous avons tout un stack pour le 3 et un stub pour le 1,300.
Le week-end vert sur le graphique
Lundi matin sur Slack, avant que quiconque ait ouvert USDCUSD : nous avions imprimé 4% overnight. Quelqu'un a demandé si on devait scaler la taille papier. J'ai regardé le graphique, puis Kraken, puis le stub.
| Poste du ledger | Ce que le moteur a stocké | Samedi, natif | Même instant, en dollars |
|---|---|---|---|
| Collatéral inactif | 70,000 USDC × 1.00 | 70,000 USDC | ~$61,600 |
| Mark du perp BTC | BTCUSDC last | ~23,000 USDC (26,000 sur Kraken) | BTCUSD ~$20,200 |
| Latent sur 1.5 BTC | +4,300 USDC | +4,300 USDC | surtout le peg, un peu de bitcoin |
| NAV reportée | 104,300 « USD » | 104,300 USDC | ~$91,800 |
Les books USDT avaient le cartoon inverse. L'USDT cotait rich, donc un compte plat margé en USDT affichait un gain en dollars qu'il n'avait pas non plus gagné, et un mark BTCUSDT trop bas par rapport au BTCUSD. Si vous classiez deux perps BTC « identiques » ce week-end-là, l'un sur une venue USDC et l'autre sur une venue USDT, vous classiez les tokens de cotation et vous appeliez ça de l'alpha.
Le compte papier, celui qui détenait réellement de l'USDC, était plus proche de la vérité que le dashboard de recherche. Il n'a jamais prétendu être des dollars. C'est nous qui l'avons fait dans l'export.
L'export que nous avons livré le lundi
L'USDC a rampé vers $1 après que le Treasury, la Fed et la FDIC ont dit que les déposants de SVB seraient indemnisés intégralement, et après que Circle a dit qu'elle couvrirait un déficit. Lundi, le peg était en grande partie recousu. Le fichier FX stub, qui avait eu tort pendant 48 heures, était de nouveau juste.
Mais les barres daily l'ont masqué. L'échantillon 00:00 UTC du 11 mars a attrapé l'USDC déjà décroché, ou déjà en rebond, selon le vendor, et l'échantillon du 12 mars était un autre film. Si vous ne stockiez que la NAV et pas le mark de cotation, vous ne pouviez pas reconstruire lequel. Le week-end moche s'est aplati en un blip assez petit pour l'ignorer, ce que nous avons fait, parce que nous échantillonnions en daily.
Ce que nous gardons désormais sur le book, ce sont trois séries, toujours, même quand elles se superposent pendant des mois :
- La NAV dans l'actif de cotation de la venue, l'unité que vous pouvez réellement retirer.
- L'actif de cotation contre USD, un vrai tape, y compris le samedi, y compris 0.87, y compris les heures où Coinbase ne convertissait pas.
- La NAV en dollars, en série dérivée, pour qu'un libellé de graphique USD ait un parent.
Si un agent écrit le backtest, le contrôle est le même. Demandez-lui l'actif de cotation de chaque position et du cash. S'il répond USD sur une venue USDC, le run n'est pas un run en dollars. Mars 2023 est la semaine que je rejoue quand quelqu'un me dit que la distinction ne fait pas bouger le Sharpe. Elle a fait bouger celui-ci plus que la stratégie ne l'a fait, et la stratégie, c'était la partie pour laquelle nous avions des modèles.
← Tous les articles


