2 de Novembro de 2026 · pesquisa

O dólar do seu backtest era USDC. Em 11 de março ele negociou a 87 centavos.

O dólar do seu backtest era USDC. Em 11 de março ele negociou a 87 centavos.

A config dizia starting_capital: 100000, e o eixo y do gráfico dizia USD. Cada fill no log era um número em USDC. Durante onze meses daquela execução os dois fatos viveram na mesma célula e ninguém tinha motivo para separá-los.

Aí o Silicon Valley Bank quebrou, a Circle disse que $3.3 bilhões de reservas de USDC estavam presos lá, e o USDC negociou a 87 centavos. Nosso book em "dólar" subiu. O BTC precificado em USDC disparou. O perp imprimiu verde. O caixa que tínhamos tratado como um 100,000 livre de risco foi o que se mexeu.

Ainda pego pipelines de pesquisa 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, perpetual 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 perto de $20,150. Os outros 70,000 ficaram como colateral em USDC. Subalocado de propósito. Estávamos aquecendo uma estratégia. O resto da stack ficou 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 gravou a soma numa série chamada equity_usd. Havia um comentário na config que eu mesmo escrevi:

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

Eu quis dizer: não transforme um pagamento de funding em USDT num segundo movimento em dólar convertendo duas vezes. O que eu realmente fiz foi congelar a taxa de FX em 1.0 para o resto do arquivo.

quote_asset = "USDC"

A venue era uma venue de USDC. Fills, margem, funding, marcas de liquidação, o lot size, o min notional, tudo. Hyperliquid, dYdX v3, Coinbase International, uma dúzia de outras, o mesmo formato. O notebook de pesquisa importava um candle de BTCUSDC e um candle de BTCUSD, usava o primeiro para negociar e rotulava o segundo no gráfico porque o gráfico parecia mais profissional em dólares.

E esta é a parte pequena e besta na qual ainda penso em horas improváveis: o título padrão do eixo da biblioteca de plotagem é "USD". Eu nunca sobrescrevi. As pessoas passavam pela tela e liam uma unidade que a série não tinha.

Sexta à noite, o tweet da Circle

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

O backtest não tinha linha para nada disso. Sem flag de halt de resgate, sem campo de reserva do emissor, sem "consigo dólares por este token antes de segunda." Tinha um close. O close de sexta ainda era 1.0000 no nosso arquivo de FX, porque o arquivo de FX era um stub que retornava 1.0 para qualquer coisa cujo ticker começasse com USD.

Eu costumava tratar um prêmio de USDT como ruído de livro-texto, o tipo de coisa que você menciona numa nota de rodapé e depois ignora. Uma vez passamos vinte minutos numa cozinha discutindo se 1.03 "valia lançar." Nós dois estávamos editorializando. O par é uma série. Armazene. Pare de votar nisso.

0.8789

Sábado de manhã. A mínima da CoinGecko no USDC é $0.8789. Outras tapes imprimem $0.87. Alguns pools de DEX passam por $0.80. O DAI, recheado de USDC como colateral, acompanha para baixo. O USDT vai no outro sentido, $1.03 em algumas telas, $1.06 na Kraken.

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

O arquivo stub de FX ainda retorna 1.0. O relógio do backtest sabe que é sábado. Não sabe que a unidade do book agora é um token em estresse.

O print da Kraken a 26,000

O BTC/USD da Bitstamp gira 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ólar dividido por um peg quebrado, mais o ar que um book fino de USDC acrescenta num sábado.

Nossa venue marcava o perpetual em USDC. Pegue uma tape conservadora, BTC/USDC a ~$23,000, que é $20,200 / 0.88. O long de 1.5 BTC está positivo em cerca de 4,300 USDC. Conta em unidades nativas: 104,300 USDC. O motor reporta $104,300, um fim de semana de alta de 4.3%, e um pagamento de funding cai por cima na mesma unidade.

Em dólares os 70,000 USDC de colateral ocioso valem cerca de $61,600. Os 104,300 USDC inteiros valem cerca de $91,800. O book que "fez" 4.3% perdeu 8% do seu capital em dólar enquanto estava, em grande parte, 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 queda do USDC é mecanicamente long do depeg. Você pode querer essa aposta. Não pode descobri-la depois numa série rotulada USD.

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

cash_usd = cash_usdc * 1.0

Essa linha é a que eu guardo. Rodava em cada barra, inclusive nas barras em que o USDCUSD estava a 0.87. Multiplicar por 1.0 parece um no-op, por isso sobrevive ao code review. É uma marcação de FX. Uma congelada.

Os 70,000 USDC de colateral nunca dispararam um trade, então nenhum modelo de slippage jamais olhou para eles, nenhuma tabela de fee, nenhum funding. O caixa deveria ser a coluna chata. Neste book era o maior risco, e o único que não precificamos.

Um rebate de maker nos fills de BTC naquele fim de semana era 2 ou 3 bps, se você tomasse fill. O movimento do quote asset foi 1,300 bps. Temos uma stack inteira para o 3 e um stub para o 1,300.

O fim de semana verde no gráfico

Segunda de manhã no Slack, antes de alguém ter aberto o USDCUSD: imprimimos 4% overnight. Alguém perguntou se deveríamos aumentar o tamanho do paper. Olhei o gráfico, depois a Kraken, depois 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ção 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 USDCem grande parte o peg, um pouco de bitcoin
NAV reportado104,300 "USD"104,300 USDC~$91,800

Os books em USDT tinham a caricatura oposta. O USDT negociava com prêmio, então uma conta flat com margem em USDT mostrava um ganho em dólar que também não tinha ganhado, e uma marcação de BTCUSDT baixa demais em relação ao BTCUSD. Se você ranqueasse dois perps de BTC "idênticos" naquele fim de semana, um numa venue de USDC e outro numa venue de USDT, você ranqueou os tokens de cotação e chamou isso de alpha.

A conta paper, a que de fato detinha USDC, estava mais perto da verdade do que o dashboard de pesquisa. Ela nunca afirmou ser dólares. Nós fizemos isso no export.

O export que enviamos na segunda

O USDC rastejou de volta rumo a $1 depois que o Treasury, o Fed e a FDIC disseram que os depositantes do SVB seriam recompostos por completo, e depois que a Circle disse que cobriria um déficit. Na segunda o peg estava em grande parte consertado. O arquivo stub de FX, que tinha estado errado por 48 horas, estava certo de novo.

Mas as barras diárias esconderam. A amostra de 00:00 UTC de 11 de março pegou o USDC já fora, ou já recuperando, dependendo do vendor, e a amostra de 12 de março era outro filme. Se você só armazenava o NAV e não a marcação do quote, não dava para reconstruir qual. O fim de semana feio se achatou num blip pequeno o bastante para ignorar, o que fizemos, porque amostrávamos no diário.

O que mantemos no book agora são três séries, sempre, mesmo quando ficam uma em cima da outra por meses:

  1. NAV no quote asset da venue, a unidade que você de fato consegue sacar.
  2. Quote asset versus USD, uma tape de verdade, incluindo sábado, incluindo 0.87, incluindo as horas em que a Coinbase não estava convertendo.
  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 checagem é a mesma. Peça o quote asset de cada posição e do caixa. Se ele responde USD numa venue de USDC, a execução não é uma execução em dólar. Março de 2023 é a semana que eu reexecuto quando alguém me diz que a distinção não mexe no Sharpe. Ela mexeu neste 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