O bot TRPS (Tail Risk Protection Selling)#
O bot da TRPS é conceitualmente simples: a estratégia da página TRPS já é uma lista de regras com horários, e o código não faz mais que executá-la. A dificuldade não está na lógica de trading — uma centena de linhas — mas em tudo o que está em volta dela: reconciliação, tratamento dos erros da corretora, comportamento nos casos degenerados. Eu a descrevo como o bot a vive: uma máquina de estados que atravessa o dia de Nova York, em que cada transição tem precondições explícitas e cada falha tem um destino seguro (o Princípio 2 da página Execução). Os horários estão no fuso America/New_York, claro, e o calendário de feriados da bolsa é a primeira coisa que o bot consulta ao acordar: nos dias de fechamento não se transita de jeito nenhum, nos semiferiados (fechamentos antecipados) os horários do fim do dia se antecipam na mesma medida.
Os estados da jornada#
09:25 — Reconciliação. Antes de qualquer ação, o bot consulta a IBKR: posições abertas, ordens vivas, saldo e excess liquidity. Compara tudo com o journal (Princípio 4). O caso normal: em posição estão as puts 1DTE vendidas ontem à noite, que vencem hoje, sem ordens ativas. Qualquer outra configuração — uma posição que o journal não conhece, uma ordem órfã, um fill noturno inesperado — leva ao estado HALT: nenhuma operação, notificação imediata, espera-se o humano. A reconciliação verifica também a saúde do ambiente: dados de mercado frescos (um preço SPX mais velho que alguns segundos é um sintoma, não um dado), conexão ao Gateway, hora do sistema alinhada ao NTP. É o pre-flight check: dois minutos de paranoia que compram um dia de serenidade.
10:00 — Troca de guarda. Meia hora depois da abertura, o bot executa a passagem de bastão entre a proteção noturna e a diurna, com uma regra de ordem precisa: primeiro cancela, depois transmite. Cancela a guarda noturna ainda viva nos servidores (a seção dedicada, mais abaixo) e só depois transmite as ordens stop-limit sobre as puts em posição: gatilho em múltiplo do prêmio recebido (5-20x, do arquivo de configuração), limite 2-4 ticks acima do gatilho, validade diária (página TRPS: os stops diurnos só vivem durante o pregão). Nunca duas proteções sobrepostas na mesma posição: um stop diurno colocado com uma guarda ainda ativa é o melhor jeito de fechar duas vezes. Há uma exceção, e é deliberada: se a guarda de futuros disparou durante a noite, o bot não transmite nenhum stop automático — a posição já está coberta pelos futuros, e um stop por cima seria um hedge duplo — mas manda uma notificação crítica e espera a decisão humana. Deste instante em diante, de todo modo, vale o Princípio 1: as proteções residem nos servidores da IBKR e o bot poderia até morrer — o dia já está em segurança. A meia hora de espera desde a abertura não é preguiça: os primeiros trinta minutos de pregão são os mais barulhentos, e um stop colocado às 9:31 corre o risco de ser atingido pelo repique técnico em vez do movimento verdadeiro.
Dia — Monitoramento passivo. Entre as 10:00 e as 15:30 o bot não decide nada: observa. Um ciclo lento (a cada minuto é mais que suficiente) verifica conexão, posições e margem, registra um heartbeat no journal e manda o ping ao dead-man switch externo. Se um stop dispara, é a IBKR que o executa: o bot fica sabendo pelo evento de fill, atualiza o journal, me notifica com os detalhes (preço de execução contra gatilho: o dado que alimenta a estatística de slippage da página Tail risk) e — importante — não faz mais nada. Nenhuma reentrada, nenhuma “recuperação”: a regra da estratégia não prevê reaberturas, então o bot nem sequer as conhece.
15:30 — Seleção. Aqui vive a única lógica de trading de verdade. O bot lê o VIX corrente, calcula a IV alvo (o múltiplo configurado, ~1,5-2,5× VIX) e varre a cadeia das puts SPXW que vencem amanhã procurando o primeiro strike proeminente (múltiplos de 25) cujo prêmio de bid cai na faixa alvo (IV ~1,5-2,5× VIX, página TRPS). Para o sizing consulta o what-if (página Setup): o número de contratos é o mínimo entre o da alavancagem configurada (nocional ≤ 3-4× a conta) e o que a margem estressada permite com o colchão exigido. Cada número desta fase — VIX, strike candidato, prêmio, margem simulada — vai para o journal antes da execução: se algo der errado depois, saberei exatamente o que o bot achava que estava fazendo.
15:30-16:15 — A janela. Depois da seleção, abre-se a janela em que se vendem as 1DTE de amanhã (página TRPS). A execução é com ordens limit que partem do ask e cedem um tick a cada punhado de minutos (página TRPS: sobre 15 centavos, o spread é um terço do bruto). Se ao fim da janela sobrarem contratos não vendidos, paciência: vende-se o que se vendeu, o journal registra o miss, e a estatística me dirá se é acaso ou sintoma.
~16:00 — A montagem da guarda. É o quinto compromisso, o mais recente da lista. Assim que o fill da venda é confirmado, o bot arma a guarda noturna: uma ou mais ordens GTC que ficam vigiando nos servidores de corretora e bolsa enquanto ele dorme. O mecanismo tem um único gatilho e duas reações possíveis. O gatilho é um nível de preço no futuro ES, fixado — de forma ajustável — a meio caminho entre o preço do índice no momento da venda e o strike da put: enquanto o ES ficar acima, a noite está tranquila e nada acontece; se ele o perfurar, a guarda dispara. A reação é uma escolha de configuração entre duas modalidades alternativas (ou uma ou outra, nunca juntas): recomprar a put — encerrar o risco por completo — ou vender futuros para cobrir o delta dela — amortecê-lo sem encerrar. Explico as duas na seção a seguir, porque a guarda é a mudança mais importante da arquitetura desde o início do projeto; aqui basta o princípio: a proteção noturna nasce antes de o bot ir dormir e não depende de ele continuar ligado.
16:20 — Fechamento do dia. Verificação final posições-contra-expectativas (guarda incluída: a posição sem a sua ordem de guarda é uma anomalia que gera notificação), preparação das ordens stop de amanhã (prontas no journal, serão transmitidas meia hora depois da abertura), escrita do resumo, ping de encerramento, e o bot entra no estado noturno: dormente por design. A diferença em relação à primeira versão da arquitetura está toda aqui: o bot dorme como antes, mas as posições não passam mais a noite só com a proteção estrutural da alavancagem (páginas Tail risk e TRPS) — há uma guarda armada nos servidores, e o bot ligado ou desligado continua não mudando nada, que é exatamente como deve ser.
A máquina de estados vista como linha do tempo: dois compromissos críticos (a troca de guarda das 10:00, a janela das 16:00 com a montagem da guarda noturna), um longo monitoramento passivo no meio, e uma noite em que o bot dorme mas as ordens de guarda vigiam nos servidores de corretora e bolsa.
A guarda noturna#
Para entender por que ela existe, convém olhar o relógio. A venda é preenchida por volta das 16:00 de Nova York; o stop-limit diurno só chega aos servidores meia hora depois da abertura de amanhã. No meio há cerca de dezoito horas — de sexta a segunda, um fim de semana inteiro — em que a put está em posição e nenhum stop a defende, porque os stops sobre as opções SPX à noite simplesmente não operam. É a janela descoberta da página TRPS, aquela onde vive o gap noturno. Por anos a resposta foi uma só: a alavancagem, decidida de antemão, dimensionada para o desastre. A guarda noturna acrescenta uma segunda linha: ordens que vivem nos servidores de corretora e bolsa e disparam enquanto o bot — e eu — dormimos. Os futuros ES, ao contrário das opções, são negociados quase 24 horas no Globex (com um único buraco declarado: a manutenção entre 17:00 e 18:00 ET), e são eles que fazem de sentinela.
O gatilho. Tudo gira em torno de um único nível de preço no futuro ES, calculado uma única vez no momento da venda e válido pela noite inteira. Eu o fixo numa fração da distância entre o preço do índice e o strike vendido, e um exemplo torna a ideia concreta: se vendo a put com o índice a 6.800 e strike a 6.400 — 400 pontos de margem — e configuro a fração em 0,4, o gatilho cai em 6.800 − 0,4 × 400 = 6.640. Enquanto o ES ficar acima de 6.640 a guarda dorme; assim que ele o toca, dispara. A fração é o parâmetro que decide o caráter dela: quanto mais alta (na direção de 0,5) mais o gatilho fica perto do preço de partida, então a guarda intervém cedo e longe do strike — muitos alarmes falsos, mas pouco dano quando o alarme é verdadeiro; quanto mais baixa (na direção de 0,2) mais o gatilho escorrega em direção ao strike, então a guarda ignora os sustos passageiros e só age quando o movimento é sério — menos alarmes falsos, mas intervenção mais tardia e mais perto do ponto em que a put realmente começa a doer. O mesmíssimo gatilho vale para as duas modalidades: muda o que o bot faz quando ele dispara, não quando dispara.
Primeira modalidade: a recompra. No fill da venda, o bot coloca uma ordem de recompra GTC sobre a mesma put, ativa também fora do horário regular, condicionada ao nível de gatilho no futuro ES. Se o ES tocar o gatilho durante a noite, a corretora recompra a put e a história termina ali: posição fechada, gamma zerado, nada a administrar de manhã. O preço limite da ordem é deliberadamente brutal — modela quanto a opção pode valer no gatilho com a volatilidade estressada a cerca do dobro, não quanto valeria numa noite educada — porque o objetivo é sair, não otimizar o preço. O custo se paga de dois jeitos: nas noites realmente ruins recompra-se a um prêmio inflado pela explosão da IV (é o custo do seguro), e num alarme falso paga-se a viagem completa de ida e volta numa opção ilíquida de madrugada. A filosofia: um stop-loss noturno definitivo. Uma honestidade técnica precisa ser dita: a condição de preço é simulada pelos servidores da corretora, não é nativa da bolsa — um degrau de confiabilidade abaixo de um stop de verdade.
Segunda modalidade: o hedge com futuros. A ideia nasce de uma observação simples: à noite o book das opções SPX é um deserto, mas o dos futuros ES é dos mais profundos do planeta; em vez de recomprar a opção onde não há liquidez, vende-se o futuro onde ela existe em abundância. No fill da venda o bot coloca ordens stop sobre os futuros no mesmo nível de gatilho — e esses são stops nativos do CME, não condições simuladas. Se o gatilho dispara, o bot terá vendido futuros por um valor nocional igual ao delta que a put terá no gatilho (calculado com volatilidade estressada, porque numa noite de gatilho a IV não é a da véspera), multiplicado por um fator de cobertura ajustável. O tamanho se compõe misturando os dois formatos: a perna grossa no contrato E-mini cheio (mais líquido à noite e com custos por nocional de cerca de um terço), o resto de precisão nos Micro, que valem um décimo. A put, porém, continua aberta: no gatilho a posição combinada está perto da neutralidade, mas o hedge é estático — se a queda continuar, o delta da put corre em direção a um e os futuros continuam os mesmos. A guarda de futuros mitiga a cauda, não a elimina. E tem suas arestas, que listo sem atenuantes: um gap que salta além da banda de preço da ordem (alguns pontos de ES, o teto de slippage aceito) pode deixar o stop sem execução; as pernas E-mini e Micro são ordens independentes que podem ser preenchidas de forma desigual; os futuros executados absorvem margem overnight; e abaixo do tamanho de um Micro a guarda simplesmente não se monta. A filosofia: um amortecedor, não uma saída.
A escolha entre as duas. É um parâmetro de configuração, não um dogma, porque nenhuma das duas domina a outra em todos os cenários — e é por isso que o bot implementa ambas e me deixa decidir. A regra que uso é simples, e gira em torno de uma pergunta: quão líquido é o mercado em que quero estar quando o alarme disparar? Escolho a recompra quando quero encerrar o risco e dormir de verdade: paga o preço do pânico, mas de manhã não deixa nada para administrar. Funciona enquanto as posições são pequenas e o book das opções, mesmo numa noite feia, continua espesso o bastante para absorver a ordem de recompra. Passo ao hedge com futuros quando o tamanho cresce e esse pressuposto desaba: num crash noturno de verdade o book das opções evapora — recomprar fica caro ou impossível — enquanto o dos futuros ES aguenta. O hedge não fecha a posição, transforma-a em algo quase neutro para desmontar à luz do dia, mas é o único dos dois que tem uma contraparte confiável justamente quando ela é mais necessária. Em uma linha: recompra para as noites ruins mas ordeiras; futuros para as extremas e desordenadas, em que exigir liquidez das opções é ingenuidade e o único lugar sério para se estar é o book dos futuros.
A manhã seguinte. Se a noite passou lisa — a esmagadora maioria — a troca de guarda das 10:00 cancela as ordens noturnas e monta o stop diurno, como descrito acima. Se a recompra disparou, não há mais nada a proteger: registra-se, aprende-se, recomeça-se à noite. Se o hedge com futuros disparou, o bot para um passo antes da automação total: notificação crítica e decisão humana, porque as duas saídas limpas — fechar puts e futuros juntos na abertura, ou manter o hedge até o vencimento das 16:00 aceitando gamma e margem — dependem de como a manhã se apresenta, e é uma avaliação que não quis delegar.
A calibração, com transparência. A fração de gatilho certa não se adivinha na prancheta: mede-se. Por isso a guarda tem também um modo somente escuta, em que não coloca ordens, mas amostra o futuro ES pela noite inteira e registra a mínima tocada e a que fração da distância strike-fill ela corresponde. E é o modo em que o sistema roda agora: algumas semanas de noites medidas antes de armar as ordens, com o percurso previsto indo da recompra para o hedge com futuros. Parece-me o mínimo de seriedade exigível: um sistema que pode vender futuros às três da madrugada conquista a confiança uma noite medida de cada vez.
Falhar com elegância#
O valor de uma arquitetura se mede nos casos feios, então aqui estão eles, do mais frequente ao mais raro. O Gateway cai durante a janela das 15:30: o bot perde a conexão no meio dos envios; ao reiniciar (systemd + IBC fazem o seu trabalho em uns dois minutos) a primeira ação é sempre a reconciliação, que descobre quantos contratos efetivamente saíram e retoma — ou não retoma, se a janela já fechou: melhor uma noite com metade da size do que um envio duplicado. É por isso que cada ordem carrega um identificador único escrito no journal antes da transmissão: a idempotência não é capricho de engenheiro, é o que separa “tento de novo” de “dobro a aposta”. Fill parcial no stop: o stop-limit executa uma parte e o resto fica pendurado além do limite; o bot notifica e deixa a decisão comigo (runbook: em geral, fechamento manual a mercado do restante — a perda extra é o preço dos stop-limit descrito na página TRPS). Internet de casa cai às 15:25: o failover LTE (página Setup) deve cobrir; se não cobrir, a noite é perdida e as posições de ontem de todo modo expiraram às 16:00 — fail-static na sua forma mais pura: o sistema parado é um sistema sem posições novas, não um sistema em perigo. O cenário mais temido: o gap noturno da página Tail risk. Por anos a resposta honesta era “não existe código capaz de lidar com isso”: hoje existe a guarda noturna, mas é preciso dizer com a mesma honestidade o que ela pode e não pode fazer. Pode recomprar a put ou vender futuros enquanto o mercado cai de forma contínua; não pode nada contra um salto instantâneo que reabre além do gatilho e além da banda — a ordem condicionada da recompra é uma simulação dos servidores da corretora, o stop de futuros não executa além do seu limite de preço, e o hedge, quando executa, é estático. A defesa de última instância continua a de sempre: a alavancagem, decidida no arquivo de configuração muito antes (página Ergodicidade), e eventualmente o humano com os futuros ES pelo celular (páginas Futuros e Execução) — que hoje é o fallback do fallback, não o plano. A arquitetura não protege da cauda: protege a estratégia que protege da cauda, e a guarda noturna encurta a lista das noites em que esta frase precisa fazer todo o trabalho sozinha.
Configuração, testes, vida real#
Uma palavra sobre as notificações, que viajam todas pelo canal de mensagens da página Setup, porque o desenho delas é metade da confiabilidade percebida do sistema. Três níveis: o nível info (venda executada, resumo do fim do dia, pings regulares) chega como notificação sem som e fica no journal; o nível warning (nova tentativa por BigMarginChange, fill a preço pior que o esperado) gera uma mensagem push que posso ignorar por horas; o nível critical (falha na reconciliação, estado HALT, stop executado, dead-man disparado) gera uma notificação insistente que exige confirmação. E o canal também trabalha no sentido contrário: de qualquer ponto do dia posso pedir o estado para ver posições e ordens vivas, ou dar o comando de parada para deter a máquina de estados — o bot cancela as ordens pendentes não protetivas, congela toda venda nova e deixa intactos os stops nos servidores da corretora. O caso de uso real do kill switch não é o filme-catástrofe, é a banalidade: uma notificação que não bate, uma dúvida sobre a configuração recém-alterada, e prefiro uma noite sem prêmios a uma noite com a dúvida. A calibragem importa mais que a tecnologia: um sistema que grita por tudo treina o operador a ignorá-lo — é a alert fatigue, e um alarme ignorado é pior que um alarme ausente. A regra que uso: se nos últimos três meses um tipo de notificação nunca mudou o meu comportamento, ele desce de nível.
Todos os parâmetros da página TRPS — múltiplo de IV, faixa de prêmio, alavancagem, múltiplo de stop — vivem num arquivo de configuração versionado: cada mudança é um commit com data e motivação, nunca um número retocado no improviso. É a versão informática da regra contra a otimização sorrateira (página TRPS): mudar os parâmetros continua possível, mas custa atrito suficiente para ter de ser uma decisão. O teste segue o percurso da página Execução: meses de conta paper atravessando pelo menos um episódio de volatilidade de verdade, com atenção especial aos dias estranhos — semiferiados, dias de roll dos futuros, pregões com dados macro às 8:30 — porque é ali que os bugs se escondem. E uma nota final de humildade operacional: depois de mais de um ano de operação, a quase totalidade das intervenções manuais que fiz diz respeito à infraestrutura (Gateway, rede, atualizações), não ao trading. O funcionário júnior executa muito bem; é o escritório que de vez em quando perde os parafusos.