2 de novembro de 2026 · investigação

O dólar do seu backtest era USDC. A 11 de março negociava a 87 cêntimos.

O dólar do seu backtest era USDC. A 11 de março negociava a 87 cêntimos.

A configuração dizia starting_capital: 100000, e o eixo y do gráfico dizia USD. Cada execução no log era um número em USDC. Durante onze meses daquele run, os dois factos viveram na mesma célula e ninguém tinha motivo para os separar.

Depois o Silicon Valley Bank faliu, a Circle disse que $3.3 mil milhões de reservas de USDC estavam retidos lá, e o USDC negociou a 87 cêntimos. O nosso livro «dólar» subiu. O BTC cotado em USDC disparou. O perp pintou de verde. O caixa que tínhamos tratado como um 100,000 sem risco foi o que se mexeu.

Ainda apanho pipelines de investigação que marcam USDC, USDT e USD como uma só coluna. Este é aquele fim de semana, desmontado na ordem em que o ledger o viu.

A linha que dizia $100,000

Conta paper, perpétuo de BTC com margem em USDC, long modesto. 30,000 USDC de nocional de BTC, cerca de 1.5 BTC na marcação de sexta-feira perto de $20,150. Os outros 70,000 estavam como colateral em USDC. Subalocada de propósito. Estávamos a aquecer uma estratégia. O resto da stack estava em caixa.

A função de NAV fez o que a maioria delas faz. Somou o caixa em USDC ao pnl não realizado em USDC e escreveu a soma numa série chamada equity_usd. Havia um comentário na configuração que eu próprio escrevi:

stablecoins = 1 dólar. não contar o FX duas vezes.

O que eu queria dizer: não transformar um pagamento de funding em USDT num segundo movimento em dólares ao convertê-lo duas vezes. O que eu tinha feito de facto foi congelar a taxa de FX em 1.0 para o resto do ficheiro.

quote_asset = "USDC"

A venue era uma venue USDC. Execuções, margem, funding, marcas de liquidação, o tamanho do lote, o nocional mínimo, tudo. Hyperliquid, dYdX v3, Coinbase International, uma dúzia de outras, a mesma forma. O notebook de investigação importava uma vela BTCUSDC e uma vela BTCUSD, usava a primeira para negociar e rotulava a segunda no gráfico porque o gráfico parecia mais profissional em dólares.

E esta é a parte pequena e estúpida em que ainda penso a horas mortas: o título de eixo por defeito da biblioteca de gráficos é «USD». Nunca o alterei. As pessoas passavam pelo ecrã e liam uma unidade que a série não tinha.

Sexta-feira à noite, o tweet da Circle

10 de março de 2023. O SVB já desapareceu. A Circle revela que $3.3 mil milhões da sua reserva de USDC, então de ~$40 mil milhões, estavam no banco falido, cerca de 8%. A Coinbase suspende as conversões de USDC nessa mesma noite. O resgate, o verdadeiro mecanismo de peg, fica fechado durante o fim de semana.

O backtest não tinha nenhuma linha para nada disto. Sem flag de interrupção de resgate, sem campo de reservas do emitente, sem «consigo obter dólares por este token antes de segunda-feira». Tinha um close. O close de sexta-feira ainda era 1.0000 no nosso ficheiro de FX, porque o ficheiro de FX era um stub que devolvia 1.0 para qualquer coisa cujo ticker começasse por USD.

Costumava tratar um prémio de USDT como ruído de manual, daquelas coisas que se mencionam numa nota de rodapé e depois se ignoram. Uma vez passámos vinte minutos numa cozinha a discutir se 1.03 «valia a pena lançar». Estávamos os dois a editorializar. O par é uma série. Guarda-o. Deixa de votar sobre ele.

0.8789

Sábado de manhã. A mínima da CoinGecko no USDC é $0.8789. Outras tapes imprimem $0.87. Alguns pools DEX passam pelos $0.80. A DAI, atulhada de USDC como colateral, segue-o na descida. O USDT vai no sentido contrário, $1.03 nalguns ecrãs, $1.06 na Kraken.

$0.87Mínima do USDC, 11 mar 2023
$26kPrint BTC/USDC na Kraken
13%buraco no caixa marcado a $1

O ficheiro stub de FX continua a devolver 1.0. O relógio do backtest sabe que é sábado. Não sabe que a unidade do livro é agora um token em dificuldades.

O print da Kraken a 26,000

O BTC/USD da Bitstamp anda em torno de $20,200. O BTC/USDC da Kraken imprime acima de $26,000. É o mesmo bitcoin. O segundo número é um preço em dólares dividido por um peg partido, mais o ar que um livro de USDC pouco líquido acrescenta num sábado.

A nossa venue marcava o perpétuo em USDC. Peguemos numa tape conservadora, BTC/USDC a ~$23,000, que é $20,200 / 0.88. A long de 1.5 BTC está a ganhar cerca de 4,300 USDC. Conta em unidades nativas: 104,300 USDC. O motor reporta $104,300, um fim de semana a subir 4.3%, e um pagamento de funding aterra por cima disso na mesma unidade.

