14 de novembro de 2026 · investigação

O teu backtest negociou na Sexta-Feira Santa. O mercado de ações não.

O teu backtest negociou na Sexta-Feira Santa. O mercado de ações não.

Quinta-feira, 2 de abril, 16:02 Eastern. O livro paper estava exatamente como o tínhamos desenhado: longos cerca de $240,000 do perpétuo BTCUSDT, curtos numa cesta ponderada por beta de COIN, MSTR, MARA e RIOT, residual abaixo de $500. O job de cobertura de sexta-feira tinha corrido às 15:45 na semana anterior. O funding das 16:00 UTC tinha sido um erro de arredondamento. Desliguei-me a pensar que finalmente tínhamos uma componente cripto que não se limitava a recriar o beta da Nasdaq.

Sexta-feira era Sexta-Feira Santa. Só dei por isso porque o chat de cripto ainda publicava capturas de ecrã de liquidações e o chat de ações tinha ficado calado daquela maneira específica que significa que ninguém está numa cadeira. A NYSE e a Nasdaq estavam fechadas. A Binance não. Do fecho à vista de quinta-feira até às 16:00 Eastern de sexta-feira o perp desceu 4.8%. Os shorts de ações não existiam enquanto mercado naquele dia. Eram uma linha de preços de quinta-feira num painel de risco.

O bot de risco publicou na mesma.

beta para a cesta de cobertura: 0.04. residual 1d: −$11,184. status: NEUTRAL

Ainda tenho essa captura de ecrã. Um colega imprimiu-a e colou-a no frigorífico do escritório que quase não usamos. O NEUTRAL verde estava a fazer muito trabalho. O bot calculou o beta a partir dos últimos prints de ações que tinha, que eram o leilão de fecho de quinta-feira, contra um mark de BTC que se movia há vinte e quatro horas. Um mark congelado é uma fotografia de quinta-feira. Tratar a fotografia como uma cobertura é assim que se entra no fim de semana da Páscoa com uma posição de cripto a descoberto e um relatório que nos felicita por isso.

Na segunda-feira o mercado à vista abriu. A cesta abriu em gap descendente, mas não 4.8%, e não em conjunto. A COIN abriu −2.1%. A MSTR fez mais. A MARA fez menos. Passámos a manhã a negociar para um livro que tinha vivido uma sessão extra inteira que não podíamos cobrir, depois fomos buscar o backtest que tinha abençoado este desenho e fizemos-lhe uma pergunta grosseira. O que fizeste na última Sexta-Feira Santa, e na anterior, e em todos os dias de semana em que o mercado de ações ficou de fora enquanto o BTC negociava ao longo do feriado?

O agente de investigação que programou a primeira versão tinha reamostrado tudo para barras de 15 minutos e feito forward-fill. Pandas freq='B' estava no notebook, o que parece uma escolha de adulto até nos lembrarmos do que realmente faz. 'B' significa de segunda a sexta-feira. A Sexta-Feira Santa é uma sexta-feira. O Juneteenth de 2026 foi uma sexta-feira. A observância do Dia da Independência foi uma sexta-feira. A função de calendário não tinha um calendário. Tinha um filtro de dia da semana.

O job de cobertura corre às sextas-feiras às 15:45 Eastern, o que é uma hora razoável para negociar em direção ao fecho à vista numa semana normal. A Sexta-Feira Santa é sempre uma sexta-feira. Na janela 2023–2026 esse job coincidiu com quatro Sextas-Feiras Santas, o Juneteenth, o fecho completo de 3 de julho, e quatro sessões do dia a seguir ao Dia de Ação de Graças que já tinham tocado o sino à 1:00 PM. Dez sessões de sexta-feira. Em cada uma delas o simulador tinha aceite ordens de ações. Os fills eram o fecho de quinta-feira, ou o último print regular de sexta-feira prolongado para a frente, disfarçados de negócios em direto no blotter. Os marks de cripto corriam em direto. A série residual recebia crédito por movimentos de cobertura a que uma das pernas nunca teve hipótese de responder.

10sessões de sexta-feira em que o mercado à vista não estava aberto para o rebalanceamento
4.8%movimento do perp enquanto a cobertura de ações ficou no print de quinta-feira
1.14 → 0.61Sharpe residual depois de o calendário de sessões ser real