Em dólares, os 70,000 USDC de colateral ocioso valem cerca de $61,600. Os 104,300 USDC no total valem cerca de $91,800. O livro que «fez» 4.3% perdeu 8% do seu capital em dólares enquanto estava maioritariamente parado em caixa.

O retorno do fim de semana foi uma mudança de unidade, não uma mudança de fortuna. Uma posição long de BTC/USDC num dia de USDC a descer é mecanicamente long no depeg. Pode querer essa aposta. Não a pode descobrir depois numa série rotulada USD.

A Coinbase já tinha interrompido as conversões de USDC. A Binance suspendeu os pares USDC. Mesmo um backtest em god-mode que tivesse decidido às 08:00 UTC despejar o ativo de cotação a troco de dólares teria precisado de uma venue que ainda estivesse a converter, de um spread que não fosse o próprio depeg, e de um caminho de liquidação que não existia até os bancos abrirem na segunda-feira.

cash_usd = cash_usdc * 1.0

Essa linha é a que eu guardo. Correu em cada barra, incluindo as barras em que o USDCUSD estava a 0.87. Multiplicar por 1.0 parece um no-op, e é por isso que sobrevive à revisão de código. É uma marcação de FX. Uma congelada.

Os 70,000 USDC de colateral nunca despoletaram uma operação, por isso nenhum modelo de slippage alguma vez os olhou, nenhuma tabela de comissões, nenhum funding. O caixa é suposto ser a coluna aborrecida. Neste livro era o maior risco, e o único que não precificámos.

Um rebate de maker nas execuções de BTC naquele fim de semana era de 2 ou 3 bps, se é que chegou a haver execução. O movimento do ativo de cotação foi de 1,300 bps. Temos uma stack inteira para os 3 e um stub para os 1,300.

O fim de semana verde no gráfico

Segunda-feira de manhã no Slack, antes de alguém ter aberto o USDCUSD: imprimimos 4% durante a noite. Alguém perguntou se devíamos aumentar o tamanho do paper. Olhei para o gráfico, depois para a Kraken, depois para o stub.

Item do ledgerO que o motor armazenouSábado, nativoO mesmo momento, em dólares
Colateral ocioso70,000 USDC × 1.0070,000 USDC~$61,600
Marca do perp de BTCúltimo BTCUSDC~23,000 USDC (26,000 na Kraken)BTCUSD ~$20,200
Não realizado em 1.5 BTC+4,300 USDC+4,300 USDCsobretudo o peg, algum bitcoin
NAV reportado104,300 «USD»104,300 USDC~$91,800

Os livros em USDT tinham a caricatura inversa. O USDT negociava com prémio, por isso uma conta flat com margem em USDT mostrava um ganho em dólares que também não tinha ganhado, e uma marca BTCUSDT demasiado baixa em relação ao BTCUSD. Se se ordenassem dois perps de BTC «idênticos» naquele fim de semana, um numa venue USDC e outro numa venue USDT, ordenavam-se os tokens de cotação e chamava-se-lhe alpha.

A conta paper, a que realmente detinha USDC, estava mais perto da verdade do que o dashboard de investigação. Nunca afirmou ser dólares. Fomos nós que o fizemos na exportação.

A exportação que enviámos na segunda-feira

O USDC rastejou de volta para $1 depois de o Treasury, a Fed e a FDIC terem dito que os depositantes do SVB seriam reembolsados na totalidade, e depois de a Circle ter dito que cobriria um défice. Na segunda-feira o peg estava maioritariamente remendado. O ficheiro stub de FX, que tinha estado errado durante 48 horas, voltava a estar certo.

Mas as barras diárias esconderam-no. A amostra das 00:00 UTC de 11 de março apanhou o USDC já despegado, ou já a recuperar, consoante o fornecedor, e a amostra de 12 de março era outro filme. Se só se guardava o NAV e não a marca da cotação, não se conseguia reconstruir qual. O fim de semana feio achatou-se num blip pequeno o suficiente para ignorar, o que fizemos, porque amostrávamos diariamente.

O que mantemos agora no livro são três séries, sempre, mesmo quando se sobrepõem durante meses:

  1. NAV no ativo de cotação da venue, a unidade que se pode realmente levantar.
  2. Ativo de cotação versus USD, uma tape real, incluindo sábado, incluindo 0.87, incluindo as horas em que a Coinbase não estava a converter.
  3. NAV em dólares, como série derivada, para que um rótulo de gráfico de USD tenha um pai.

Se um agente escreve o backtest, a verificação é a mesma. Peça-lhe o ativo de cotação de cada posição e do caixa. Se responder USD numa venue USDC, o run não é um run em dólares. Março de 2023 é a semana que eu reproduzo quando alguém me diz que a distinção não mexe no Sharpe. Mexeu neste por mais do que a estratégia mexeu, e a estratégia era a parte para a qual tínhamos modelos.

stablecoinsmoeda de cotaçãobacktestingcriptopaper trading
← Todos os artigos