Os fins de semana eram o mesmo bug num horário sobre o qual pelo menos já tínhamos brincado à cerveja. Os feriados eram a versão de que ninguém brincava, porque o notebook dizia dias úteis e a Sexta-Feira Santa ainda parece, visceralmente, um dia em que o sistema financeiro adulto está a trabalhar. Os bancos estão abertos. O Fedwire está no ar. Uma API de broker pode parecer acordada e mesmo assim não ter para onde enviar uma ordem de COIN.

A Sexta-Feira Santa não é um feriado federal. Se a verificação de sessão for «o calendário bancário está fechado?», vai negociar num mercado de ações fechado. O Columbus Day é a imagem no espelho: ações à vista abertas, mercado de obrigações fechado. Os horários das venues são uma chave de junção, não uma vibe.

Os fechos antecipados eram mais silenciosos e, no blotter, mais rudes. A 28 de novembro de 2025, o dia a seguir ao Dia de Ação de Graças, a NYSE fechou à 1:00 PM. O nosso job mesmo assim acordou às 15:45, olhou para uma série de 15 minutos que carregava o último print das 12:59 há quase três horas, e «negociou o fecho». O modelo de fills até nos cobrou slippage de leilão de fecho. Não houve leilão às 16:00. O leilão tinha acontecido às 13:00, sem nós. O paper, nessa tarde, teve a falha mais honesta: novas ordens rejeitadas, ordens em curso canceladas no fecho antecipado, uma taxa de fill de zero.

SessãoMercado à vistaFill do backtestPaper
Sexta-Feira Santa 2026Fechado o dia inteiroCesta executada no fecho de quinta-feiraRejeições; marks obsoletos desde quinta-feira
Juneteenth 2026Fechado o dia inteiroO mesmo job de sexta, os mesmos fills fantasmaApanhado mais tarde, no replay
3 de julho de 2026Fechado (4 de julho observado)Sexta-feira 15:45 contra um print de quinta-feiraSem sessão à vista a que juntar-se
28 nov 2025Fecho à 1:00 PMRebalanceamento às 15:45, último print às 12:59, slippage de leilãoRejeições depois das 13:00
Sábado normalFechadoBarras de ações com forward-fill, perp em diretoNomes congelados, perp em direto

Voltámos a correr o livro com um ficheiro de sessões por venue: horário regular, feriados, fechos antecipados, o fecho das 16:00 vs 13:00, e um contador de horas obsoletas em cada mark. Ordens contra uma sessão à vista fechada não executam no último preço. Rejeitam. O painel de risco não pode imprimir NEUTRAL se alguma perna da cobertura estiver obsoleta há mais de algumas horas. O teste unitário é feio e eu gosto dele: pegar numa sexta-feira normal, pintá-la como fechada, fazer assert de zero fills de COIN e de uma flag de obsoleto na cesta. E depois pintar as 13:00 como o fecho e fazer assert de que o job das 15:45 nem sequer olha para o modelo de leilão.

O Sharpe residual passou de 1.14 para 0.61. Não trato nenhum dos dois números como razão para negociar. Trato o fosso como uma confissão. Grande parte do que tínhamos chamado residual de cobertura era volatilidade de feriado da cripto, colhida em dias em que a perna curta de ações era um souvenir da sessão anterior. Os fins de semana faziam parte desse trabalho também, o que já descontávamos na conversa. Os feriados escondiam-se na reamostragem de dias úteis, que é um sítio bem mais embaraçoso para se esconder.

Ainda corremos o job de sexta-feira das 15:45. Agora lê um ficheiro com doze linhas para 2026, duas das quais ainda não aconteceram. O Dia de Ação de Graças é dia 26. No dia seguinte, o mercado à vista morre às 13:00. Pus esse fecho da 1:00 PM no calendário duas vezes, com dois nomes diferentes, porque não confio em mim próprio em novembro, e porque o pandas ainda chama alegremente a essa sexta-feira um dia útil se eu o deixar.

feriadosmulti-ativoscriptoaçõesbacktesting
← Todos os artigos